From 447a175f89776723aada0420fcb220e266b726fa Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Thu, 9 Jan 2025 02:24:43 +0900 Subject: [PATCH 01/30] first commit --- .gitattributes | 3 + .gitignore | 37 +++ build.gradle | 28 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 252 ++++++++++++++++++ gradlew.bat | 94 +++++++ settings.gradle | 1 + .../cinema_week1/CinemaWeek1Application.java | 13 + src/main/resources/application.properties | 1 + .../CinemaWeek1ApplicationTests.java | 13 + 11 files changed, 449 insertions(+) create mode 100644 .gitattributes 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 100644 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/com/example/cinema_week1/CinemaWeek1Application.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/com/example/cinema_week1/CinemaWeek1ApplicationTests.java diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..8af972cde --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..c2065bc26 --- /dev/null +++ b/.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/build.gradle b/build.gradle new file mode 100644 index 000000000..02ce57b00 --- /dev/null +++ b/build.gradle @@ -0,0 +1,28 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.4.1' + id 'io.spring.dependency-management' version '1.1.7' +} + +group = 'com.example' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a4b76b9530d66f5e68d973ea569d8e19de379189 GIT binary patch literal 43583 zcma&N1CXTcmMvW9vTb(Rwr$&4wr$(C?dmSu>@vG-+vuvg^_??!{yS%8zW-#zn-LkA z5&1^$^{lnmUON?}LBF8_K|(?T0Ra(xUH{($5eN!MR#ZihR#HxkUPe+_R8Cn`RRs(P z_^*#_XlXmGv7!4;*Y%p4nw?{bNp@UZHv1?Um8r6)Fei3p@ClJn0ECfg1hkeuUU@Or zDaPa;U3fE=3L}DooL;8f;P0ipPt0Z~9P0)lbStMS)ag54=uL9ia-Lm3nh|@(Y?B`; zx_#arJIpXH!U{fbCbI^17}6Ri*H<>OLR%c|^mh8+)*h~K8Z!9)DPf zR2h?lbDZQ`p9P;&DQ4F0sur@TMa!Y}S8irn(%d-gi0*WxxCSk*A?3lGh=gcYN?FGl z7D=Js!i~0=u3rox^eO3i@$0=n{K1lPNU zwmfjRVmLOCRfe=seV&P*1Iq=^i`502keY8Uy-WNPwVNNtJFx?IwAyRPZo2Wo1+S(xF37LJZ~%i)kpFQ3Fw=mXfd@>%+)RpYQLnr}B~~zoof(JVm^^&f zxKV^+3D3$A1G;qh4gPVjhrC8e(VYUHv#dy^)(RoUFM?o%W-EHxufuWf(l*@-l+7vt z=l`qmR56K~F|v<^Pd*p~1_y^P0P^aPC##d8+HqX4IR1gu+7w#~TBFphJxF)T$2WEa zxa?H&6=Qe7d(#tha?_1uQys2KtHQ{)Qco)qwGjrdNL7thd^G5i8Os)CHqc>iOidS} z%nFEDdm=GXBw=yXe1W-ShHHFb?Cc70+$W~z_+}nAoHFYI1MV1wZegw*0y^tC*s%3h zhD3tN8b=Gv&rj}!SUM6|ajSPp*58KR7MPpI{oAJCtY~JECm)*m_x>AZEu>DFgUcby z1Qaw8lU4jZpQ_$;*7RME+gq1KySGG#Wql>aL~k9tLrSO()LWn*q&YxHEuzmwd1?aAtI zBJ>P=&$=l1efe1CDU;`Fd+_;&wI07?V0aAIgc(!{a z0Jg6Y=inXc3^n!U0Atk`iCFIQooHqcWhO(qrieUOW8X(x?(RD}iYDLMjSwffH2~tB z)oDgNBLB^AJBM1M^c5HdRx6fBfka`(LD-qrlh5jqH~);#nw|iyp)()xVYak3;Ybik z0j`(+69aK*B>)e_p%=wu8XC&9e{AO4c~O1U`5X9}?0mrd*m$_EUek{R?DNSh(=br# z#Q61gBzEpmy`$pA*6!87 zSDD+=@fTY7<4A?GLqpA?Pb2z$pbCc4B4zL{BeZ?F-8`s$?>*lXXtn*NC61>|*w7J* z$?!iB{6R-0=KFmyp1nnEmLsA-H0a6l+1uaH^g%c(p{iT&YFrbQ$&PRb8Up#X3@Zsk zD^^&LK~111%cqlP%!_gFNa^dTYT?rhkGl}5=fL{a`UViaXWI$k-UcHJwmaH1s=S$4 z%4)PdWJX;hh5UoK?6aWoyLxX&NhNRqKam7tcOkLh{%j3K^4Mgx1@i|Pi&}<^5>hs5 zm8?uOS>%)NzT(%PjVPGa?X%`N2TQCKbeH2l;cTnHiHppPSJ<7y-yEIiC!P*ikl&!B z%+?>VttCOQM@ShFguHVjxX^?mHX^hSaO_;pnyh^v9EumqSZTi+#f&_Vaija0Q-e*| z7ulQj6Fs*bbmsWp{`auM04gGwsYYdNNZcg|ph0OgD>7O}Asn7^Z=eI>`$2*v78;sj-}oMoEj&@)9+ycEOo92xSyY344^ z11Hb8^kdOvbf^GNAK++bYioknrpdN>+u8R?JxG=!2Kd9r=YWCOJYXYuM0cOq^FhEd zBg2puKy__7VT3-r*dG4c62Wgxi52EMCQ`bKgf*#*ou(D4-ZN$+mg&7$u!! z-^+Z%;-3IDwqZ|K=ah85OLwkO zKxNBh+4QHh)u9D?MFtpbl)us}9+V!D%w9jfAMYEb>%$A;u)rrI zuBudh;5PN}_6J_}l55P3l_)&RMlH{m!)ai-i$g)&*M`eN$XQMw{v^r@-125^RRCF0 z^2>|DxhQw(mtNEI2Kj(;KblC7x=JlK$@78`O~>V!`|1Lm-^JR$-5pUANAnb(5}B}JGjBsliK4& zk6y(;$e&h)lh2)L=bvZKbvh@>vLlreBdH8No2>$#%_Wp1U0N7Ank!6$dFSi#xzh|( zRi{Uw%-4W!{IXZ)fWx@XX6;&(m_F%c6~X8hx=BN1&q}*( zoaNjWabE{oUPb!Bt$eyd#$5j9rItB-h*5JiNi(v^e|XKAj*8(k<5-2$&ZBR5fF|JA z9&m4fbzNQnAU}r8ab>fFV%J0z5awe#UZ|bz?Ur)U9bCIKWEzi2%A+5CLqh?}K4JHi z4vtM;+uPsVz{Lfr;78W78gC;z*yTch~4YkLr&m-7%-xc ztw6Mh2d>_iO*$Rd8(-Cr1_V8EO1f*^@wRoSozS) zy1UoC@pruAaC8Z_7~_w4Q6n*&B0AjOmMWa;sIav&gu z|J5&|{=a@vR!~k-OjKEgPFCzcJ>#A1uL&7xTDn;{XBdeM}V=l3B8fE1--DHjSaxoSjNKEM9|U9#m2<3>n{Iuo`r3UZp;>GkT2YBNAh|b z^jTq-hJp(ebZh#Lk8hVBP%qXwv-@vbvoREX$TqRGTgEi$%_F9tZES@z8Bx}$#5eeG zk^UsLBH{bc2VBW)*EdS({yw=?qmevwi?BL6*=12k9zM5gJv1>y#ML4!)iiPzVaH9% zgSImetD@dam~e>{LvVh!phhzpW+iFvWpGT#CVE5TQ40n%F|p(sP5mXxna+Ev7PDwA zamaV4m*^~*xV+&p;W749xhb_X=$|LD;FHuB&JL5?*Y2-oIT(wYY2;73<^#46S~Gx| z^cez%V7x$81}UWqS13Gz80379Rj;6~WdiXWOSsdmzY39L;Hg3MH43o*y8ibNBBH`(av4|u;YPq%{R;IuYow<+GEsf@R?=@tT@!}?#>zIIn0CoyV!hq3mw zHj>OOjfJM3F{RG#6ujzo?y32m^tgSXf@v=J$ELdJ+=5j|=F-~hP$G&}tDZsZE?5rX ztGj`!S>)CFmdkccxM9eGIcGnS2AfK#gXwj%esuIBNJQP1WV~b~+D7PJTmWGTSDrR` zEAu4B8l>NPuhsk5a`rReSya2nfV1EK01+G!x8aBdTs3Io$u5!6n6KX%uv@DxAp3F@{4UYg4SWJtQ-W~0MDb|j-$lwVn znAm*Pl!?Ps&3wO=R115RWKb*JKoexo*)uhhHBncEDMSVa_PyA>k{Zm2(wMQ(5NM3# z)jkza|GoWEQo4^s*wE(gHz?Xsg4`}HUAcs42cM1-qq_=+=!Gk^y710j=66(cSWqUe zklbm8+zB_syQv5A2rj!Vbw8;|$@C!vfNmNV!yJIWDQ>{+2x zKjuFX`~~HKG~^6h5FntRpnnHt=D&rq0>IJ9#F0eM)Y-)GpRjiN7gkA8wvnG#K=q{q z9dBn8_~wm4J<3J_vl|9H{7q6u2A!cW{bp#r*-f{gOV^e=8S{nc1DxMHFwuM$;aVI^ zz6A*}m8N-&x8;aunp1w7_vtB*pa+OYBw=TMc6QK=mbA-|Cf* zvyh8D4LRJImooUaSb7t*fVfih<97Gf@VE0|z>NcBwBQze);Rh!k3K_sfunToZY;f2 z^HmC4KjHRVg+eKYj;PRN^|E0>Gj_zagfRbrki68I^#~6-HaHg3BUW%+clM1xQEdPYt_g<2K+z!$>*$9nQ>; zf9Bei{?zY^-e{q_*|W#2rJG`2fy@{%6u0i_VEWTq$*(ZN37|8lFFFt)nCG({r!q#9 z5VK_kkSJ3?zOH)OezMT{!YkCuSSn!K#-Rhl$uUM(bq*jY? zi1xbMVthJ`E>d>(f3)~fozjg^@eheMF6<)I`oeJYx4*+M&%c9VArn(OM-wp%M<-`x z7sLP1&3^%Nld9Dhm@$3f2}87!quhI@nwd@3~fZl_3LYW-B?Ia>ui`ELg z&Qfe!7m6ze=mZ`Ia9$z|ARSw|IdMpooY4YiPN8K z4B(ts3p%2i(Td=tgEHX z0UQ_>URBtG+-?0E;E7Ld^dyZ;jjw0}XZ(}-QzC6+NN=40oDb2^v!L1g9xRvE#@IBR zO!b-2N7wVfLV;mhEaXQ9XAU+>=XVA6f&T4Z-@AX!leJ8obP^P^wP0aICND?~w&NykJ#54x3_@r7IDMdRNy4Hh;h*!u(Ol(#0bJdwEo$5437-UBjQ+j=Ic>Q2z` zJNDf0yO6@mr6y1#n3)s(W|$iE_i8r@Gd@!DWDqZ7J&~gAm1#~maIGJ1sls^gxL9LLG_NhU!pTGty!TbhzQnu)I*S^54U6Yu%ZeCg`R>Q zhBv$n5j0v%O_j{QYWG!R9W?5_b&67KB$t}&e2LdMvd(PxN6Ir!H4>PNlerpBL>Zvyy!yw z-SOo8caEpDt(}|gKPBd$qND5#a5nju^O>V&;f890?yEOfkSG^HQVmEbM3Ugzu+UtH zC(INPDdraBN?P%kE;*Ae%Wto&sgw(crfZ#Qy(<4nk;S|hD3j{IQRI6Yq|f^basLY; z-HB&Je%Gg}Jt@={_C{L$!RM;$$|iD6vu#3w?v?*;&()uB|I-XqEKqZPS!reW9JkLewLb!70T7n`i!gNtb1%vN- zySZj{8-1>6E%H&=V}LM#xmt`J3XQoaD|@XygXjdZ1+P77-=;=eYpoEQ01B@L*a(uW zrZeZz?HJsw_4g0vhUgkg@VF8<-X$B8pOqCuWAl28uB|@r`19DTUQQsb^pfqB6QtiT z*`_UZ`fT}vtUY#%sq2{rchyfu*pCg;uec2$-$N_xgjZcoumE5vSI{+s@iLWoz^Mf; zuI8kDP{!XY6OP~q5}%1&L}CtfH^N<3o4L@J@zg1-mt{9L`s^z$Vgb|mr{@WiwAqKg zp#t-lhrU>F8o0s1q_9y`gQNf~Vb!F%70f}$>i7o4ho$`uciNf=xgJ>&!gSt0g;M>*x4-`U)ysFW&Vs^Vk6m%?iuWU+o&m(2Jm26Y(3%TL; zA7T)BP{WS!&xmxNw%J=$MPfn(9*^*TV;$JwRy8Zl*yUZi8jWYF>==j~&S|Xinsb%c z2?B+kpet*muEW7@AzjBA^wAJBY8i|#C{WtO_or&Nj2{=6JTTX05}|H>N2B|Wf!*3_ z7hW*j6p3TvpghEc6-wufFiY!%-GvOx*bZrhZu+7?iSrZL5q9}igiF^*R3%DE4aCHZ zqu>xS8LkW+Auv%z-<1Xs92u23R$nk@Pk}MU5!gT|c7vGlEA%G^2th&Q*zfg%-D^=f z&J_}jskj|Q;73NP4<4k*Y%pXPU2Thoqr+5uH1yEYM|VtBPW6lXaetokD0u z9qVek6Q&wk)tFbQ8(^HGf3Wp16gKmr>G;#G(HRBx?F`9AIRboK+;OfHaLJ(P>IP0w zyTbTkx_THEOs%Q&aPrxbZrJlio+hCC_HK<4%f3ZoSAyG7Dn`=X=&h@m*|UYO-4Hq0 z-Bq&+Ie!S##4A6OGoC~>ZW`Y5J)*ouaFl_e9GA*VSL!O_@xGiBw!AF}1{tB)z(w%c zS1Hmrb9OC8>0a_$BzeiN?rkPLc9%&;1CZW*4}CDDNr2gcl_3z+WC15&H1Zc2{o~i) z)LLW=WQ{?ricmC`G1GfJ0Yp4Dy~Ba;j6ZV4r{8xRs`13{dD!xXmr^Aga|C=iSmor% z8hi|pTXH)5Yf&v~exp3o+sY4B^^b*eYkkCYl*T{*=-0HniSA_1F53eCb{x~1k3*`W zr~};p1A`k{1DV9=UPnLDgz{aJH=-LQo<5%+Em!DNN252xwIf*wF_zS^!(XSm(9eoj z=*dXG&n0>)_)N5oc6v!>-bd(2ragD8O=M|wGW z!xJQS<)u70m&6OmrF0WSsr@I%T*c#Qo#Ha4d3COcX+9}hM5!7JIGF>7<~C(Ear^Sn zm^ZFkV6~Ula6+8S?oOROOA6$C&q&dp`>oR-2Ym3(HT@O7Sd5c~+kjrmM)YmgPH*tL zX+znN>`tv;5eOfX?h{AuX^LK~V#gPCu=)Tigtq9&?7Xh$qN|%A$?V*v=&-2F$zTUv z`C#WyIrChS5|Kgm_GeudCFf;)!WH7FI60j^0o#65o6`w*S7R@)88n$1nrgU(oU0M9 zx+EuMkC>(4j1;m6NoGqEkpJYJ?vc|B zOlwT3t&UgL!pX_P*6g36`ZXQ; z9~Cv}ANFnJGp(;ZhS(@FT;3e)0)Kp;h^x;$*xZn*k0U6-&FwI=uOGaODdrsp-!K$Ac32^c{+FhI-HkYd5v=`PGsg%6I`4d9Jy)uW0y%) zm&j^9WBAp*P8#kGJUhB!L?a%h$hJgQrx!6KCB_TRo%9{t0J7KW8!o1B!NC)VGLM5! zpZy5Jc{`r{1e(jd%jsG7k%I+m#CGS*BPA65ZVW~fLYw0dA-H_}O zrkGFL&P1PG9p2(%QiEWm6x;U-U&I#;Em$nx-_I^wtgw3xUPVVu zqSuKnx&dIT-XT+T10p;yjo1Y)z(x1fb8Dzfn8e yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..e2847c820 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 000000000..f5feea6d6 --- /dev/null +++ b/gradlew @@ -0,0 +1,252 @@ +#!/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 +' "$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, 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/gradlew.bat b/gradlew.bat new file mode 100644 index 000000000..9d21a2183 --- /dev/null +++ b/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/settings.gradle b/settings.gradle new file mode 100644 index 000000000..e4c204166 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'cinema_week1' diff --git a/src/main/java/com/example/cinema_week1/CinemaWeek1Application.java b/src/main/java/com/example/cinema_week1/CinemaWeek1Application.java new file mode 100644 index 000000000..667dbed3c --- /dev/null +++ b/src/main/java/com/example/cinema_week1/CinemaWeek1Application.java @@ -0,0 +1,13 @@ +package com.example.cinema_week1; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CinemaWeek1Application { + + public static void main(String[] args) { + SpringApplication.run(CinemaWeek1Application.class, args); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 000000000..7e2e2ec1c --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.application.name=cinema_week1 diff --git a/src/test/java/com/example/cinema_week1/CinemaWeek1ApplicationTests.java b/src/test/java/com/example/cinema_week1/CinemaWeek1ApplicationTests.java new file mode 100644 index 000000000..84574e895 --- /dev/null +++ b/src/test/java/com/example/cinema_week1/CinemaWeek1ApplicationTests.java @@ -0,0 +1,13 @@ +package com.example.cinema_week1; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CinemaWeek1ApplicationTests { + + @Test + void contextLoads() { + } + +} From bdce80f2c7e464c297585f8701510d47ea6caf7b Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Thu, 9 Jan 2025 11:36:28 +0900 Subject: [PATCH 02/30] refactor: apply multi-module --- build.gradle | 39 +++++++++++++++---- module-api/build.gradle | 14 +++++++ module-api/src/main/java/hellojpa/Main.java | 7 ++++ module-common/build.gradle | 15 +++++++ .../src/main/java/hellojpa/Main.java | 7 ++++ module-movie/build.gradle | 20 ++++++++++ module-movie/src/main/java/hellojpa/Main.java | 7 ++++ module-screening/build.gradle | 18 +++++++++ .../src/main/java/hellojpa/Main.java | 7 ++++ module-theater/build.gradle | 18 +++++++++ .../src/main/java/hellojpa/Main.java | 7 ++++ settings.gradle | 6 +++ .../cinema_week1/CinemaWeek1Application.java | 13 ------- src/main/resources/application.properties | 1 - .../CinemaWeek1ApplicationTests.java | 13 ------- 15 files changed, 157 insertions(+), 35 deletions(-) create mode 100644 module-api/build.gradle create mode 100644 module-api/src/main/java/hellojpa/Main.java create mode 100644 module-common/build.gradle create mode 100644 module-common/src/main/java/hellojpa/Main.java create mode 100644 module-movie/build.gradle create mode 100644 module-movie/src/main/java/hellojpa/Main.java create mode 100644 module-screening/build.gradle create mode 100644 module-screening/src/main/java/hellojpa/Main.java create mode 100644 module-theater/build.gradle create mode 100644 module-theater/src/main/java/hellojpa/Main.java delete mode 100644 src/main/java/com/example/cinema_week1/CinemaWeek1Application.java delete mode 100644 src/main/resources/application.properties delete mode 100644 src/test/java/com/example/cinema_week1/CinemaWeek1ApplicationTests.java diff --git a/build.gradle b/build.gradle index 02ce57b00..4f28c1a04 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,8 @@ plugins { id 'io.spring.dependency-management' version '1.1.7' } +bootJar.enabled = false // 루트 모듈의 .jar 생성 X + group = 'com.example' version = '0.0.1-SNAPSHOT' @@ -17,12 +19,33 @@ repositories { mavenCentral() } -dependencies { - implementation 'org.springframework.boot:spring-boot-starter' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher' -} +subprojects { // 모든 하위 모듈들에 적용 + group 'com.example' + version '0.0.1-SNAPSHOT' + sourceCompatibility = '17' -tasks.named('test') { - useJUnitPlatform() -} + apply plugin: 'java' + apply plugin: 'java-library' + apply plugin: 'org.springframework.boot' + apply plugin: 'io.spring.dependency-management' + + configurations { + compileOnly { + extendsFrom annotationProcessor + } + } + + repositories { + mavenCentral() + } + + dependencies { // 모든 하위 모듈에 추가 + implementation 'org.springframework.boot:spring-boot-starter' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + } + + tasks.named('test') { + useJUnitPlatform() + } +} \ No newline at end of file diff --git a/module-api/build.gradle b/module-api/build.gradle new file mode 100644 index 000000000..e7eb1ce03 --- /dev/null +++ b/module-api/build.gradle @@ -0,0 +1,14 @@ +dependencies { + // 모듈 의존성 + implementation project(':module-common') + implementation project(':module-theater') + implementation project(':module-screening') + implementation project(':module-movie') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + + testImplementation platform('org.junit:junit-bom:5.9.1') + testImplementation 'org.junit.jupiter:junit-jupiter' +} \ No newline at end of file diff --git a/module-api/src/main/java/hellojpa/Main.java b/module-api/src/main/java/hellojpa/Main.java new file mode 100644 index 000000000..f31610dc8 --- /dev/null +++ b/module-api/src/main/java/hellojpa/Main.java @@ -0,0 +1,7 @@ +package hellojpa; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file diff --git a/module-common/build.gradle b/module-common/build.gradle new file mode 100644 index 000000000..518170264 --- /dev/null +++ b/module-common/build.gradle @@ -0,0 +1,15 @@ +bootJar.enabled = false +jar.enabled = true + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + runtimeOnly 'com.mysql:mysql-connector-j' + + testImplementation platform('org.junit:junit-bom:5.9.1') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa' +} \ No newline at end of file diff --git a/module-common/src/main/java/hellojpa/Main.java b/module-common/src/main/java/hellojpa/Main.java new file mode 100644 index 000000000..f31610dc8 --- /dev/null +++ b/module-common/src/main/java/hellojpa/Main.java @@ -0,0 +1,7 @@ +package hellojpa; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file diff --git a/module-movie/build.gradle b/module-movie/build.gradle new file mode 100644 index 000000000..a725c696a --- /dev/null +++ b/module-movie/build.gradle @@ -0,0 +1,20 @@ +bootJar.enabled = false +jar.enabled = true + +dependencies { + // 모듈 의존성 + implementation project(':module-common') + implementation project(':module-theater') + implementation project(':module-screening') + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + runtimeOnly 'com.mysql:mysql-connector-j' + + testImplementation platform('org.junit:junit-bom:5.9.1') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa' +} \ No newline at end of file diff --git a/module-movie/src/main/java/hellojpa/Main.java b/module-movie/src/main/java/hellojpa/Main.java new file mode 100644 index 000000000..f31610dc8 --- /dev/null +++ b/module-movie/src/main/java/hellojpa/Main.java @@ -0,0 +1,7 @@ +package hellojpa; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file diff --git a/module-screening/build.gradle b/module-screening/build.gradle new file mode 100644 index 000000000..4639c43c2 --- /dev/null +++ b/module-screening/build.gradle @@ -0,0 +1,18 @@ +bootJar.enabled = false +jar.enabled = true + +dependencies { + // 공통 모듈 의존성 + implementation project(':module-common') + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + runtimeOnly 'com.mysql:mysql-connector-j' + + testImplementation platform('org.junit:junit-bom:5.9.1') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa' +} \ No newline at end of file diff --git a/module-screening/src/main/java/hellojpa/Main.java b/module-screening/src/main/java/hellojpa/Main.java new file mode 100644 index 000000000..f31610dc8 --- /dev/null +++ b/module-screening/src/main/java/hellojpa/Main.java @@ -0,0 +1,7 @@ +package hellojpa; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file diff --git a/module-theater/build.gradle b/module-theater/build.gradle new file mode 100644 index 000000000..4639c43c2 --- /dev/null +++ b/module-theater/build.gradle @@ -0,0 +1,18 @@ +bootJar.enabled = false +jar.enabled = true + +dependencies { + // 공통 모듈 의존성 + implementation project(':module-common') + + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + runtimeOnly 'com.mysql:mysql-connector-j' + + testImplementation platform('org.junit:junit-bom:5.9.1') + testImplementation 'org.junit.jupiter:junit-jupiter' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa' +} \ No newline at end of file diff --git a/module-theater/src/main/java/hellojpa/Main.java b/module-theater/src/main/java/hellojpa/Main.java new file mode 100644 index 000000000..f31610dc8 --- /dev/null +++ b/module-theater/src/main/java/hellojpa/Main.java @@ -0,0 +1,7 @@ +package hellojpa; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index e4c204166..4fa9445c5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,7 @@ rootProject.name = 'cinema_week1' +include 'module-movie' +include 'module-theater' +include 'module-screening' +include 'module-common' +include 'module-api' + diff --git a/src/main/java/com/example/cinema_week1/CinemaWeek1Application.java b/src/main/java/com/example/cinema_week1/CinemaWeek1Application.java deleted file mode 100644 index 667dbed3c..000000000 --- a/src/main/java/com/example/cinema_week1/CinemaWeek1Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.cinema_week1; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class CinemaWeek1Application { - - public static void main(String[] args) { - SpringApplication.run(CinemaWeek1Application.class, args); - } - -} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 7e2e2ec1c..000000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.application.name=cinema_week1 diff --git a/src/test/java/com/example/cinema_week1/CinemaWeek1ApplicationTests.java b/src/test/java/com/example/cinema_week1/CinemaWeek1ApplicationTests.java deleted file mode 100644 index 84574e895..000000000 --- a/src/test/java/com/example/cinema_week1/CinemaWeek1ApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.cinema_week1; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class CinemaWeek1ApplicationTests { - - @Test - void contextLoads() { - } - -} From 7da42e35ec0d476502b25a56992ad45a9c494013 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Thu, 9 Jan 2025 11:39:04 +0900 Subject: [PATCH 03/30] chore: add docker-compose.yml and ddl.sql --- docker-compose.yml | 23 +++++++++++++++++++++++ init-scripts/ddl.sql | 0 2 files changed, 23 insertions(+) create mode 100644 docker-compose.yml create mode 100644 init-scripts/ddl.sql diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..ee1a1a20a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,23 @@ +services: + mysql: + image: mysql:8.0 + container_name: skillUp-redis-db + environment: + MYSQL_ROOT_PASSWORD: root1234 # MySQL 루트 비밀번호 설정 + MYSQL_DATABASE: redisdb # 기본 데이터베이스 이름 + MYSQL_USER: user # MySQL 사용자 이름 + MYSQL_PASSWORD: user1234 # MySQL 사용자 비밀번호 + ports: + - "3307:3306" + volumes: + - ./init-scripts:/docker-entrypoint-initdb.d # init-scripts 폴더를 MySQL 컨테이너의 초기화 스크립트 디렉토리로 매핑 + networks: + - my-network + +networks: + my-network: + driver: bridge + +volumes: + mysql-data: + driver: local \ No newline at end of file diff --git a/init-scripts/ddl.sql b/init-scripts/ddl.sql new file mode 100644 index 000000000..e69de29bb From 2d380824b00bc4f21a2aff0ba8f3c760b2a98dca Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Thu, 9 Jan 2025 11:39:47 +0900 Subject: [PATCH 04/30] chore: add application.yml --- module-api/src/main/resources/application.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 module-api/src/main/resources/application.yml diff --git a/module-api/src/main/resources/application.yml b/module-api/src/main/resources/application.yml new file mode 100644 index 000000000..756738de7 --- /dev/null +++ b/module-api/src/main/resources/application.yml @@ -0,0 +1,13 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3307/redisdb + username: user + password: user1234 + driver-class-name: com.mysql.cj.jdbc.Driver + + jpa: + hibernate: + ddl-auto: update + properties: + show_sql: true + format_sql: true \ No newline at end of file From f605ac52ada983c9749646abe66486226033df0e Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Thu, 9 Jan 2025 21:02:33 +0900 Subject: [PATCH 05/30] chore: remove unused module dependencies --- module-movie/build.gradle | 2 -- 1 file changed, 2 deletions(-) diff --git a/module-movie/build.gradle b/module-movie/build.gradle index a725c696a..162d32f35 100644 --- a/module-movie/build.gradle +++ b/module-movie/build.gradle @@ -4,8 +4,6 @@ jar.enabled = true dependencies { // 모듈 의존성 implementation project(':module-common') - implementation project(':module-theater') - implementation project(':module-screening') implementation 'org.springframework.boot:spring-boot-starter-data-jpa' compileOnly 'org.projectlombok:lombok' From a8852ed3e83b082cb092d4d84dbbe359db3bf3c0 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Thu, 9 Jan 2025 21:03:45 +0900 Subject: [PATCH 06/30] feat: add module dependencies(for entity) --- module-screening/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/module-screening/build.gradle b/module-screening/build.gradle index 4639c43c2..56b94a970 100644 --- a/module-screening/build.gradle +++ b/module-screening/build.gradle @@ -4,6 +4,8 @@ jar.enabled = true dependencies { // 공통 모듈 의존성 implementation project(':module-common') + implementation project(':module-movie') + implementation project(':module-theater') implementation 'org.springframework.boot:spring-boot-starter-data-jpa' compileOnly 'org.projectlombok:lombok' From 389b0a5617cf6b4132070ed5b84b69b715942735 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 01:45:13 +0900 Subject: [PATCH 07/30] feat: add movie related entities(module-movie) --- .../src/main/java/hellojpa/domain/Genre.java | 17 ++++++++ .../src/main/java/hellojpa/domain/Movie.java | 40 +++++++++++++++++++ .../java/hellojpa/domain/VideoRating.java | 16 ++++++++ 3 files changed, 73 insertions(+) create mode 100644 module-movie/src/main/java/hellojpa/domain/Genre.java create mode 100644 module-movie/src/main/java/hellojpa/domain/Movie.java create mode 100644 module-movie/src/main/java/hellojpa/domain/VideoRating.java diff --git a/module-movie/src/main/java/hellojpa/domain/Genre.java b/module-movie/src/main/java/hellojpa/domain/Genre.java new file mode 100644 index 000000000..d211df072 --- /dev/null +++ b/module-movie/src/main/java/hellojpa/domain/Genre.java @@ -0,0 +1,17 @@ +package hellojpa.domain; + +import jakarta.persistence.*; +import lombok.Getter; + +@Entity +@Getter +public class Genre { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "genre_id") + private Long id; + + @Column(nullable = false, unique = true) + private String name; // 장르 이름 +} diff --git a/module-movie/src/main/java/hellojpa/domain/Movie.java b/module-movie/src/main/java/hellojpa/domain/Movie.java new file mode 100644 index 000000000..3c523c40d --- /dev/null +++ b/module-movie/src/main/java/hellojpa/domain/Movie.java @@ -0,0 +1,40 @@ +package hellojpa.domain; + +import jakarta.persistence.*; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.time.LocalDate; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class Movie { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "movie_id") + private Long id; + + @Column(nullable = false, unique = true) + private String title; // 영화 제목 + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private VideoRating rating; // 영상물 등급 + + @Column(nullable = false) + private LocalDate releaseDate; // 영화 개봉일 + + @Column(nullable = false) + private String thumbnail; // 영화 썸네일 + + @Column(nullable = false) + private int runningTime; // 영화 러닝타임 + + @OneToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "genre_id", nullable = false) + private Genre genre; // 영화 장르 +} diff --git a/module-movie/src/main/java/hellojpa/domain/VideoRating.java b/module-movie/src/main/java/hellojpa/domain/VideoRating.java new file mode 100644 index 000000000..a9b1c5aa1 --- /dev/null +++ b/module-movie/src/main/java/hellojpa/domain/VideoRating.java @@ -0,0 +1,16 @@ +package hellojpa.domain; + +public enum VideoRating { + + ALL("전체관람가"), + AGE_12("12세이상관람가"), + AGE_15("15세이상관람가"), + AGE_19("청소년관람불가"), + RESTRICTED("제한관람가"); + + private final String description; + + VideoRating(String description) { + this.description = description; + } +} From 70dea4d837a59b1ecb8fa3271686b82d757a0592 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 01:45:51 +0900 Subject: [PATCH 08/30] feat: add theater related entities(module-theater) --- .../src/main/java/hellojpa/domain/Seat.java | 25 +++++++++++++++++++ .../main/java/hellojpa/domain/Theater.java | 24 ++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 module-theater/src/main/java/hellojpa/domain/Seat.java create mode 100644 module-theater/src/main/java/hellojpa/domain/Theater.java diff --git a/module-theater/src/main/java/hellojpa/domain/Seat.java b/module-theater/src/main/java/hellojpa/domain/Seat.java new file mode 100644 index 000000000..257679293 --- /dev/null +++ b/module-theater/src/main/java/hellojpa/domain/Seat.java @@ -0,0 +1,25 @@ +package hellojpa.domain; + +import jakarta.persistence.*; +import lombok.Getter; + +@Entity +@Getter +public class Seat { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "seat_id") + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "theater_id", nullable = false) + private Theater theater; // 상영관 + + @Column(name = "seat_row", nullable = false) + private String seatRow; // 상영관 행(ex. A, B...) + + @Column(name = "seat_column", nullable = false) + private int seatColumn; // 상영관 열(ex. 1, 2...) + +} diff --git a/module-theater/src/main/java/hellojpa/domain/Theater.java b/module-theater/src/main/java/hellojpa/domain/Theater.java new file mode 100644 index 000000000..d07fef313 --- /dev/null +++ b/module-theater/src/main/java/hellojpa/domain/Theater.java @@ -0,0 +1,24 @@ +package hellojpa.domain; + +import jakarta.persistence.*; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +public class Theater { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "theater_id") + private Long id; + + @Column(nullable = false, unique = true) + private String name; // 상영관 이름 + + @OneToMany(mappedBy = "theater", cascade = CascadeType.ALL, orphanRemoval = true) + @Column(nullable = false) + private List seats = new ArrayList<>(); // 좌석 +} From 2638a0a8a7fe2928aace49162a819c7a5d688970 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 01:46:33 +0900 Subject: [PATCH 09/30] feat: add screening entity(module-screenint) --- .../main/java/hellojpa/domain/Screening.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 module-screening/src/main/java/hellojpa/domain/Screening.java diff --git a/module-screening/src/main/java/hellojpa/domain/Screening.java b/module-screening/src/main/java/hellojpa/domain/Screening.java new file mode 100644 index 000000000..a6906e7ea --- /dev/null +++ b/module-screening/src/main/java/hellojpa/domain/Screening.java @@ -0,0 +1,27 @@ +package hellojpa.domain; + +import jakarta.persistence.*; +import lombok.Getter; + +import java.time.LocalTime; + +@Entity +@Getter +public class Screening { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "screening_id") + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "movie_id", nullable = false) + private Movie movie; // 상영하는 영화 + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "theater_id", nullable = false) + private Theater theater; // 상영관 + + @Column(nullable = false) + private LocalTime startTime; //시작 시간 +} From 52ae9ce59c999dfd7463341c42e34f6e03fe7854 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 01:49:36 +0900 Subject: [PATCH 10/30] feat: add screening repository(module-screenint) --- .../repository/ScreeningRepository.java | 7 +++++ .../repository/ScreeningRepositoryCustom.java | 11 ++++++++ .../repository/ScreeningRepositoryImpl.java | 27 +++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 module-screening/src/main/java/hellojpa/repository/ScreeningRepository.java create mode 100644 module-screening/src/main/java/hellojpa/repository/ScreeningRepositoryCustom.java create mode 100644 module-screening/src/main/java/hellojpa/repository/ScreeningRepositoryImpl.java diff --git a/module-screening/src/main/java/hellojpa/repository/ScreeningRepository.java b/module-screening/src/main/java/hellojpa/repository/ScreeningRepository.java new file mode 100644 index 000000000..49b77f4fd --- /dev/null +++ b/module-screening/src/main/java/hellojpa/repository/ScreeningRepository.java @@ -0,0 +1,7 @@ +package hellojpa.repository; + +import hellojpa.domain.Screening; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ScreeningRepository extends JpaRepository, ScreeningRepositoryCustom { +} diff --git a/module-screening/src/main/java/hellojpa/repository/ScreeningRepositoryCustom.java b/module-screening/src/main/java/hellojpa/repository/ScreeningRepositoryCustom.java new file mode 100644 index 000000000..3a38f26fc --- /dev/null +++ b/module-screening/src/main/java/hellojpa/repository/ScreeningRepositoryCustom.java @@ -0,0 +1,11 @@ +package hellojpa.repository; + +import hellojpa.domain.Screening; + +import java.time.LocalDate; +import java.util.List; + +public interface ScreeningRepositoryCustom { + + List findCurrentScreenings(LocalDate todayDate); +} diff --git a/module-screening/src/main/java/hellojpa/repository/ScreeningRepositoryImpl.java b/module-screening/src/main/java/hellojpa/repository/ScreeningRepositoryImpl.java new file mode 100644 index 000000000..253f07b66 --- /dev/null +++ b/module-screening/src/main/java/hellojpa/repository/ScreeningRepositoryImpl.java @@ -0,0 +1,27 @@ +package hellojpa.repository; + +import hellojpa.domain.Screening; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; + +@RequiredArgsConstructor +public class ScreeningRepositoryImpl implements ScreeningRepositoryCustom{ + + private final EntityManager em; + + @Override + public List findCurrentScreenings(LocalDate todayDate) { + return em.createQuery("select s from Screening s " + + "join fetch s.movie m " + + "join fetch s.theater t " + + "where m.releaseDate <= : todayDate " + + "order by m.releaseDate desc, " + + "s.startTime asc") + .setParameter("todayDate", todayDate) + .getResultList(); + } +} From 2e3162d901d111b7f4f4f513040e17508ad6603b Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 01:50:49 +0900 Subject: [PATCH 11/30] feat: add screening dto(module-screenint) --- .../main/java/hellojpa/dto/ScreeningDto.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 module-screening/src/main/java/hellojpa/dto/ScreeningDto.java diff --git a/module-screening/src/main/java/hellojpa/dto/ScreeningDto.java b/module-screening/src/main/java/hellojpa/dto/ScreeningDto.java new file mode 100644 index 000000000..361448ae9 --- /dev/null +++ b/module-screening/src/main/java/hellojpa/dto/ScreeningDto.java @@ -0,0 +1,26 @@ +package hellojpa.dto; + +import hellojpa.domain.Screening; +import hellojpa.domain.VideoRating; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ScreeningDto { + + private String title; + private String videoRating; + private LocalDate releaseDate; + private String thumbnail; + private int runningTime; + private String genreName; + private String theaterName; + private LocalTime startTime; + private LocalTime endTime; +} From 732f0155090f721a482a95e39986ab9b44e912c3 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 01:51:02 +0900 Subject: [PATCH 12/30] feat: add screening service(module-screenint) --- .../hellojpa/service/ScreeningService.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 module-screening/src/main/java/hellojpa/service/ScreeningService.java diff --git a/module-screening/src/main/java/hellojpa/service/ScreeningService.java b/module-screening/src/main/java/hellojpa/service/ScreeningService.java new file mode 100644 index 000000000..4b53dae6b --- /dev/null +++ b/module-screening/src/main/java/hellojpa/service/ScreeningService.java @@ -0,0 +1,45 @@ +package hellojpa.service; + +import hellojpa.domain.Screening; +import hellojpa.dto.ScreeningDto; +import hellojpa.repository.ScreeningRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ScreeningService { + + private final ScreeningRepository screeningRepository; + + public List findCurrentScreenings() { + + LocalDate todayDate = LocalDate.now(); + List currentScreenings = screeningRepository.findCurrentScreenings(todayDate); + + return currentScreenings.stream() + .map(currentScreening -> { + String title = currentScreening.getMovie().getTitle(); + String videoRating = currentScreening.getMovie().getRating().toString(); + LocalDate releaseDate = currentScreening.getMovie().getReleaseDate(); + String thumbnail = currentScreening.getMovie().getThumbnail(); + int runningTime = currentScreening.getMovie().getRunningTime(); + String genreName = currentScreening.getMovie().getGenre().getName(); + String theaterName = currentScreening.getTheater().getName(); + LocalTime startTime = currentScreening.getStartTime(); + LocalTime endTime = currentScreening.getStartTime().plusMinutes(runningTime); + + return new ScreeningDto( + title, videoRating, releaseDate, thumbnail, + runningTime, genreName, theaterName, startTime, endTime + ); + }) + .collect(Collectors.toList()); + } + +} From dbd21ff3a057f2f92cc085090cdfe9be14c7510d Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 01:51:19 +0900 Subject: [PATCH 13/30] feat: add screening controller(module-screenint) --- .../controller/ScreeningController.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 module-api/src/main/java/hellojpa/controller/ScreeningController.java diff --git a/module-api/src/main/java/hellojpa/controller/ScreeningController.java b/module-api/src/main/java/hellojpa/controller/ScreeningController.java new file mode 100644 index 000000000..6255bc38a --- /dev/null +++ b/module-api/src/main/java/hellojpa/controller/ScreeningController.java @@ -0,0 +1,21 @@ +package hellojpa.controller; + +import hellojpa.dto.ScreeningDto; +import hellojpa.service.ScreeningService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class ScreeningController { + + private final ScreeningService screeningService; + + @GetMapping("/screening/movies") + public List getCurrentScreenings() { + return screeningService.findCurrentScreenings(); + } +} \ No newline at end of file From fbe5d2b5aa76c2841031010d5d98a09a5995d164 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 01:53:12 +0900 Subject: [PATCH 14/30] chore: add dependencies --- build.gradle | 1 + module-api/build.gradle | 2 ++ 2 files changed, 3 insertions(+) diff --git a/build.gradle b/build.gradle index 4f28c1a04..4782b5501 100644 --- a/build.gradle +++ b/build.gradle @@ -43,6 +43,7 @@ subprojects { // 모든 하위 모듈들에 적용 implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'mysql:mysql-connector-java:8.0.33' } tasks.named('test') { diff --git a/module-api/build.gradle b/module-api/build.gradle index e7eb1ce03..11e2dda08 100644 --- a/module-api/build.gradle +++ b/module-api/build.gradle @@ -7,6 +7,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' testImplementation platform('org.junit:junit-bom:5.9.1') From 64918b03346168b4b38f8326e71175cd7694efa8 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 01:55:51 +0900 Subject: [PATCH 15/30] feat: update main class for controller --- module-api/src/main/java/hellojpa/Main.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module-api/src/main/java/hellojpa/Main.java b/module-api/src/main/java/hellojpa/Main.java index f31610dc8..b400ab0a2 100644 --- a/module-api/src/main/java/hellojpa/Main.java +++ b/module-api/src/main/java/hellojpa/Main.java @@ -1,7 +1,11 @@ package hellojpa; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication public class Main { public static void main(String[] args) { - System.out.println("Hello world!"); + SpringApplication.run(Main.class, args); } } \ No newline at end of file From 883a13936c1289488a242841fe01d55a10dd71fd Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 03:54:02 +0900 Subject: [PATCH 16/30] feat: insert data --- init-scripts/data.sql | 1309 +++++++++++++++++++++++++++++++++++++++++ init-scripts/ddl.sql | 0 2 files changed, 1309 insertions(+) create mode 100644 init-scripts/data.sql delete mode 100644 init-scripts/ddl.sql diff --git a/init-scripts/data.sql b/init-scripts/data.sql new file mode 100644 index 000000000..b399e3b90 --- /dev/null +++ b/init-scripts/data.sql @@ -0,0 +1,1309 @@ +-- Genre 데이터 삽입 +INSERT INTO genre (name) VALUES +('Action'), +('Comedy'), +('Drama'), +('Horror'), +('Romance'), +('Thriller'); + +-- Theater 데이터 삽입 +INSERT INTO theater (name) VALUES +('Theater 1'), +('Theater 2'), +('Theater 3'), +('Theater 4'), +('Theater 5'), +('Theater 6'), +('Theater 7'), +('Theater 8'), +('Theater 9'), +('Theater 10'), +('Theater 11'), +('Theater 12'), +('Theater 13'), +('Theater 14'), +('Theater 15'), +('Theater 16'), +('Theater 17'), +('Theater 18'), +('Theater 19'), +('Theater 20') +('Theater 21'), +('Theater 22'), +('Theater 23'), +('Theater 24'), +('Theater 25'), +('Theater 26'), +('Theater 27'), +('Theater 28'), +('Theater 29'), +('Theater 30') +('Theater 31'), +('Theater 32'), +('Theater 33'), +('Theater 34'), +('Theater 35'), +('Theater 36'), +('Theater 37'), +('Theater 38'), +('Theater 39'), +('Theater 40') +('Theater 41'), +('Theater 42'), +('Theater 43'), +('Theater 44'), +('Theater 45'), +('Theater 46'), +('Theater 47'), +('Theater 48'), +('Theater 49'), +('Theater 50') +('Theater 51'), +('Theater 52'), +('Theater 53'), +('Theater 54'), +('Theater 55'), +('Theater 56'), +('Theater 57'), +('Theater 58'), +('Theater 59'), +('Theater 60') +('Theater 61'), +('Theater 62'), +('Theater 63'), +('Theater 64'), +('Theater 65'), +('Theater 66'), +('Theater 67'), +('Theater 68'), +('Theater 69'), +('Theater 70') +('Theater 71'), +('Theater 72'), +('Theater 73'), +('Theater 74'), +('Theater 75'), +('Theater 76'), +('Theater 77'), +('Theater 78'), +('Theater 79'), +('Theater 80'); + +-- Movie 데이터 삽입 +INSERT INTO movie (title, rating, release_date, thumbnail, running_time, genre_id) VALUES +('영화1', 'ALL', '2024-11-01', 'https://xxx', 110, 1), +('영화2', 'AGE_12', '2024-11-02', 'https://xxx', 115, 2), +('영화3', 'AGE_15', '2024-11-03', 'https://xxx', 120, 3), +('영화4', 'ALL', '2024-11-05', 'https://xxx', 105, 4), +('영화5', 'AGE_12', '2024-11-06', 'https://xxx', 110, 5), +('영화6', 'AGE_15', '2024-11-07', 'https://xxx', 115, 6), +('영화7', 'AGE_12', '2024-11-08', 'https://xxx', 120, 1), +('영화8', 'ALL', '2024-11-09', 'https://xxx', 105, 2), +('영화9', 'AGE_12', '2024-11-10', 'https://xxx', 110, 3), +('영화10', 'AGE_15', '2024-11-11', 'https://xxx', 115, 4), +('영화11', 'AGE_12', '2024-11-12', 'https://xxx', 120, 5), +('영화12', 'ALL', '2024-11-13', 'https://xxx', 110, 6), +('영화13', 'AGE_15', '2024-11-14', 'https://xxx', 105, 1), +('영화14', 'AGE_12', '2024-11-15', 'https://xxx', 115, 2), +('영화15', 'ALL', '2024-11-16', 'https://xxx', 120, 3), +('영화16', 'AGE_12', '2024-11-17', 'https://xxx', 110, 4), +('영화17', 'AGE_15', '2024-11-18', 'https://xxx', 120, 5), +('영화18', 'ALL', '2024-11-19', 'https://xxx', 105, 6), +('영화19', 'AGE_12', '2024-11-20', 'https://xxx', 110, 1), +('영화20', 'AGE_15', '2024-11-21', 'https://xxx', 115, 2), +('영화21', 'AGE_12', '2024-12-01', 'https://xxx', 120, 3), +('영화22', 'ALL', '2024-12-02', 'https://xxx', 105, 4), +('영화23', 'AGE_12', '2024-12-03', 'https://xxx', 110, 5), +('영화24', 'AGE_15', '2024-12-04', 'https://xxx', 115, 6), +('영화25', 'AGE_12', '2024-12-05', 'https://xxx', 120, 1), +('영화26', 'ALL', '2024-12-06', 'https://xxx', 105, 2), +('영화27', 'AGE_15', '2024-12-07', 'https://xxx', 110, 3), +('영화28', 'AGE_12', '2024-12-08', 'https://xxx', 115, 4), +('영화29', 'AGE_15', '2024-12-09', 'https://xxx', 120, 5), +('영화30', 'AGE_12', '2024-12-10', 'https://xxx', 110, 6), +('영화31', 'AGE_19', '2024-12-15', 'https://xxx', 105, 1), +('영화32', 'RESTRICTED', '2024-12-16', 'https://xxx', 115, 2), +('영화33', 'AGE_19', '2024-12-17', 'https://xxx', 120, 3), +('영화34', 'RESTRICTED', '2024-12-18', 'https://xxx', 110, 4), +('영화35', 'AGE_19', '2024-12-19', 'https://xxx', 115, 5), +('영화36', 'RESTRICTED', '2024-12-20', 'https://xxx', 120, 6), +('영화37', 'AGE_19', '2025-01-01', 'https://xxx', 110, 1), +('영화38', 'RESTRICTED', '2025-01-02', 'https://xxx', 105, 2), +('영화39', 'AGE_19', '2025-01-05', 'https://xxx', 115, 3), +('영화40', 'RESTRICTED', '2025-01-10', 'https://xxx', 120, 4), +('영화41', 'ALL', '2025-11-01', 'https://xxx', 110, 1); + +-- Screening 데이터 삽입 +-- 영화1 상영 데이터 (상영관 1, 2) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(1, 1, '09:00'), +(1, 1, '11:00'), +(1, 1, '13:00'), +(1, 1, '15:00'), +(1, 1, '17:00'), +(1, 1, '19:00'), +(1, 1, '21:00'), +(1, 2, '09:00'), +(1, 2, '11:00'), +(1, 2, '13:00'), +(1, 2, '15:00'), +(1, 2, '17:00'), +(1, 2, '19:00'), +(1, 2, '21:00'); + +-- 영화2 상영 데이터 (상영관 3, 4) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(2, 3, '09:00'), +(2, 3, '11:00'), +(2, 3, '13:00'), +(2, 3, '15:00'), +(2, 3, '17:00'), +(2, 3, '19:00'), +(2, 3, '21:00'), +(2, 4, '09:00'), +(2, 4, '11:00'), +(2, 4, '13:00'), +(2, 4, '15:00'), +(2, 4, '17:00'), +(2, 4, '19:00'), +(2, 4, '21:00'); + +-- 영화3 상영 데이터 (상영관 5, 6) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(3, 5, '09:00'), +(3, 5, '11:00'), +(3, 5, '13:00'), +(3, 5, '15:00'), +(3, 5, '17:00'), +(3, 5, '19:00'), +(3, 5, '21:00'), +(3, 6, '09:00'), +(3, 6, '11:00'), +(3, 6, '13:00'), +(3, 6, '15:00'), +(3, 6, '17:00'), +(3, 6, '19:00'), +(3, 6, '21:00'); + +-- 영화4 상영 데이터 (상영관 7, 8) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(4, 7, '09:00'), +(4, 7, '11:00'), +(4, 7, '13:00'), +(4, 7, '15:00'), +(4, 7, '17:00'), +(4, 7, '19:00'), +(4, 7, '21:00'), +(4, 8, '09:00'), +(4, 8, '11:00'), +(4, 8, '13:00'), +(4, 8, '15:00'), +(4, 8, '17:00'), +(4, 8, '19:00'), +(4, 8, '21:00'); + +-- 영화5 상영 데이터 (상영관 9, 10) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(5, 9, '09:00'), +(5, 9, '11:00'), +(5, 9, '13:00'), +(5, 9, '15:00'), +(5, 9, '17:00'), +(5, 9, '19:00'), +(5, 9, '21:00'), +(5, 10, '09:00'), +(5, 10, '11:00'), +(5, 10, '13:00'), +(5, 10, '15:00'), +(5, 10, '17:00'), +(5, 10, '19:00'), +(5, 10, '21:00'); + +-- 영화6 상영 데이터 (상영관 11, 12) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(6, 11, '09:00'), +(6, 11, '11:00'), +(6, 11, '13:00'), +(6, 11, '15:00'), +(6, 11, '17:00'), +(6, 11, '19:00'), +(6, 11, '21:00'), +(6, 12, '09:00'), +(6, 12, '11:00'), +(6, 12, '13:00'), +(6, 12, '15:00'), +(6, 12, '17:00'), +(6, 12, '19:00'), +(6, 12, '21:00'); + +-- 영화7 상영 데이터 (상영관 13, 14) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(7, 13, '09:00'), +(7, 13, '11:00'), +(7, 13, '13:00'), +(7, 13, '15:00'), +(7, 13, '17:00'), +(7, 13, '19:00'), +(7, 13, '21:00'), +(7, 14, '09:00'), +(7, 14, '11:00'), +(7, 14, '13:00'), +(7, 14, '15:00'), +(7, 14, '17:00'), +(7, 14, '19:00'), +(7, 14, '21:00'); + +-- 영화8 상영 데이터 (상영관 15, 16) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(8, 15, '09:00'), +(8, 15, '11:00'), +(8, 15, '13:00'), +(8, 15, '15:00'), +(8, 15, '17:00'), +(8, 15, '19:00'), +(8, 15, '21:00'), +(8, 16, '09:00'), +(8, 16, '11:00'), +(8, 16, '13:00'), +(8, 16, '15:00'), +(8, 16, '17:00'), +(8, 16, '19:00'), +(8, 16, '21:00'); + +-- 영화9 상영 데이터 (상영관 17, 18) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(9, 17, '09:00'), +(9, 17, '11:00'), +(9, 17, '13:00'), +(9, 17, '15:00'), +(9, 17, '17:00'), +(9, 17, '19:00'), +(9, 17, '21:00'), +(9, 18, '09:00'), +(9, 18, '11:00'), +(9, 18, '13:00'), +(9, 18, '15:00'), +(9, 18, '17:00'), +(9, 18, '19:00'), +(9, 18, '21:00'); + +-- 영화10 상영 데이터 (상영관 19, 20) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(10, 19, '09:00'), +(10, 19, '11:00'), +(10, 19, '13:00'), +(10, 19, '15:00'), +(10, 19, '17:00'), +(10, 19, '19:00'), +(10, 19, '21:00'), +(10, 20, '09:00'), +(10, 20, '11:00'), +(10, 20, '13:00'), +(10, 20, '15:00'), +(10, 20, '17:00'), +(10, 20, '19:00'), +(10, 20, '21:00'); + +-- 영화11 상영 데이터 (상영관 21, 22) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(11, 21, '09:00'), +(11, 21, '11:00'), +(11, 21, '13:00'), +(11, 21, '15:00'), +(11, 21, '17:00'), +(11, 21, '19:00'), +(11, 21, '21:00'), +(11, 22, '09:00'), +(11, 22, '11:00'), +(11, 22, '13:00'), +(11, 22, '15:00'), +(11, 22, '17:00'), +(11, 22, '19:00'), +(11, 22, '21:00'); + +-- 영화12 상영 데이터 (상영관 23, 24) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(12, 23, '09:00'), +(12, 23, '11:00'), +(12, 23, '13:00'), +(12, 23, '15:00'), +(12, 23, '17:00'), +(12, 23, '19:00'), +(12, 23, '21:00'), +(12, 24, '09:00'), +(12, 24, '11:00'), +(12, 24, '13:00'), +(12, 24, '15:00'), +(12, 24, '17:00'), +(12, 24, '19:00'), +(12, 24, '21:00'); + +-- 영화13 상영 데이터 (상영관 25, 26) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(13, 25, '09:00'), +(13, 25, '11:00'), +(13, 25, '13:00'), +(13, 25, '15:00'), +(13, 25, '17:00'), +(13, 25, '19:00'), +(13, 25, '21:00'), +(13, 26, '09:00'), +(13, 26, '11:00'), +(13, 26, '13:00'), +(13, 26, '15:00'), +(13, 26, '17:00'), +(13, 26, '19:00'), +(13, 26, '21:00'); + +-- 영화14 상영 데이터 (상영관 27, 28) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(14, 27, '09:00'), +(14, 27, '11:00'), +(14, 27, '13:00'), +(14, 27, '15:00'), +(14, 27, '17:00'), +(14, 27, '19:00'), +(14, 27, '21:00'), +(14, 28, '09:00'), +(14, 28, '11:00'), +(14, 28, '13:00'), +(14, 28, '15:00'), +(14, 28, '17:00'), +(14, 28, '19:00'), +(14, 28, '21:00'); + +-- 영화15 상영 데이터 (상영관 29, 30) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(15, 29, '09:00'), +(15, 29, '11:00'), +(15, 29, '13:00'), +(15, 29, '15:00'), +(15, 29, '17:00'), +(15, 29, '19:00'), +(15, 29, '21:00'), +(15, 30, '09:00'), +(15, 30, '11:00'), +(15, 30, '13:00'), +(15, 30, '15:00'), +(15, 30, '17:00'), +(15, 30, '19:00'), +(15, 30, '21:00'); + +-- 영화16 상영 데이터 (상영관 31, 32) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(16, 31, '09:00'), +(16, 31, '11:00'), +(16, 31, '13:00'), +(16, 31, '15:00'), +(16, 31, '17:00'), +(16, 31, '19:00'), +(16, 31, '21:00'), +(16, 32, '09:00'), +(16, 32, '11:00'), +(16, 32, '13:00'), +(16, 32, '15:00'), +(16, 32, '17:00'), +(16, 32, '19:00'), +(16, 32, '21:00'); + +-- 영화17 상영 데이터 (상영관 33, 34) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(17, 33, '09:00'), +(17, 33, '11:00'), +(17, 33, '13:00'), +(17, 33, '15:00'), +(17, 33, '17:00'), +(17, 33, '19:00'), +(17, 33, '21:00'), +(17, 34, '09:00'), +(17, 34, '11:00'), +(17, 34, '13:00'), +(17, 34, '15:00'), +(17, 34, '17:00'), +(17, 34, '19:00'), +(17, 34, '21:00'); + +-- 영화18 상영 데이터 (상영관 35, 36) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(18, 35, '09:00'), +(18, 35, '11:00'), +(18, 35, '13:00'), +(18, 35, '15:00'), +(18, 35, '17:00'), +(18, 35, '19:00'), +(18, 35, '21:00'), +(18, 36, '09:00'), +(18, 36, '11:00'), +(18, 36, '13:00'), +(18, 36, '15:00'), +(18, 36, '17:00'), +(18, 36, '19:00'), +(18, 36, '21:00'); + +-- 영화19 상영 데이터 (상영관 37, 38) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(19, 37, '09:00'), +(19, 37, '11:00'), +(19, 37, '13:00'), +(19, 37, '15:00'), +(19, 37, '17:00'), +(19, 37, '19:00'), +(19, 37, '21:00'), +(19, 38, '09:00'), +(19, 38, '11:00'), +(19, 38, '13:00'), +(19, 38, '15:00'), +(19, 38, '17:00'), +(19, 38, '19:00'), +(19, 38, '21:00'); + +-- 영화20 상영 데이터 (상영관 39, 40) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(20, 39, '09:00'), +(20, 39, '11:00'), +(20, 39, '13:00'), +(20, 39, '15:00'), +(20, 39, '17:00'), +(20, 39, '19:00'), +(20, 39, '21:00'), +(20, 40, '09:00'), +(20, 40, '11:00'), +(20, 40, '13:00'), +(20, 40, '15:00'), +(20, 40, '17:00'), +(20, 40, '19:00'), +(20, 40, '21:00'); + +-- 영화21 상영 데이터 (상영관 41, 42) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(21, 41, '09:00'), +(21, 41, '11:00'), +(21, 41, '13:00'), +(21, 41, '15:00'), +(21, 41, '17:00'), +(21, 41, '19:00'), +(21, 41, '21:00'), +(21, 42, '09:00'), +(21, 42, '11:00'), +(21, 42, '13:00'), +(21, 42, '15:00'), +(21, 42, '17:00'), +(21, 42, '19:00'), +(21, 42, '21:00'); + +-- 영화22 상영 데이터 (상영관 43, 44) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(22, 43, '09:00'), +(22, 43, '11:00'), +(22, 43, '13:00'), +(22, 43, '15:00'), +(22, 43, '17:00'), +(22, 43, '19:00'), +(22, 43, '21:00'), +(22, 44, '09:00'), +(22, 44, '11:00'), +(22, 44, '13:00'), +(22, 44, '15:00'), +(22, 44, '17:00'), +(22, 44, '19:00'), +(22, 44, '21:00'); + +-- 영화23 상영 데이터 (상영관 45, 46) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(23, 45, '09:00'), +(23, 45, '11:00'), +(23, 45, '13:00'), +(23, 45, '15:00'), +(23, 45, '17:00'), +(23, 45, '19:00'), +(23, 45, '21:00'), +(23, 46, '09:00'), +(23, 46, '11:00'), +(23, 46, '13:00'), +(23, 46, '15:00'), +(23, 46, '17:00'), +(23, 46, '19:00'), +(23, 46, '21:00'); + +-- 영화24 상영 데이터 (상영관 47, 48) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(24, 47, '09:00'), +(24, 47, '11:00'), +(24, 47, '13:00'), +(24, 47, '15:00'), +(24, 47, '17:00'), +(24, 47, '19:00'), +(24, 47, '21:00'), +(24, 48, '09:00'), +(24, 48, '11:00'), +(24, 48, '13:00'), +(24, 48, '15:00'), +(24, 48, '17:00'), +(24, 48, '19:00'), +(24, 48, '21:00'); + +-- 영화25 상영 데이터 (상영관 49, 50) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(25, 49, '09:00'), +(25, 49, '11:00'), +(25, 49, '13:00'), +(25, 49, '15:00'), +(25, 49, '17:00'), +(25, 49, '19:00'), +(25, 49, '21:00'), +(25, 50, '09:00'), +(25, 50, '11:00'), +(25, 50, '13:00'), +(25, 50, '15:00'), +(25, 50, '17:00'), +(25, 50, '19:00'), +(25, 50, '21:00'); + +-- 영화26 상영 데이터 (상영관 51, 52) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(26, 51, '09:00'), +(26, 51, '11:00'), +(26, 51, '13:00'), +(26, 51, '15:00'), +(26, 51, '17:00'), +(26, 51, '19:00'), +(26, 51, '21:00'), +(26, 52, '09:00'), +(26, 52, '11:00'), +(26, 52, '13:00'), +(26, 52, '15:00'), +(26, 52, '17:00'), +(26, 52, '19:00'), +(26, 52, '21:00'); + +-- 영화27 상영 데이터 (상영관 53, 54) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(27, 53, '09:00'), +(27, 53, '11:00'), +(27, 53, '13:00'), +(27, 53, '15:00'), +(27, 53, '17:00'), +(27, 53, '19:00'), +(27, 53, '21:00'), +(27, 54, '09:00'), +(27, 54, '11:00'), +(27, 54, '13:00'), +(27, 54, '15:00'), +(27, 54, '17:00'), +(27, 54, '19:00'), +(27, 54, '21:00'); + +-- 영화28 상영 데이터 (상영관 55, 56) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(28, 55, '09:00'), +(28, 55, '11:00'), +(28, 55, '13:00'), +(28, 55, '15:00'), +(28, 55, '17:00'), +(28, 55, '19:00'), +(28, 55, '21:00'), +(28, 56, '09:00'), +(28, 56, '11:00'), +(28, 56, '13:00'), +(28, 56, '15:00'), +(28, 56, '17:00'), +(28, 56, '19:00'), +(28, 56, '21:00'); + +-- 영화29 상영 데이터 (상영관 57, 58) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(29, 57, '09:00'), +(29, 57, '11:00'), +(29, 57, '13:00'), +(29, 57, '15:00'), +(29, 57, '17:00'), +(29, 57, '19:00'), +(29, 57, '21:00'), +(29, 58, '09:00'), +(29, 58, '11:00'), +(29, 58, '13:00'), +(29, 58, '15:00'), +(29, 58, '17:00'), +(29, 58, '19:00'), +(29, 58, '21:00'); + +-- 영화30 상영 데이터 (상영관 59, 60) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(30, 59, '09:00'), +(30, 59, '11:00'), +(30, 59, '13:00'), +(30, 59, '15:00'), +(30, 59, '17:00'), +(30, 59, '19:00'), +(30, 59, '21:00'), +(30, 60, '09:00'), +(30, 60, '11:00'), +(30, 60, '13:00'), +(30, 60, '15:00'), +(30, 60, '17:00'), +(30, 60, '19:00'), +(30, 60, '21:00'); + +-- 영화31 상영 데이터 (상영관 61, 62) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(31, 61, '09:00'), +(31, 61, '11:00'), +(31, 61, '13:00'), +(31, 61, '15:00'), +(31, 61, '17:00'), +(31, 61, '19:00'), +(31, 61, '21:00'), +(31, 62, '09:00'), +(31, 62, '11:00'), +(31, 62, '13:00'), +(31, 62, '15:00'), +(31, 62, '17:00'), +(31, 62, '19:00'), +(31, 62, '21:00'); + +-- 영화32 상영 데이터 (상영관 63, 64) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(32, 63, '09:00'), +(32, 63, '11:00'), +(32, 63, '13:00'), +(32, 63, '15:00'), +(32, 63, '17:00'), +(32, 63, '19:00'), +(32, 63, '21:00'), +(32, 64, '09:00'), +(32, 64, '11:00'), +(32, 64, '13:00'), +(32, 64, '15:00'), +(32, 64, '17:00'), +(32, 64, '19:00'), +(32, 64, '21:00'); + +-- 영화33 상영 데이터 (상영관 65, 66) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(33, 65, '09:00'), +(33, 65, '11:00'), +(33, 65, '13:00'), +(33, 65, '15:00'), +(33, 65, '17:00'), +(33, 65, '19:00'), +(33, 65, '21:00'), +(33, 66, '09:00'), +(33, 66, '11:00'), +(33, 66, '13:00'), +(33, 66, '15:00'), +(33, 66, '17:00'), +(33, 66, '19:00'), +(33, 66, '21:00'); + +-- 영화34 상영 데이터 (상영관 67, 68) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(34, 67, '09:00'), +(34, 67, '11:00'), +(34, 67, '13:00'), +(34, 67, '15:00'), +(34, 67, '17:00'), +(34, 67, '19:00'), +(34, 67, '21:00'), +(34, 68, '09:00'), +(34, 68, '11:00'), +(34, 68, '13:00'), +(34, 68, '15:00'), +(34, 68, '17:00'), +(34, 68, '19:00'), +(34, 68, '21:00'); + +-- 영화35 상영 데이터 (상영관 69, 70) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(35, 69, '09:00'), +(35, 69, '11:00'), +(35, 69, '13:00'), +(35, 69, '15:00'), +(35, 69, '17:00'), +(35, 69, '19:00'), +(35, 69, '21:00'), +(35, 70, '09:00'), +(35, 70, '11:00'), +(35, 70, '13:00'), +(35, 70, '15:00'), +(35, 70, '17:00'), +(35, 70, '19:00'), +(35, 70, '21:00'); + +-- 영화36 상영 데이터 (상영관 71, 72) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(36, 71, '09:00'), +(36, 71, '11:00'), +(36, 71, '13:00'), +(36, 71, '15:00'), +(36, 71, '17:00'), +(36, 71, '19:00'), +(36, 71, '21:00'), +(36, 72, '09:00'), +(36, 72, '11:00'), +(36, 72, '13:00'), +(36, 72, '15:00'), +(36, 72, '17:00'), +(36, 72, '19:00'), +(36, 72, '21:00'); + +-- 영화37 상영 데이터 (상영관 73, 74) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(37, 73, '09:00'), +(37, 73, '11:00'), +(37, 73, '13:00'), +(37, 73, '15:00'), +(37, 73, '17:00'), +(37, 73, '19:00'), +(37, 73, '21:00'), +(37, 74, '09:00'), +(37, 74, '11:00'), +(37, 74, '13:00'), +(37, 74, '15:00'), +(37, 74, '17:00'), +(37, 74, '19:00'), +(37, 74, '21:00'); + +-- 영화38 상영 데이터 (상영관 75, 76) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(38, 75, '09:00'), +(38, 75, '11:00'), +(38, 75, '13:00'), +(38, 75, '15:00'), +(38, 75, '17:00'), +(38, 75, '19:00'), +(38, 75, '21:00'), +(38, 76, '09:00'), +(38, 76, '11:00'), +(38, 76, '13:00'), +(38, 76, '15:00'), +(38, 76, '17:00'), +(38, 76, '19:00'), +(38, 76, '21:00'); + +-- 영화39 상영 데이터 (상영관 77, 78) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(39, 77, '09:00'), +(39, 77, '11:00'), +(39, 77, '13:00'), +(39, 77, '15:00'), +(39, 77, '17:00'), +(39, 77, '19:00'), +(39, 77, '21:00'), +(39, 78, '09:00'), +(39, 78, '11:00'), +(39, 78, '13:00'), +(39, 78, '15:00'), +(39, 78, '17:00'), +(39, 78, '19:00'), +(39, 78, '21:00'); + +-- 영화40 상영 데이터 (상영관 79, 80) +INSERT INTO screening (movie_id, theater_id, start_time) VALUES +(40, 79, '09:00'), +(40, 79, '11:00'), +(40, 79, '13:00'), +(40, 79, '15:00'), +(40, 79, '17:00'), +(40, 79, '19:00'), +(40, 79, '21:00'), +(40, 80, '09:00'), +(40, 80, '11:00'), +(40, 80, '13:00'), +(40, 80, '15:00'), +(40, 80, '17:00'), +(40, 80, '19:00'), +(40, 80, '21:00'); + +-- Seat 데이터 삽입 +INSERT INTO seat (theater_id, seat_row, seat_column) VALUES +(1, 'A', 1), (1, 'A', 2), (1, 'A', 3), (1, 'A', 4), (1, 'A', 5), +(1, 'B', 1), (1, 'B', 2), (1, 'B', 3), (1, 'B', 4), (1, 'B', 5), +(1, 'C', 1), (1, 'C', 2), (1, 'C', 3), (1, 'C', 4), (1, 'C', 5), +(1, 'D', 1), (1, 'D', 2), (1, 'D', 3), (1, 'D', 4), (1, 'D', 5), +(1, 'E', 1), (1, 'E', 2), (1, 'E', 3), (1, 'E', 4), (1, 'E', 5), + +(2, 'A', 1), (2, 'A', 2), (2, 'A', 3), (2, 'A', 4), (2, 'A', 5), +(2, 'B', 1), (2, 'B', 2), (2, 'B', 3), (2, 'B', 4), (2, 'B', 5), +(2, 'C', 1), (2, 'C', 2), (2, 'C', 3), (2, 'C', 4), (2, 'C', 5), +(2, 'D', 1), (2, 'D', 2), (2, 'D', 3), (2, 'D', 4), (2, 'D', 5), +(2, 'E', 1), (2, 'E', 2), (2, 'E', 3), (2, 'E', 4), (2, 'E', 5), + +(3, 'A', 1), (3, 'A', 2), (3, 'A', 3), (3, 'A', 4), (3, 'A', 5), +(3, 'B', 1), (3, 'B', 2), (3, 'B', 3), (3, 'B', 4), (3, 'B', 5), +(3, 'C', 1), (3, 'C', 2), (3, 'C', 3), (3, 'C', 4), (3, 'C', 5), +(3, 'D', 1), (3, 'D', 2), (3, 'D', 3), (3, 'D', 4), (3, 'D', 5), +(3, 'E', 1), (3, 'E', 2), (3, 'E', 3), (3, 'E', 4), (3, 'E', 5), + +(4, 'A', 1), (4, 'A', 2), (4, 'A', 3), (4, 'A', 4), (4, 'A', 5), +(4, 'B', 1), (4, 'B', 2), (4, 'B', 3), (4, 'B', 4), (4, 'B', 5), +(4, 'C', 1), (4, 'C', 2), (4, 'C', 3), (4, 'C', 4), (4, 'C', 5), +(4, 'D', 1), (4, 'D', 2), (4, 'D', 3), (4, 'D', 4), (4, 'D', 5), +(4, 'E', 1), (4, 'E', 2), (4, 'E', 3), (4, 'E', 4), (4, 'E', 5), + +(5, 'A', 1), (5, 'A', 2), (5, 'A', 3), (5, 'A', 4), (5, 'A', 5), +(5, 'B', 1), (5, 'B', 2), (5, 'B', 3), (5, 'B', 4), (5, 'B', 5), +(5, 'C', 1), (5, 'C', 2), (5, 'C', 3), (5, 'C', 4), (5, 'C', 5), +(5, 'D', 1), (5, 'D', 2), (5, 'D', 3), (5, 'D', 4), (5, 'D', 5), +(5, 'E', 1), (5, 'E', 2), (5, 'E', 3), (5, 'E', 4), (5, 'E', 5); + +INSERT INTO seat (theater_id, seat_row, seat_column) VALUES +(6, 'A', 1), (6, 'A', 2), (6, 'A', 3), (6, 'A', 4), (6, 'A', 5), +(6, 'B', 1), (6, 'B', 2), (6, 'B', 3), (6, 'B', 4), (6, 'B', 5), +(6, 'C', 1), (6, 'C', 2), (6, 'C', 3), (6, 'C', 4), (6, 'C', 5), +(6, 'D', 1), (6, 'D', 2), (6, 'D', 3), (6, 'D', 4), (6, 'D', 5), +(6, 'E', 1), (6, 'E', 2), (6, 'E', 3), (6, 'E', 4), (6, 'E', 5), + +(7, 'A', 1), (7, 'A', 2), (7, 'A', 3), (7, 'A', 4), (7, 'A', 5), +(7, 'B', 1), (7, 'B', 2), (7, 'B', 3), (7, 'B', 4), (7, 'B', 5), +(7, 'C', 1), (7, 'C', 2), (7, 'C', 3), (7, 'C', 4), (7, 'C', 5), +(7, 'D', 1), (7, 'D', 2), (7, 'D', 3), (7, 'D', 4), (7, 'D', 5), +(7, 'E', 1), (7, 'E', 2), (7, 'E', 3), (7, 'E', 4), (7, 'E', 5), + +(8, 'A', 1), (8, 'A', 2), (8, 'A', 3), (8, 'A', 4), (8, 'A', 5), +(8, 'B', 1), (8, 'B', 2), (8, 'B', 3), (8, 'B', 4), (8, 'B', 5), +(8, 'C', 1), (8, 'C', 2), (8, 'C', 3), (8, 'C', 4), (8, 'C', 5), +(8, 'D', 1), (8, 'D', 2), (8, 'D', 3), (8, 'D', 4), (8, 'D', 5), +(8, 'E', 1), (8, 'E', 2), (8, 'E', 3), (8, 'E', 4), (8, 'E', 5), + +(9, 'A', 1), (9, 'A', 2), (9, 'A', 3), (9, 'A', 4), (9, 'A', 5), +(9, 'B', 1), (9, 'B', 2), (9, 'B', 3), (9, 'B', 4), (9, 'B', 5), +(9, 'C', 1), (9, 'C', 2), (9, 'C', 3), (9, 'C', 4), (9, 'C', 5), +(9, 'D', 1), (9, 'D', 2), (9, 'D', 3), (9, 'D', 4), (9, 'D', 5), +(9, 'E', 1), (9, 'E', 2), (9, 'E', 3), (9, 'E', 4), (9, 'E', 5), + +(10, 'A', 1), (10, 'A', 2), (10, 'A', 3), (10, 'A', 4), (10, 'A', 5), +(10, 'B', 1), (10, 'B', 2), (10, 'B', 3), (10, 'B', 4), (10, 'B', 5), +(10, 'C', 1), (10, 'C', 2), (10, 'C', 3), (10, 'C', 4), (10, 'C', 5), +(10, 'D', 1), (10, 'D', 2), (10, 'D', 3), (10, 'D', 4), (10, 'D', 5), +(10, 'E', 1), (10, 'E', 2), (10, 'E', 3), (10, 'E', 4), (10, 'E', 5); + +INSERT INTO seat (theater_id, seat_row, seat_column) VALUES +(11, 'A', 1), (11, 'A', 2), (11, 'A', 3), (11, 'A', 4), (11, 'A', 5), +(11, 'B', 1), (11, 'B', 2), (11, 'B', 3), (11, 'B', 4), (11, 'B', 5), +(11, 'C', 1), (11, 'C', 2), (11, 'C', 3), (11, 'C', 4), (11, 'C', 5), +(11, 'D', 1), (11, 'D', 2), (11, 'D', 3), (11, 'D', 4), (11, 'D', 5), +(11, 'E', 1), (11, 'E', 2), (11, 'E', 3), (11, 'E', 4), (11, 'E', 5), + +(12, 'A', 1), (12, 'A', 2), (12, 'A', 3), (12, 'A', 4), (12, 'A', 5), +(12, 'B', 1), (12, 'B', 2), (12, 'B', 3), (12, 'B', 4), (12, 'B', 5), +(12, 'C', 1), (12, 'C', 2), (12, 'C', 3), (12, 'C', 4), (12, 'C', 5), +(12, 'D', 1), (12, 'D', 2), (12, 'D', 3), (12, 'D', 4), (12, 'D', 5), +(12, 'E', 1), (12, 'E', 2), (12, 'E', 3), (12, 'E', 4), (12, 'E', 5), + +(13, 'A', 1), (13, 'A', 2), (13, 'A', 3), (13, 'A', 4), (13, 'A', 5), +(13, 'B', 1), (13, 'B', 2), (13, 'B', 3), (13, 'B', 4), (13, 'B', 5), +(13, 'C', 1), (13, 'C', 2), (13, 'C', 3), (13, 'C', 4), (13, 'C', 5), +(13, 'D', 1), (13, 'D', 2), (13, 'D', 3), (13, 'D', 4), (13, 'D', 5), +(13, 'E', 1), (13, 'E', 2), (13, 'E', 3), (13, 'E', 4), (13, 'E', 5), + +(14, 'A', 1), (14, 'A', 2), (14, 'A', 3), (14, 'A', 4), (14, 'A', 5), +(14, 'B', 1), (14, 'B', 2), (14, 'B', 3), (14, 'B', 4), (14, 'B', 5), +(14, 'C', 1), (14, 'C', 2), (14, 'C', 3), (14, 'C', 4), (14, 'C', 5), +(14, 'D', 1), (14, 'D', 2), (14, 'D', 3), (14, 'D', 4), (14, 'D', 5), +(14, 'E', 1), (14, 'E', 2), (14, 'E', 3), (14, 'E', 4), (14, 'E', 5), + +INSERT INTO seat (theater_id, seat_row, seat_column) VALUES +(15, 'A', 1), (15, 'A', 2), (15, 'A', 3), (15, 'A', 4), (15, 'A', 5), +(15, 'B', 1), (15, 'B', 2), (15, 'B', 3), (15, 'B', 4), (15, 'B', 5), +(15, 'C', 1), (15, 'C', 2), (15, 'C', 3), (15, 'C', 4), (15, 'C', 5), +(15, 'D', 1), (15, 'D', 2), (15, 'D', 3), (15, 'D', 4), (15, 'D', 5), +(15, 'E', 1), (15, 'E', 2), (15, 'E', 3), (15, 'E', 4), (15, 'E', 5), + +(16, 'A', 1), (16, 'A', 2), (16, 'A', 3), (16, 'A', 4), (16, 'A', 5), +(16, 'B', 1), (16, 'B', 2), (16, 'B', 3), (16, 'B', 4), (16, 'B', 5), +(16, 'C', 1), (16, 'C', 2), (16, 'C', 3), (16, 'C', 4), (16, 'C', 5), +(16, 'D', 1), (16, 'D', 2), (16, 'D', 3), (16, 'D', 4), (16, 'D', 5), +(16, 'E', 1), (16, 'E', 2), (16, 'E', 3), (16, 'E', 4), (16, 'E', 5), + +(17, 'A', 1), (17, 'A', 2), (17, 'A', 3), (17, 'A', 4), (17, 'A', 5), +(17, 'B', 1), (17, 'B', 2), (17, 'B', 3), (17, 'B', 4), (17, 'B', 5), +(17, 'C', 1), (17, 'C', 2), (17, 'C', 3), (17, 'C', 4), (17, 'C', 5), +(17, 'D', 1), (17, 'D', 2), (17, 'D', 3), (17, 'D', 4), (17, 'D', 5), +(17, 'E', 1), (17, 'E', 2), (17, 'E', 3), (17, 'E', 4), (17, 'E', 5), + +(18, 'A', 1), (18, 'A', 2), (18, 'A', 3), (18, 'A', 4), (18, 'A', 5), +(18, 'B', 1), (18, 'B', 2), (18, 'B', 3), (18, 'B', 4), (18, 'B', 5), +(18, 'C', 1), (18, 'C', 2), (18, 'C', 3), (18, 'C', 4), (18, 'C', 5), +(18, 'D', 1), (18, 'D', 2), (18, 'D', 3), (18, 'D', 4), (18, 'D', 5), +(18, 'E', 1), (18, 'E', 2), (18, 'E', 3), (18, 'E', 4), (18, 'E', 5), + +(19, 'A', 1), (19, 'A', 2), (19, 'A', 3), (19, 'A', 4), (19, 'A', 5), +(19, 'B', 1), (19, 'B', 2), (19, 'B', 3), (19, 'B', 4), (19, 'B', 5), +(19, 'C', 1), (19, 'C', 2), (19, 'C', 3), (19, 'C', 4), (19, 'C', 5), +(19, 'D', 1), (19, 'D', 2), (19, 'D', 3), (19, 'D', 4), (19, 'D', 5), +(19, 'E', 1), (19, 'E', 2), (19, 'E', 3), (19, 'E', 4), (19, 'E', 5), + +(20, 'A', 1), (20, 'A', 2), (20, 'A', 3), (20, 'A', 4), (20, 'A', 5), +(20, 'B', 1), (20, 'B', 2), (20, 'B', 3), (20, 'B', 4), (20, 'B', 5), +(20, 'C', 1), (20, 'C', 2), (20, 'C', 3), (20, 'C', 4), (20, 'C', 5), +(20, 'D', 1), (20, 'D', 2), (20, 'D', 3), (20, 'D', 4), (20, 'D', 5), +(20, 'E', 1), (20, 'E', 2), (20, 'E', 3), (20, 'E', 4), (20, 'E', 5); + +INSERT INTO seat (theater_id, seat_row, seat_column) VALUES +(21, 'A', 1), (21, 'A', 2), (21, 'A', 3), (21, 'A', 4), (21, 'A', 5), +(21, 'B', 1), (21, 'B', 2), (21, 'B', 3), (21, 'B', 4), (21, 'B', 5), +(21, 'C', 1), (21, 'C', 2), (21, 'C', 3), (21, 'C', 4), (21, 'C', 5), +(21, 'D', 1), (21, 'D', 2), (21, 'D', 3), (21, 'D', 4), (21, 'D', 5), +(21, 'E', 1), (21, 'E', 2), (21, 'E', 3), (21, 'E', 4), (21, 'E', 5), + +(22, 'A', 1), (22, 'A', 2), (22, 'A', 3), (22, 'A', 4), (22, 'A', 5), +(22, 'B', 1), (22, 'B', 2), (22, 'B', 3), (22, 'B', 4), (22, 'B', 5), +(22, 'C', 1), (22, 'C', 2), (22, 'C', 3), (22, 'C', 4), (22, 'C', 5), +(22, 'D', 1), (22, 'D', 2), (22, 'D', 3), (22, 'D', 4), (22, 'D', 5), +(22, 'E', 1), (22, 'E', 2), (22, 'E', 3), (22, 'E', 4), (22, 'E', 5), + +(23, 'A', 1), (23, 'A', 2), (23, 'A', 3), (23, 'A', 4), (23, 'A', 5), +(23, 'B', 1), (23, 'B', 2), (23, 'B', 3), (23, 'B', 4), (23, 'B', 5), +(23, 'C', 1), (23, 'C', 2), (23, 'C', 3), (23, 'C', 4), (23, 'C', 5), +(23, 'D', 1), (23, 'D', 2), (23, 'D', 3), (23, 'D', 4), (23, 'D', 5), +(23, 'E', 1), (23, 'E', 2), (23, 'E', 3), (23, 'E', 4), (23, 'E', 5), + +(24, 'A', 1), (24, 'A', 2), (24, 'A', 3), (24, 'A', 4), (24, 'A', 5), +(24, 'B', 1), (24, 'B', 2), (24, 'B', 3), (24, 'B', 4), (24, 'B', 5), +(24, 'C', 1), (24, 'C', 2), (24, 'C', 3), (24, 'C', 4), (24, 'C', 5), +(24, 'D', 1), (24, 'D', 2), (24, 'D', 3), (24, 'D', 4), (24, 'D', 5), +(24, 'E', 1), (24, 'E', 2), (24, 'E', 3), (24, 'E', 4), (24, 'E', 5), + +(25, 'A', 1), (25, 'A', 2), (25, 'A', 3), (25, 'A', 4), (25, 'A', 5), +(25, 'B', 1), (25, 'B', 2), (25, 'B', 3), (25, 'B', 4), (25, 'B', 5), +(25, 'C', 1), (25, 'C', 2), (25, 'C', 3), (25, 'C', 4), (25, 'C', 5), +(25, 'D', 1), (25, 'D', 2), (25, 'D', 3), (25, 'D', 4), (25, 'D', 5), +(25, 'E', 1), (25, 'E', 2), (25, 'E', 3), (25, 'E', 4), (25, 'E', 5), + +(26, 'A', 1), (26, 'A', 2), (26, 'A', 3), (26, 'A', 4), (26, 'A', 5), +(26, 'B', 1), (26, 'B', 2), (26, 'B', 3), (26, 'B', 4), (26, 'B', 5), +(26, 'C', 1), (26, 'C', 2), (26, 'C', 3), (26, 'C', 4), (26, 'C', 5), +(26, 'D', 1), (26, 'D', 2), (26, 'D', 3), (26, 'D', 4), (26, 'D', 5), +(26, 'E', 1), (26, 'E', 2), (26, 'E', 3), (26, 'E', 4), (26, 'E', 5), + +(27, 'A', 1), (27, 'A', 2), (27, 'A', 3), (27, 'A', 4), (27, 'A', 5), +(27, 'B', 1), (27, 'B', 2), (27, 'B', 3), (27, 'B', 4), (27, 'B', 5), +(27, 'C', 1), (27, 'C', 2), (27, 'C', 3), (27, 'C', 4), (27, 'C', 5), +(27, 'D', 1), (27, 'D', 2), (27, 'D', 3), (27, 'D', 4), (27, 'D', 5), +(27, 'E', 1), (27, 'E', 2), (27, 'E', 3), (27, 'E', 4), (27, 'E', 5), + +(28, 'A', 1), (28, 'A', 2), (28, 'A', 3), (28, 'A', 4), (28, 'A', 5), +(28, 'B', 1), (28, 'B', 2), (28, 'B', 3), (28, 'B', 4), (28, 'B', 5), +(28, 'C', 1), (28, 'C', 2), (28, 'C', 3), (28, 'C', 4), (28, 'C', 5), +(28, 'D', 1), (28, 'D', 2), (28, 'D', 3), (28, 'D', 4), (28, 'D', 5), +(28, 'E', 1), (28, 'E', 2), (28, 'E', 3), (28, 'E', 4), (28, 'E', 5), + +(29, 'A', 1), (29, 'A', 2), (29, 'A', 3), (29, 'A', 4), (29, 'A', 5), +(29, 'B', 1), (29, 'B', 2), (29, 'B', 3), (29, 'B', 4), (29, 'B', 5), +(29, 'C', 1), (29, 'C', 2), (29, 'C', 3), (29, 'C', 4), (29, 'C', 5), +(29, 'D', 1), (29, 'D', 2), (29, 'D', 3), (29, 'D', 4), (29, 'D', 5), +(29, 'E', 1), (29, 'E', 2), (29, 'E', 3), (29, 'E', 4), (29, 'E', 5), + +(30, 'A', 1), (30, 'A', 2), (30, 'A', 3), (30, 'A', 4), (30, 'A', 5), +(30, 'B', 1), (30, 'B', 2), (30, 'B', 3), (30, 'B', 4), (30, 'B', 5), +(30, 'C', 1), (30, 'C', 2), (30, 'C', 3), (30, 'C', 4), (30, 'C', 5), +(30, 'D', 1), (30, 'D', 2), (30, 'D', 3), (30, 'D', 4), (30, 'D', 5), +(30, 'E', 1), (30, 'E', 2), (30, 'E', 3), (30, 'E', 4), (30, 'E', 5), + +INSERT INTO seat (theater_id, seat_row, seat_column) VALUES +(31, 'A', 1), (31, 'A', 2), (31, 'A', 3), (31, 'A', 4), (31, 'A', 5), +(31, 'B', 1), (31, 'B', 2), (31, 'B', 3), (31, 'B', 4), (31, 'B', 5), +(31, 'C', 1), (31, 'C', 2), (31, 'C', 3), (31, 'C', 4), (31, 'C', 5), +(31, 'D', 1), (31, 'D', 2), (31, 'D', 3), (31, 'D', 4), (31, 'D', 5), +(31, 'E', 1), (31, 'E', 2), (31, 'E', 3), (31, 'E', 4), (31, 'E', 5), + +(32, 'A', 1), (32, 'A', 2), (32, 'A', 3), (32, 'A', 4), (32, 'A', 5), +(32, 'B', 1), (32, 'B', 2), (32, 'B', 3), (32, 'B', 4), (32, 'B', 5), +(32, 'C', 1), (32, 'C', 2), (32, 'C', 3), (32, 'C', 4), (32, 'C', 5), +(32, 'D', 1), (32, 'D', 2), (32, 'D', 3), (32, 'D', 4), (32, 'D', 5), +(32, 'E', 1), (32, 'E', 2), (32, 'E', 3), (32, 'E', 4), (32, 'E', 5), + +(33, 'A', 1), (33, 'A', 2), (33, 'A', 3), (33, 'A', 4), (33, 'A', 5), +(33, 'B', 1), (33, 'B', 2), (33, 'B', 3), (33, 'B', 4), (33, 'B', 5), +(33, 'C', 1), (33, 'C', 2), (33, 'C', 3), (33, 'C', 4), (33, 'C', 5), +(33, 'D', 1), (33, 'D', 2), (33, 'D', 3), (33, 'D', 4), (33, 'D', 5), +(33, 'E', 1), (33, 'E', 2), (33, 'E', 3), (33, 'E', 4), (33, 'E', 5), + +(34, 'A', 1), (34, 'A', 2), (34, 'A', 3), (34, 'A', 4), (34, 'A', 5), +(34, 'B', 1), (34, 'B', 2), (34, 'B', 3), (34, 'B', 4), (34, 'B', 5), +(34, 'C', 1), (34, 'C', 2), (34, 'C', 3), (34, 'C', 4), (34, 'C', 5), +(34, 'D', 1), (34, 'D', 2), (34, 'D', 3), (34, 'D', 4), (34, 'D', 5), +(34, 'E', 1), (34, 'E', 2), (34, 'E', 3), (34, 'E', 4), (34, 'E', 5), + +(35, 'A', 1), (35, 'A', 2), (35, 'A', 3), (35, 'A', 4), (35, 'A', 5), +(35, 'B', 1), (35, 'B', 2), (35, 'B', 3), (35, 'B', 4), (35, 'B', 5), +(35, 'C', 1), (35, 'C', 2), (35, 'C', 3), (35, 'C', 4), (35, 'C', 5), +(35, 'D', 1), (35, 'D', 2), (35, 'D', 3), (35, 'D', 4), (35, 'D', 5), +(35, 'E', 1), (35, 'E', 2), (35, 'E', 3), (35, 'E', 4), (35, 'E', 5), + +(36, 'A', 1), (36, 'A', 2), (36, 'A', 3), (36, 'A', 4), (36, 'A', 5), +(36, 'B', 1), (36, 'B', 2), (36, 'B', 3), (36, 'B', 4), (36, 'B', 5), +(36, 'C', 1), (36, 'C', 2), (36, 'C', 3), (36, 'C', 4), (36, 'C', 5), +(36, 'D', 1), (36, 'D', 2), (36, 'D', 3), (36, 'D', 4), (36, 'D', 5), +(36, 'E', 1), (36, 'E', 2), (36, 'E', 3), (36, 'E', 4), (36, 'E', 5), + +(37, 'A', 1), (37, 'A', 2), (37, 'A', 3), (37, 'A', 4), (37, 'A', 5), +(37, 'B', 1), (37, 'B', 2), (37, 'B', 3), (37, 'B', 4), (37, 'B', 5), +(37, 'C', 1), (37, 'C', 2), (37, 'C', 3), (37, 'C', 4), (37, 'C', 5), +(37, 'D', 1), (37, 'D', 2), (37, 'D', 3), (37, 'D', 4), (37, 'D', 5), +(37, 'E', 1), (37, 'E', 2), (37, 'E', 3), (37, 'E', 4), (37, 'E', 5), + +(38, 'A', 1), (38, 'A', 2), (38, 'A', 3), (38, 'A', 4), (38, 'A', 5), +(38, 'B', 1), (38, 'B', 2), (38, 'B', 3), (38, 'B', 4), (38, 'B', 5), +(38, 'C', 1), (38, 'C', 2), (38, 'C', 3), (38, 'C', 4), (38, 'C', 5), +(38, 'D', 1), (38, 'D', 2), (38, 'D', 3), (38, 'D', 4), (38, 'D', 5), +(38, 'E', 1), (38, 'E', 2), (38, 'E', 3), (38, 'E', 4), (38, 'E', 5), + +(39, 'A', 1), (39, 'A', 2), (39, 'A', 3), (39, 'A', 4), (39, 'A', 5), +(39, 'B', 1), (39, 'B', 2), (39, 'B', 3), (39, 'B', 4), (39, 'B', 5), +(39, 'C', 1), (39, 'C', 2), (39, 'C', 3), (39, 'C', 4), (39, 'C', 5), +(39, 'D', 1), (39, 'D', 2), (39, 'D', 3), (39, 'D', 4), (39, 'D', 5), +(39, 'E', 1), (39, 'E', 2), (39, 'E', 3), (39, 'E', 4), (39, 'E', 5), + +(40, 'A', 1), (40, 'A', 2), (40, 'A', 3), (40, 'A', 4), (40, 'A', 5), +(40, 'B', 1), (40, 'B', 2), (40, 'B', 3), (40, 'B', 4), (40, 'B', 5), +(40, 'C', 1), (40, 'C', 2), (40, 'C', 3), (40, 'C', 4), (40, 'C', 5), +(40, 'D', 1), (40, 'D', 2), (40, 'D', 3), (40, 'D', 4), (40, 'D', 5), +(40, 'E', 1), (40, 'E', 2), (40, 'E', 3), (40, 'E', 4), (40, 'E', 5); + + +INSERT INTO seat (theater_id, seat_row, seat_column) VALUES +(41, 'A', 1), (41, 'A', 2), (41, 'A', 3), (41, 'A', 4), (41, 'A', 5), +(41, 'B', 1), (41, 'B', 2), (41, 'B', 3), (41, 'B', 4), (41, 'B', 5), +(41, 'C', 1), (41, 'C', 2), (41, 'C', 3), (41, 'C', 4), (41, 'C', 5), +(41, 'D', 1), (41, 'D', 2), (41, 'D', 3), (41, 'D', 4), (41, 'D', 5), +(41, 'E', 1), (41, 'E', 2), (41, 'E', 3), (41, 'E', 4), (41, 'E', 5), + +(42, 'A', 1), (42, 'A', 2), (42, 'A', 3), (42, 'A', 4), (42, 'A', 5), +(42, 'B', 1), (42, 'B', 2), (42, 'B', 3), (42, 'B', 4), (42, 'B', 5), +(42, 'C', 1), (42, 'C', 2), (42, 'C', 3), (42, 'C', 4), (42, 'C', 5), +(42, 'D', 1), (42, 'D', 2), (42, 'D', 3), (42, 'D', 4), (42, 'D', 5), +(42, 'E', 1), (42, 'E', 2), (42, 'E', 3), (42, 'E', 4), (42, 'E', 5), + +(43, 'A', 1), (43, 'A', 2), (43, 'A', 3), (43, 'A', 4), (43, 'A', 5), +(43, 'B', 1), (43, 'B', 2), (43, 'B', 3), (43, 'B', 4), (43, 'B', 5), +(43, 'C', 1), (43, 'C', 2), (43, 'C', 3), (43, 'C', 4), (43, 'C', 5), +(43, 'D', 1), (43, 'D', 2), (43, 'D', 3), (43, 'D', 4), (43, 'D', 5), +(43, 'E', 1), (43, 'E', 2), (43, 'E', 3), (43, 'E', 4), (43, 'E', 5), + +(44, 'A', 1), (44, 'A', 2), (44, 'A', 3), (44, 'A', 4), (44, 'A', 5), +(44, 'B', 1), (44, 'B', 2), (44, 'B', 3), (44, 'B', 4), (44, 'B', 5), +(44, 'C', 1), (44, 'C', 2), (44, 'C', 3), (44, 'C', 4), (44, 'C', 5), +(44, 'D', 1), (44, 'D', 2), (44, 'D', 3), (44, 'D', 4), (44, 'D', 5), +(44, 'E', 1), (44, 'E', 2), (44, 'E', 3), (44, 'E', 4), (44, 'E', 5), + +(45, 'A', 1), (45, 'A', 2), (45, 'A', 3), (45, 'A', 4), (45, 'A', 5), +(45, 'B', 1), (45, 'B', 2), (45, 'B', 3), (45, 'B', 4), (45, 'B', 5), +(45, 'C', 1), (45, 'C', 2), (45, 'C', 3), (45, 'C', 4), (45, 'C', 5), +(45, 'D', 1), (45, 'D', 2), (45, 'D', 3), (45, 'D', 4), (45, 'D', 5), +(45, 'E', 1), (45, 'E', 2), (45, 'E', 3), (45, 'E', 4), (45, 'E', 5); + +INSERT INTO seat (theater_id, seat_row, seat_column) VALUES +(46, 'A', 1), (46, 'A', 2), (46, 'A', 3), (46, 'A', 4), (46, 'A', 5), +(46, 'B', 1), (46, 'B', 2), (46, 'B', 3), (46, 'B', 4), (46, 'B', 5), +(46, 'C', 1), (46, 'C', 2), (46, 'C', 3), (46, 'C', 4), (46, 'C', 5), +(46, 'D', 1), (46, 'D', 2), (46, 'D', 3), (46, 'D', 4), (46, 'D', 5), +(46, 'E', 1), (46, 'E', 2), (46, 'E', 3), (46, 'E', 4), (46, 'E', 5), + +(47, 'A', 1), (47, 'A', 2), (47, 'A', 3), (47, 'A', 4), (47, 'A', 5), +(47, 'B', 1), (47, 'B', 2), (47, 'B', 3), (47, 'B', 4), (47, 'B', 5), +(47, 'C', 1), (47, 'C', 2), (47, 'C', 3), (47, 'C', 4), (47, 'C', 5), +(47, 'D', 1), (47, 'D', 2), (47, 'D', 3), (47, 'D', 4), (47, 'D', 5), +(47, 'E', 1), (47, 'E', 2), (47, 'E', 3), (47, 'E', 4), (47, 'E', 5), + +(48, 'A', 1), (48, 'A', 2), (48, 'A', 3), (48, 'A', 4), (48, 'A', 5), +(48, 'B', 1), (48, 'B', 2), (48, 'B', 3), (48, 'B', 4), (48, 'B', 5), +(48, 'C', 1), (48, 'C', 2), (48, 'C', 3), (48, 'C', 4), (48, 'C', 5), +(48, 'D', 1), (48, 'D', 2), (48, 'D', 3), (48, 'D', 4), (48, 'D', 5), +(48, 'E', 1), (48, 'E', 2), (48, 'E', 3), (48, 'E', 4), (48, 'E', 5), + +(49, 'A', 1), (49, 'A', 2), (49, 'A', 3), (49, 'A', 4), (49, 'A', 5), +(49, 'B', 1), (49, 'B', 2), (49, 'B', 3), (49, 'B', 4), (49, 'B', 5), +(49, 'C', 1), (49, 'C', 2), (49, 'C', 3), (49, 'C', 4), (49, 'C', 5), +(49, 'D', 1), (49, 'D', 2), (49, 'D', 3), (49, 'D', 4), (49, 'D', 5), +(49, 'E', 1), (49, 'E', 2), (49, 'E', 3), (49, 'E', 4), (49, 'E', 5), + +(50, 'A', 1), (50, 'A', 2), (50, 'A', 3), (50, 'A', 4), (50, 'A', 5), +(50, 'B', 1), (50, 'B', 2), (50, 'B', 3), (50, 'B', 4), (50, 'B', 5), +(50, 'C', 1), (50, 'C', 2), (50, 'C', 3), (50, 'C', 4), (50, 'C', 5), +(50, 'D', 1), (50, 'D', 2), (50, 'D', 3), (50, 'D', 4), (50, 'D', 5), +(50, 'E', 1), (50, 'E', 2), (50, 'E', 3), (50, 'E', 4), (50, 'E', 5); + +INSERT INTO seat (theater_id, seat_row, seat_column) VALUES +(51, 'A', 1), (51, 'A', 2), (51, 'A', 3), (51, 'A', 4), (51, 'A', 5), +(51, 'B', 1), (51, 'B', 2), (51, 'B', 3), (51, 'B', 4), (51, 'B', 5), +(51, 'C', 1), (51, 'C', 2), (51, 'C', 3), (51, 'C', 4), (51, 'C', 5), +(51, 'D', 1), (51, 'D', 2), (51, 'D', 3), (51, 'D', 4), (51, 'D', 5), +(51, 'E', 1), (51, 'E', 2), (51, 'E', 3), (51, 'E', 4), (51, 'E', 5), + +(52, 'A', 1), (52, 'A', 2), (52, 'A', 3), (52, 'A', 4), (52, 'A', 5), +(52, 'B', 1), (52, 'B', 2), (52, 'B', 3), (52, 'B', 4), (52, 'B', 5), +(52, 'C', 1), (52, 'C', 2), (52, 'C', 3), (52, 'C', 4), (52, 'C', 5), +(52, 'D', 1), (52, 'D', 2), (52, 'D', 3), (52, 'D', 4), (52, 'D', 5), +(52, 'E', 1), (52, 'E', 2), (52, 'E', 3), (52, 'E', 4), (52, 'E', 5), + +(53, 'A', 1), (53, 'A', 2), (53, 'A', 3), (53, 'A', 4), (53, 'A', 5), +(53, 'B', 1), (53, 'B', 2), (53, 'B', 3), (53, 'B', 4), (53, 'B', 5), +(53, 'C', 1), (53, 'C', 2), (53, 'C', 3), (53, 'C', 4), (53, 'C', 5), +(53, 'D', 1), (53, 'D', 2), (53, 'D', 3), (53, 'D', 4), (53, 'D', 5), +(53, 'E', 1), (53, 'E', 2), (53, 'E', 3), (53, 'E', 4), (53, 'E', 5), + +(54, 'A', 1), (54, 'A', 2), (54, 'A', 3), (54, 'A', 4), (54, 'A', 5), +(54, 'B', 1), (54, 'B', 2), (54, 'B', 3), (54, 'B', 4), (54, 'B', 5), +(54, 'C', 1), (54, 'C', 2), (54, 'C', 3), (54, 'C', 4), (54, 'C', 5), +(54, 'D', 1), (54, 'D', 2), (54, 'D', 3), (54, 'D', 4), (54, 'D', 5), +(54, 'E', 1), (54, 'E', 2), (54, 'E', 3), (54, 'E', 4), (54, 'E', 5), + +(55, 'A', 1), (55, 'A', 2), (55, 'A', 3), (55, 'A', 4), (55, 'A', 5), +(55, 'B', 1), (55, 'B', 2), (55, 'B', 3), (55, 'B', 4), (55, 'B', 5), +(55, 'C', 1), (55, 'C', 2), (55, 'C', 3), (55, 'C', 4), (55, 'C', 5), +(55, 'D', 1), (55, 'D', 2), (55, 'D', 3), (55, 'D', 4), (55, 'D', 5), +(55, 'E', 1), (55, 'E', 2), (55, 'E', 3), (55, 'E', 4), (55, 'E', 5), + +(56, 'A', 1), (56, 'A', 2), (56, 'A', 3), (56, 'A', 4), (56, 'A', 5), +(56, 'B', 1), (56, 'B', 2), (56, 'B', 3), (56, 'B', 4), (56, 'B', 5), +(56, 'C', 1), (56, 'C', 2), (56, 'C', 3), (56, 'C', 4), (56, 'C', 5), +(56, 'D', 1), (56, 'D', 2), (56, 'D', 3), (56, 'D', 4), (56, 'D', 5), +(56, 'E', 1), (56, 'E', 2), (56, 'E', 3), (56, 'E', 4), (56, 'E', 5), + +(57, 'A', 1), (57, 'A', 2), (57, 'A', 3), (57, 'A', 4), (57, 'A', 5), +(57, 'B', 1), (57, 'B', 2), (57, 'B', 3), (57, 'B', 4), (57, 'B', 5), +(57, 'C', 1), (57, 'C', 2), (57, 'C', 3), (57, 'C', 4), (57, 'C', 5), +(57, 'D', 1), (57, 'D', 2), (57, 'D', 3), (57, 'D', 4), (57, 'D', 5), +(57, 'E', 1), (57, 'E', 2), (57, 'E', 3), (57, 'E', 4), (57, 'E', 5), + +(58, 'A', 1), (58, 'A', 2), (58, 'A', 3), (58, 'A', 4), (58, 'A', 5), +(58, 'B', 1), (58, 'B', 2), (58, 'B', 3), (58, 'B', 4), (58, 'B', 5), +(58, 'C', 1), (58, 'C', 2), (58, 'C', 3), (58, 'C', 4), (58, 'C', 5), +(58, 'D', 1), (58, 'D', 2), (58, 'D', 3), (58, 'D', 4), (58, 'D', 5), +(58, 'E', 1), (58, 'E', 2), (58, 'E', 3), (58, 'E', 4), (58, 'E', 5), + +(59, 'A', 1), (59, 'A', 2), (59, 'A', 3), (59, 'A', 4), (59, 'A', 5), +(59, 'B', 1), (59, 'B', 2), (59, 'B', 3), (59, 'B', 4), (59, 'B', 5), +(59, 'C', 1), (59, 'C', 2), (59, 'C', 3), (59, 'C', 4), (59, 'C', 5), +(59, 'D', 1), (59, 'D', 2), (59, 'D', 3), (59, 'D', 4), (59, 'D', 5), +(59, 'E', 1), (59, 'E', 2), (59, 'E', 3), (59, 'E', 4), (59, 'E', 5), + +(60, 'A', 1), (60, 'A', 2), (60, 'A', 3), (60, 'A', 4), (60, 'A', 5), +(60, 'B', 1), (60, 'B', 2), (60, 'B', 3), (60, 'B', 4), (60, 'B', 5), +(60, 'C', 1), (60, 'C', 2), (60, 'C', 3), (60, 'C', 4), (60, 'C', 5), +(60, 'D', 1), (60, 'D', 2), (60, 'D', 3), (60, 'D', 4), (60, 'D', 5), +(60, 'E', 1), (60, 'E', 2), (60, 'E', 3), (60, 'E', 4), (60, 'E', 5); + +INSERT INTO seat (theater_id, seat_row, seat_column) VALUES +(61, 'A', 1), (61, 'A', 2), (61, 'A', 3), (61, 'A', 4), (61, 'A', 5), +(61, 'B', 1), (61, 'B', 2), (61, 'B', 3), (61, 'B', 4), (61, 'B', 5), +(61, 'C', 1), (61, 'C', 2), (61, 'C', 3), (61, 'C', 4), (61, 'C', 5), +(61, 'D', 1), (61, 'D', 2), (61, 'D', 3), (61, 'D', 4), (61, 'D', 5), +(61, 'E', 1), (61, 'E', 2), (61, 'E', 3), (61, 'E', 4), (61, 'E', 5), + +(62, 'A', 1), (62, 'A', 2), (62, 'A', 3), (62, 'A', 4), (62, 'A', 5), +(62, 'B', 1), (62, 'B', 2), (62, 'B', 3), (62, 'B', 4), (62, 'B', 5), +(62, 'C', 1), (62, 'C', 2), (62, 'C', 3), (62, 'C', 4), (62, 'C', 5), +(62, 'D', 1), (62, 'D', 2), (62, 'D', 3), (62, 'D', 4), (62, 'D', 5), +(62, 'E', 1), (62, 'E', 2), (62, 'E', 3), (62, 'E', 4), (62, 'E', 5), + +(63, 'A', 1), (63, 'A', 2), (63, 'A', 3), (63, 'A', 4), (63, 'A', 5), +(63, 'B', 1), (63, 'B', 2), (63, 'B', 3), (63, 'B', 4), (63, 'B', 5), +(63, 'C', 1), (63, 'C', 2), (63, 'C', 3), (63, 'C', 4), (63, 'C', 5), +(63, 'D', 1), (63, 'D', 2), (63, 'D', 3), (63, 'D', 4), (63, 'D', 5), +(63, 'E', 1), (63, 'E', 2), (63, 'E', 3), (63, 'E', 4), (63, 'E', 5), + +(64, 'A', 1), (64, 'A', 2), (64, 'A', 3), (64, 'A', 4), (64, 'A', 5), +(64, 'B', 1), (64, 'B', 2), (64, 'B', 3), (64, 'B', 4), (64, 'B', 5), +(64, 'C', 1), (64, 'C', 2), (64, 'C', 3), (64, 'C', 4), (64, 'C', 5), +(64, 'D', 1), (64, 'D', 2), (64, 'D', 3), (64, 'D', 4), (64, 'D', 5), +(64, 'E', 1), (64, 'E', 2), (64, 'E', 3), (64, 'E', 4), (64, 'E', 5), + +(65, 'A', 1), (65, 'A', 2), (65, 'A', 3), (65, 'A', 4), (65, 'A', 5), +(65, 'B', 1), (65, 'B', 2), (65, 'B', 3), (65, 'B', 4), (65, 'B', 5), +(65, 'C', 1), (65, 'C', 2), (65, 'C', 3), (65, 'C', 4), (65, 'C', 5), +(65, 'D', 1), (65, 'D', 2), (65, 'D', 3), (65, 'D', 4), (65, 'D', 5), +(65, 'E', 1), (65, 'E', 2), (65, 'E', 3), (65, 'E', 4), (65, 'E', 5), + +(66, 'A', 1), (66, 'A', 2), (66, 'A', 3), (66, 'A', 4), (66, 'A', 5), +(66, 'B', 1), (66, 'B', 2), (66, 'B', 3), (66, 'B', 4), (66, 'B', 5), +(66, 'C', 1), (66, 'C', 2), (66, 'C', 3), (66, 'C', 4), (66, 'C', 5), +(66, 'D', 1), (66, 'D', 2), (66, 'D', 3), (66, 'D', 4), (66, 'D', 5), +(66, 'E', 1), (66, 'E', 2), (66, 'E', 3), (66, 'E', 4), (66, 'E', 5), + +(67, 'A', 1), (67, 'A', 2), (67, 'A', 3), (67, 'A', 4), (67, 'A', 5), +(67, 'B', 1), (67, 'B', 2), (67, 'B', 3), (67, 'B', 4), (67, 'B', 5), +(67, 'C', 1), (67, 'C', 2), (67, 'C', 3), (67, 'C', 4), (67, 'C', 5), +(67, 'D', 1), (67, 'D', 2), (67, 'D', 3), (67, 'D', 4), (67, 'D', 5), +(67, 'E', 1), (67, 'E', 2), (67, 'E', 3), (67, 'E', 4), (67, 'E', 5), + +(68, 'A', 1), (68, 'A', 2), (68, 'A', 3), (68, 'A', 4), (68, 'A', 5), +(68, 'B', 1), (68, 'B', 2), (68, 'B', 3), (68, 'B', 4), (68, 'B', 5), +(68, 'C', 1), (68, 'C', 2), (68, 'C', 3), (68, 'C', 4), (68, 'C', 5), +(68, 'D', 1), (68, 'D', 2), (68, 'D', 3), (68, 'D', 4), (68, 'D', 5), +(68, 'E', 1), (68, 'E', 2), (68, 'E', 3), (68, 'E', 4), (68, 'E', 5), + +(69, 'A', 1), (69, 'A', 2), (69, 'A', 3), (69, 'A', 4), (69, 'A', 5), +(69, 'B', 1), (69, 'B', 2), (69, 'B', 3), (69, 'B', 4), (69, 'B', 5), +(69, 'C', 1), (69, 'C', 2), (69, 'C', 3), (69, 'C', 4), (69, 'C', 5), +(69, 'D', 1), (69, 'D', 2), (69, 'D', 3), (69, 'D', 4), (69, 'D', 5), +(69, 'E', 1), (69, 'E', 2), (69, 'E', 3), (69, 'E', 4), (69, 'E', 5), + +(70, 'A', 1), (70, 'A', 2), (70, 'A', 3), (70, 'A', 4), (70, 'A', 5), +(70, 'B', 1), (70, 'B', 2), (70, 'B', 3), (70, 'B', 4), (70, 'B', 5), +(70, 'C', 1), (70, 'C', 2), (70, 'C', 3), (70, 'C', 4), (70, 'C', 5), +(70, 'D', 1), (70, 'D', 2), (70, 'D', 3), (70, 'D', 4), (70, 'D', 5), +(70, 'E', 1), (70, 'E', 2), (70, 'E', 3), (70, 'E', 4), (70, 'E', 5); + +INSERT INTO seat (theater_id, seat_row, seat_column) VALUES +(71, 'A', 1), (71, 'A', 2), (71, 'A', 3), (71, 'A', 4), (71, 'A', 5), +(71, 'B', 1), (71, 'B', 2), (71, 'B', 3), (71, 'B', 4), (71, 'B', 5), +(71, 'C', 1), (71, 'C', 2), (71, 'C', 3), (71, 'C', 4), (71, 'C', 5), +(71, 'D', 1), (71, 'D', 2), (71, 'D', 3), (71, 'D', 4), (71, 'D', 5), +(71, 'E', 1), (71, 'E', 2), (71, 'E', 3), (71, 'E', 4), (71, 'E', 5), + +(72, 'A', 1), (72, 'A', 2), (72, 'A', 3), (72, 'A', 4), (72, 'A', 5), +(72, 'B', 1), (72, 'B', 2), (72, 'B', 3), (72, 'B', 4), (72, 'B', 5), +(72, 'C', 1), (72, 'C', 2), (72, 'C', 3), (72, 'C', 4), (72, 'C', 5), +(72, 'D', 1), (72, 'D', 2), (72, 'D', 3), (72, 'D', 4), (72, 'D', 5), +(72, 'E', 1), (72, 'E', 2), (72, 'E', 3), (72, 'E', 4), (72, 'E', 5), + +(73, 'A', 1), (73, 'A', 2), (73, 'A', 3), (73, 'A', 4), (73, 'A', 5), +(73, 'B', 1), (73, 'B', 2), (73, 'B', 3), (73, 'B', 4), (73, 'B', 5), +(73, 'C', 1), (73, 'C', 2), (73, 'C', 3), (73, 'C', 4), (73, 'C', 5), +(73, 'D', 1), (73, 'D', 2), (73, 'D', 3), (73, 'D', 4), (73, 'D', 5), +(73, 'E', 1), (73, 'E', 2), (73, 'E', 3), (73, 'E', 4), (73, 'E', 5), + +(74, 'A', 1), (74, 'A', 2), (74, 'A', 3), (74, 'A', 4), (74, 'A', 5), +(74, 'B', 1), (74, 'B', 2), (74, 'B', 3), (74, 'B', 4), (74, 'B', 5), +(74, 'C', 1), (74, 'C', 2), (74, 'C', 3), (74, 'C', 4), (74, 'C', 5), +(74, 'D', 1), (74, 'D', 2), (74, 'D', 3), (74, 'D', 4), (74, 'D', 5), +(74, 'E', 1), (74, 'E', 2), (74, 'E', 3), (74, 'E', 4), (74, 'E', 5), + +(75, 'A', 1), (75, 'A', 2), (75, 'A', 3), (75, 'A', 4), (75, 'A', 5), +(75, 'B', 1), (75, 'B', 2), (75, 'B', 3), (75, 'B', 4), (75, 'B', 5), +(75, 'C', 1), (75, 'C', 2), (75, 'C', 3), (75, 'C', 4), (75, 'C', 5), +(75, 'D', 1), (75, 'D', 2), (75, 'D', 3), (75, 'D', 4), (75, 'D', 5), +(75, 'E', 1), (75, 'E', 2), (75, 'E', 3), (75, 'E', 4), (75, 'E', 5), + +(76, 'A', 1), (76, 'A', 2), (76, 'A', 3), (76, 'A', 4), (76, 'A', 5), +(76, 'B', 1), (76, 'B', 2), (76, 'B', 3), (76, 'B', 4), (76, 'B', 5), +(76, 'C', 1), (76, 'C', 2), (76, 'C', 3), (76, 'C', 4), (76, 'C', 5), +(76, 'D', 1), (76, 'D', 2), (76, 'D', 3), (76, 'D', 4), (76, 'D', 5), +(76, 'E', 1), (76, 'E', 2), (76, 'E', 3), (76, 'E', 4), (76, 'E', 5), + +(77, 'A', 1), (77, 'A', 2), (77, 'A', 3), (77, 'A', 4), (77, 'A', 5), +(77, 'B', 1), (77, 'B', 2), (77, 'B', 3), (77, 'B', 4), (77, 'B', 5), +(77, 'C', 1), (77, 'C', 2), (77, 'C', 3), (77, 'C', 4), (77, 'C', 5), +(77, 'D', 1), (77, 'D', 2), (77, 'D', 3), (77, 'D', 4), (77, 'D', 5), +(77, 'E', 1), (77, 'E', 2), (77, 'E', 3), (77, 'E', 4), (77, 'E', 5), + +(78, 'A', 1), (78, 'A', 2), (78, 'A', 3), (78, 'A', 4), (78, 'A', 5), +(78, 'B', 1), (78, 'B', 2), (78, 'B', 3), (78, 'B', 4), (78, 'B', 5), +(78, 'C', 1), (78, 'C', 2), (78, 'C', 3), (78, 'C', 4), (78, 'C', 5), +(78, 'D', 1), (78, 'D', 2), (78, 'D', 3), (78, 'D', 4), (78, 'D', 5), +(78, 'E', 1), (78, 'E', 2), (78, 'E', 3), (78, 'E', 4), (78, 'E', 5), + +(79, 'A', 1), (79, 'A', 2), (79, 'A', 3), (79, 'A', 4), (79, 'A', 5), +(79, 'B', 1), (79, 'B', 2), (79, 'B', 3), (79, 'B', 4), (79, 'B', 5), +(79, 'C', 1), (79, 'C', 2), (79, 'C', 3), (79, 'C', 4), (79, 'C', 5), +(79, 'D', 1), (79, 'D', 2), (79, 'D', 3), (79, 'D', 4), (79, 'D', 5), +(79, 'E', 1), (79, 'E', 2), (79, 'E', 3), (79, 'E', 4), (79, 'E', 5), + +(80, 'A', 1), (80, 'A', 2), (80, 'A', 3), (80, 'A', 4), (80, 'A', 5), +(80, 'B', 1), (80, 'B', 2), (80, 'B', 3), (80, 'B', 4), (80, 'B', 5), +(80, 'C', 1), (80, 'C', 2), (80, 'C', 3), (80, 'C', 4), (80, 'C', 5), +(80, 'D', 1), (80, 'D', 2), (80, 'D', 3), (80, 'D', 4), (80, 'D', 5), +(80, 'E', 1), (80, 'E', 2), (80, 'E', 3), (80, 'E', 4), (80, 'E', 5); \ No newline at end of file diff --git a/init-scripts/ddl.sql b/init-scripts/ddl.sql deleted file mode 100644 index e69de29bb..000000000 From 5e0396e33ed76dee8af5d2d8bb9022b31fda1a89 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 03:55:13 +0900 Subject: [PATCH 17/30] feat: add auditing --- module-api/src/main/java/hellojpa/Main.java | 12 +++++++ .../src/main/java/hellojpa/BaseEntity.java | 33 +++++++++++++++++++ .../src/main/java/hellojpa/domain/Genre.java | 3 +- .../src/main/java/hellojpa/domain/Movie.java | 3 +- .../main/java/hellojpa/domain/Screening.java | 3 +- .../src/main/java/hellojpa/domain/Seat.java | 3 +- .../main/java/hellojpa/domain/Theater.java | 3 +- 7 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 module-common/src/main/java/hellojpa/BaseEntity.java diff --git a/module-api/src/main/java/hellojpa/Main.java b/module-api/src/main/java/hellojpa/Main.java index b400ab0a2..46fee13ce 100644 --- a/module-api/src/main/java/hellojpa/Main.java +++ b/module-api/src/main/java/hellojpa/Main.java @@ -2,10 +2,22 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.data.domain.AuditorAware; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import java.util.Optional; +import java.util.UUID; + +@EnableJpaAuditing @SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); } + + @Bean + public AuditorAware auditorProvider() { + return () -> Optional.of(UUID.randomUUID().toString()); + } } \ No newline at end of file diff --git a/module-common/src/main/java/hellojpa/BaseEntity.java b/module-common/src/main/java/hellojpa/BaseEntity.java new file mode 100644 index 000000000..2a87b9f05 --- /dev/null +++ b/module-common/src/main/java/hellojpa/BaseEntity.java @@ -0,0 +1,33 @@ +package hellojpa; + +import jakarta.persistence.Column; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.MappedSuperclass; +import lombok.Getter; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@EntityListeners(AuditingEntityListener.class) +@MappedSuperclass +@Getter +public class BaseEntity { + + @CreatedDate + @Column(updatable = false) + private LocalDateTime createdDate; + + @LastModifiedDate + private LocalDateTime lastModifiedDate; + + @CreatedBy + @Column(updatable = false) + private String createdBy; + + @LastModifiedBy + private String lastModifiedBy; +} diff --git a/module-movie/src/main/java/hellojpa/domain/Genre.java b/module-movie/src/main/java/hellojpa/domain/Genre.java index d211df072..07d249b48 100644 --- a/module-movie/src/main/java/hellojpa/domain/Genre.java +++ b/module-movie/src/main/java/hellojpa/domain/Genre.java @@ -1,11 +1,12 @@ package hellojpa.domain; +import hellojpa.BaseEntity; import jakarta.persistence.*; import lombok.Getter; @Entity @Getter -public class Genre { +public class Genre extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/module-movie/src/main/java/hellojpa/domain/Movie.java b/module-movie/src/main/java/hellojpa/domain/Movie.java index 3c523c40d..a7150797b 100644 --- a/module-movie/src/main/java/hellojpa/domain/Movie.java +++ b/module-movie/src/main/java/hellojpa/domain/Movie.java @@ -1,5 +1,6 @@ package hellojpa.domain; +import hellojpa.BaseEntity; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Getter; @@ -11,7 +12,7 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class Movie { +public class Movie extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/module-screening/src/main/java/hellojpa/domain/Screening.java b/module-screening/src/main/java/hellojpa/domain/Screening.java index a6906e7ea..6dc1c95e5 100644 --- a/module-screening/src/main/java/hellojpa/domain/Screening.java +++ b/module-screening/src/main/java/hellojpa/domain/Screening.java @@ -1,5 +1,6 @@ package hellojpa.domain; +import hellojpa.BaseEntity; import jakarta.persistence.*; import lombok.Getter; @@ -7,7 +8,7 @@ @Entity @Getter -public class Screening { +public class Screening extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/module-theater/src/main/java/hellojpa/domain/Seat.java b/module-theater/src/main/java/hellojpa/domain/Seat.java index 257679293..44a297ad1 100644 --- a/module-theater/src/main/java/hellojpa/domain/Seat.java +++ b/module-theater/src/main/java/hellojpa/domain/Seat.java @@ -1,11 +1,12 @@ package hellojpa.domain; +import hellojpa.BaseEntity; import jakarta.persistence.*; import lombok.Getter; @Entity @Getter -public class Seat { +public class Seat extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/module-theater/src/main/java/hellojpa/domain/Theater.java b/module-theater/src/main/java/hellojpa/domain/Theater.java index d07fef313..7af2a35fc 100644 --- a/module-theater/src/main/java/hellojpa/domain/Theater.java +++ b/module-theater/src/main/java/hellojpa/domain/Theater.java @@ -1,5 +1,6 @@ package hellojpa.domain; +import hellojpa.BaseEntity; import jakarta.persistence.*; import lombok.Getter; @@ -8,7 +9,7 @@ @Entity @Getter -public class Theater { +public class Theater extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) From 267b3d27cfa80a9d3d7f15505902e0d3ebf0bfd6 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 22:51:45 +0900 Subject: [PATCH 18/30] feat: add length constraint --- module-movie/src/main/java/hellojpa/domain/Genre.java | 2 +- module-movie/src/main/java/hellojpa/domain/Movie.java | 2 +- module-theater/src/main/java/hellojpa/domain/Theater.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/module-movie/src/main/java/hellojpa/domain/Genre.java b/module-movie/src/main/java/hellojpa/domain/Genre.java index 07d249b48..4b8fe14f6 100644 --- a/module-movie/src/main/java/hellojpa/domain/Genre.java +++ b/module-movie/src/main/java/hellojpa/domain/Genre.java @@ -13,6 +13,6 @@ public class Genre extends BaseEntity { @Column(name = "genre_id") private Long id; - @Column(nullable = false, unique = true) + @Column(nullable = false, unique = true, length = 10) private String name; // 장르 이름 } diff --git a/module-movie/src/main/java/hellojpa/domain/Movie.java b/module-movie/src/main/java/hellojpa/domain/Movie.java index a7150797b..2b4ab2fe6 100644 --- a/module-movie/src/main/java/hellojpa/domain/Movie.java +++ b/module-movie/src/main/java/hellojpa/domain/Movie.java @@ -19,7 +19,7 @@ public class Movie extends BaseEntity { @Column(name = "movie_id") private Long id; - @Column(nullable = false, unique = true) + @Column(nullable = false, unique = true, length = 50) private String title; // 영화 제목 @Enumerated(EnumType.STRING) diff --git a/module-theater/src/main/java/hellojpa/domain/Theater.java b/module-theater/src/main/java/hellojpa/domain/Theater.java index 7af2a35fc..78d877387 100644 --- a/module-theater/src/main/java/hellojpa/domain/Theater.java +++ b/module-theater/src/main/java/hellojpa/domain/Theater.java @@ -16,7 +16,7 @@ public class Theater extends BaseEntity { @Column(name = "theater_id") private Long id; - @Column(nullable = false, unique = true) + @Column(nullable = false, unique = true, length = 20) private String name; // 상영관 이름 @OneToMany(mappedBy = "theater", cascade = CascadeType.ALL, orphanRemoval = true) From 2cd585df24bb24f76b978dbeef3404fd5cb727f3 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 23:06:19 +0900 Subject: [PATCH 19/30] chore: remove unused dependencies --- module-api/build.gradle | 2 -- 1 file changed, 2 deletions(-) diff --git a/module-api/build.gradle b/module-api/build.gradle index 11e2dda08..b4a6c0c41 100644 --- a/module-api/build.gradle +++ b/module-api/build.gradle @@ -1,9 +1,7 @@ dependencies { // 모듈 의존성 implementation project(':module-common') - implementation project(':module-theater') implementation project(':module-screening') - implementation project(':module-movie') implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' From f6a2e29a3a6c9c874255e5870b25f4f12ab7e536 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Fri, 10 Jan 2025 23:12:51 +0900 Subject: [PATCH 20/30] test: add api-test.http --- module-api/src/test/resources/http/api-test.http | 1 + 1 file changed, 1 insertion(+) create mode 100644 module-api/src/test/resources/http/api-test.http diff --git a/module-api/src/test/resources/http/api-test.http b/module-api/src/test/resources/http/api-test.http new file mode 100644 index 000000000..d06a61685 --- /dev/null +++ b/module-api/src/test/resources/http/api-test.http @@ -0,0 +1 @@ +GET http://localhost:8080/screening/movies \ No newline at end of file From fc1cb980e81d17eb14842e90a636c4059b1f968a Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Sat, 11 Jan 2025 01:52:42 +0900 Subject: [PATCH 21/30] chore: update data.sql --- init-scripts/data.sql | 55 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/init-scripts/data.sql b/init-scripts/data.sql index b399e3b90..37afa9103 100644 --- a/init-scripts/data.sql +++ b/init-scripts/data.sql @@ -1,3 +1,40 @@ +CREATE TABLE movie ( + movie_id BIGINT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(50) NOT NULL UNIQUE, + rating VARCHAR(255) NOT NULL, + release_date DATE NOT NULL, + thumbnail VARCHAR(255) NOT NULL, + running_time INT NOT NULL, + genre_id BIGINT NOT NULL +)CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +CREATE TABLE genre ( + genre_id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(10) NOT NULL UNIQUE +)CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +CREATE TABLE theater ( + theater_id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(20) NOT NULL UNIQUE +)CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +CREATE TABLE seat ( + seat_id BIGINT AUTO_INCREMENT PRIMARY KEY, + theater_id BIGINT NOT NULL, + seat_row VARCHAR(255) NOT NULL, + seat_column INT NOT NULL, + FOREIGN KEY (theater_id) REFERENCES theater(theater_id) +)CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + +CREATE TABLE screening ( + screening_id BIGINT AUTO_INCREMENT PRIMARY KEY, + movie_id BIGINT NOT NULL, + theater_id BIGINT NOT NULL, + start_time TIME NOT NULL, + FOREIGN KEY (movie_id) REFERENCES movie(movie_id), + FOREIGN KEY (theater_id) REFERENCES theater(theater_id) +)CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + -- Genre 데이터 삽입 INSERT INTO genre (name) VALUES ('Action'), @@ -28,7 +65,7 @@ INSERT INTO theater (name) VALUES ('Theater 17'), ('Theater 18'), ('Theater 19'), -('Theater 20') +('Theater 20'), ('Theater 21'), ('Theater 22'), ('Theater 23'), @@ -38,7 +75,7 @@ INSERT INTO theater (name) VALUES ('Theater 27'), ('Theater 28'), ('Theater 29'), -('Theater 30') +('Theater 30'), ('Theater 31'), ('Theater 32'), ('Theater 33'), @@ -48,7 +85,7 @@ INSERT INTO theater (name) VALUES ('Theater 37'), ('Theater 38'), ('Theater 39'), -('Theater 40') +('Theater 40'), ('Theater 41'), ('Theater 42'), ('Theater 43'), @@ -58,7 +95,7 @@ INSERT INTO theater (name) VALUES ('Theater 47'), ('Theater 48'), ('Theater 49'), -('Theater 50') +('Theater 50'), ('Theater 51'), ('Theater 52'), ('Theater 53'), @@ -68,7 +105,7 @@ INSERT INTO theater (name) VALUES ('Theater 57'), ('Theater 58'), ('Theater 59'), -('Theater 60') +('Theater 60'), ('Theater 61'), ('Theater 62'), ('Theater 63'), @@ -78,7 +115,7 @@ INSERT INTO theater (name) VALUES ('Theater 67'), ('Theater 68'), ('Theater 69'), -('Theater 70') +('Theater 70'), ('Theater 71'), ('Theater 72'), ('Theater 73'), @@ -131,7 +168,7 @@ INSERT INTO movie (title, rating, release_date, thumbnail, running_time, genre_i ('영화37', 'AGE_19', '2025-01-01', 'https://xxx', 110, 1), ('영화38', 'RESTRICTED', '2025-01-02', 'https://xxx', 105, 2), ('영화39', 'AGE_19', '2025-01-05', 'https://xxx', 115, 3), -('영화40', 'RESTRICTED', '2025-01-10', 'https://xxx', 120, 4), +('Movie40', 'RESTRICTED', '2025-01-10', 'https://xxx', 120, 4), ('영화41', 'ALL', '2025-11-01', 'https://xxx', 110, 1); -- Screening 데이터 삽입 @@ -901,7 +938,7 @@ INSERT INTO seat (theater_id, seat_row, seat_column) VALUES (14, 'B', 1), (14, 'B', 2), (14, 'B', 3), (14, 'B', 4), (14, 'B', 5), (14, 'C', 1), (14, 'C', 2), (14, 'C', 3), (14, 'C', 4), (14, 'C', 5), (14, 'D', 1), (14, 'D', 2), (14, 'D', 3), (14, 'D', 4), (14, 'D', 5), -(14, 'E', 1), (14, 'E', 2), (14, 'E', 3), (14, 'E', 4), (14, 'E', 5), +(14, 'E', 1), (14, 'E', 2), (14, 'E', 3), (14, 'E', 4), (14, 'E', 5); INSERT INTO seat (theater_id, seat_row, seat_column) VALUES (15, 'A', 1), (15, 'A', 2), (15, 'A', 3), (15, 'A', 4), (15, 'A', 5), @@ -999,7 +1036,7 @@ INSERT INTO seat (theater_id, seat_row, seat_column) VALUES (30, 'B', 1), (30, 'B', 2), (30, 'B', 3), (30, 'B', 4), (30, 'B', 5), (30, 'C', 1), (30, 'C', 2), (30, 'C', 3), (30, 'C', 4), (30, 'C', 5), (30, 'D', 1), (30, 'D', 2), (30, 'D', 3), (30, 'D', 4), (30, 'D', 5), -(30, 'E', 1), (30, 'E', 2), (30, 'E', 3), (30, 'E', 4), (30, 'E', 5), +(30, 'E', 1), (30, 'E', 2), (30, 'E', 3), (30, 'E', 4), (30, 'E', 5); INSERT INTO seat (theater_id, seat_row, seat_column) VALUES (31, 'A', 1), (31, 'A', 2), (31, 'A', 3), (31, 'A', 4), (31, 'A', 5), From 582694c84684d54320eaf90458876d3d81ea530f Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Sat, 11 Jan 2025 02:03:45 +0900 Subject: [PATCH 22/30] chore: update docker-compose.yml for encoding --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index ee1a1a20a..c5b02ce49 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,6 +11,8 @@ services: - "3307:3306" volumes: - ./init-scripts:/docker-entrypoint-initdb.d # init-scripts 폴더를 MySQL 컨테이너의 초기화 스크립트 디렉토리로 매핑 + command: + - --skip-character-set-client-handshake networks: - my-network From 572f7cdae99af521c862971fd2f88cb3eb636bc8 Mon Sep 17 00:00:00 2001 From: Ji Eunyoung Date: Sun, 12 Jan 2025 16:23:23 +0900 Subject: [PATCH 23/30] chore: remove unique constraint --- init-scripts/data.sql | 6 +++--- module-movie/src/main/java/hellojpa/domain/Genre.java | 2 +- module-movie/src/main/java/hellojpa/domain/Movie.java | 2 +- module-theater/src/main/java/hellojpa/domain/Theater.java | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/init-scripts/data.sql b/init-scripts/data.sql index 37afa9103..512c4f8b5 100644 --- a/init-scripts/data.sql +++ b/init-scripts/data.sql @@ -1,6 +1,6 @@ CREATE TABLE movie ( movie_id BIGINT AUTO_INCREMENT PRIMARY KEY, - title VARCHAR(50) NOT NULL UNIQUE, + title VARCHAR(50) NOT NULL, rating VARCHAR(255) NOT NULL, release_date DATE NOT NULL, thumbnail VARCHAR(255) NOT NULL, @@ -10,12 +10,12 @@ CREATE TABLE movie ( CREATE TABLE genre ( genre_id BIGINT AUTO_INCREMENT PRIMARY KEY, - name VARCHAR(10) NOT NULL UNIQUE + name VARCHAR(10) NOT NULL )CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; CREATE TABLE theater ( theater_id BIGINT AUTO_INCREMENT PRIMARY KEY, - name VARCHAR(20) NOT NULL UNIQUE + name VARCHAR(20) NOT NULL )CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; CREATE TABLE seat ( diff --git a/module-movie/src/main/java/hellojpa/domain/Genre.java b/module-movie/src/main/java/hellojpa/domain/Genre.java index 4b8fe14f6..e7334a348 100644 --- a/module-movie/src/main/java/hellojpa/domain/Genre.java +++ b/module-movie/src/main/java/hellojpa/domain/Genre.java @@ -13,6 +13,6 @@ public class Genre extends BaseEntity { @Column(name = "genre_id") private Long id; - @Column(nullable = false, unique = true, length = 10) + @Column(nullable = false, length = 10) private String name; // 장르 이름 } diff --git a/module-movie/src/main/java/hellojpa/domain/Movie.java b/module-movie/src/main/java/hellojpa/domain/Movie.java index 2b4ab2fe6..fae0a44c6 100644 --- a/module-movie/src/main/java/hellojpa/domain/Movie.java +++ b/module-movie/src/main/java/hellojpa/domain/Movie.java @@ -19,7 +19,7 @@ public class Movie extends BaseEntity { @Column(name = "movie_id") private Long id; - @Column(nullable = false, unique = true, length = 50) + @Column(nullable = false, length = 50) private String title; // 영화 제목 @Enumerated(EnumType.STRING) diff --git a/module-theater/src/main/java/hellojpa/domain/Theater.java b/module-theater/src/main/java/hellojpa/domain/Theater.java index 78d877387..fd72e27cd 100644 --- a/module-theater/src/main/java/hellojpa/domain/Theater.java +++ b/module-theater/src/main/java/hellojpa/domain/Theater.java @@ -16,7 +16,7 @@ public class Theater extends BaseEntity { @Column(name = "theater_id") private Long id; - @Column(nullable = false, unique = true, length = 20) + @Column(nullable = false, length = 20) private String name; // 상영관 이름 @OneToMany(mappedBy = "theater", cascade = CascadeType.ALL, orphanRemoval = true) From 529302a26794f3ce162fe85f20e831d0b0b6fede Mon Sep 17 00:00:00 2001 From: sliverzero Date: Mon, 13 Jan 2025 00:40:27 +0900 Subject: [PATCH 24/30] refactor: change genre to ENUM type --- init-scripts/data.sql | 99 ++++++++----------- .../src/main/java/hellojpa/domain/Genre.java | 22 ++--- .../src/main/java/hellojpa/domain/Movie.java | 5 +- 3 files changed, 52 insertions(+), 74 deletions(-) diff --git a/init-scripts/data.sql b/init-scripts/data.sql index 512c4f8b5..0b2a25a23 100644 --- a/init-scripts/data.sql +++ b/init-scripts/data.sql @@ -5,12 +5,7 @@ CREATE TABLE movie ( release_date DATE NOT NULL, thumbnail VARCHAR(255) NOT NULL, running_time INT NOT NULL, - genre_id BIGINT NOT NULL -)CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - -CREATE TABLE genre ( - genre_id BIGINT AUTO_INCREMENT PRIMARY KEY, - name VARCHAR(10) NOT NULL + genre VARCHAR(255) NOT NULL )CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; CREATE TABLE theater ( @@ -35,14 +30,6 @@ CREATE TABLE screening ( FOREIGN KEY (theater_id) REFERENCES theater(theater_id) )CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; --- Genre 데이터 삽입 -INSERT INTO genre (name) VALUES -('Action'), -('Comedy'), -('Drama'), -('Horror'), -('Romance'), -('Thriller'); -- Theater 데이터 삽입 INSERT INTO theater (name) VALUES @@ -128,48 +115,48 @@ INSERT INTO theater (name) VALUES ('Theater 80'); -- Movie 데이터 삽입 -INSERT INTO movie (title, rating, release_date, thumbnail, running_time, genre_id) VALUES -('영화1', 'ALL', '2024-11-01', 'https://xxx', 110, 1), -('영화2', 'AGE_12', '2024-11-02', 'https://xxx', 115, 2), -('영화3', 'AGE_15', '2024-11-03', 'https://xxx', 120, 3), -('영화4', 'ALL', '2024-11-05', 'https://xxx', 105, 4), -('영화5', 'AGE_12', '2024-11-06', 'https://xxx', 110, 5), -('영화6', 'AGE_15', '2024-11-07', 'https://xxx', 115, 6), -('영화7', 'AGE_12', '2024-11-08', 'https://xxx', 120, 1), -('영화8', 'ALL', '2024-11-09', 'https://xxx', 105, 2), -('영화9', 'AGE_12', '2024-11-10', 'https://xxx', 110, 3), -('영화10', 'AGE_15', '2024-11-11', 'https://xxx', 115, 4), -('영화11', 'AGE_12', '2024-11-12', 'https://xxx', 120, 5), -('영화12', 'ALL', '2024-11-13', 'https://xxx', 110, 6), -('영화13', 'AGE_15', '2024-11-14', 'https://xxx', 105, 1), -('영화14', 'AGE_12', '2024-11-15', 'https://xxx', 115, 2), -('영화15', 'ALL', '2024-11-16', 'https://xxx', 120, 3), -('영화16', 'AGE_12', '2024-11-17', 'https://xxx', 110, 4), -('영화17', 'AGE_15', '2024-11-18', 'https://xxx', 120, 5), -('영화18', 'ALL', '2024-11-19', 'https://xxx', 105, 6), -('영화19', 'AGE_12', '2024-11-20', 'https://xxx', 110, 1), -('영화20', 'AGE_15', '2024-11-21', 'https://xxx', 115, 2), -('영화21', 'AGE_12', '2024-12-01', 'https://xxx', 120, 3), -('영화22', 'ALL', '2024-12-02', 'https://xxx', 105, 4), -('영화23', 'AGE_12', '2024-12-03', 'https://xxx', 110, 5), -('영화24', 'AGE_15', '2024-12-04', 'https://xxx', 115, 6), -('영화25', 'AGE_12', '2024-12-05', 'https://xxx', 120, 1), -('영화26', 'ALL', '2024-12-06', 'https://xxx', 105, 2), -('영화27', 'AGE_15', '2024-12-07', 'https://xxx', 110, 3), -('영화28', 'AGE_12', '2024-12-08', 'https://xxx', 115, 4), -('영화29', 'AGE_15', '2024-12-09', 'https://xxx', 120, 5), -('영화30', 'AGE_12', '2024-12-10', 'https://xxx', 110, 6), -('영화31', 'AGE_19', '2024-12-15', 'https://xxx', 105, 1), -('영화32', 'RESTRICTED', '2024-12-16', 'https://xxx', 115, 2), -('영화33', 'AGE_19', '2024-12-17', 'https://xxx', 120, 3), -('영화34', 'RESTRICTED', '2024-12-18', 'https://xxx', 110, 4), -('영화35', 'AGE_19', '2024-12-19', 'https://xxx', 115, 5), -('영화36', 'RESTRICTED', '2024-12-20', 'https://xxx', 120, 6), -('영화37', 'AGE_19', '2025-01-01', 'https://xxx', 110, 1), -('영화38', 'RESTRICTED', '2025-01-02', 'https://xxx', 105, 2), -('영화39', 'AGE_19', '2025-01-05', 'https://xxx', 115, 3), -('Movie40', 'RESTRICTED', '2025-01-10', 'https://xxx', 120, 4), -('영화41', 'ALL', '2025-11-01', 'https://xxx', 110, 1); +INSERT INTO movie (title, rating, release_date, thumbnail, running_time, genre) VALUES +('영화1', 'ALL', '2024-11-01', 'https://xxx', 110, 'ACTION'), +('영화2', 'AGE_12', '2024-11-02', 'https://xxx', 115, 'COMEDY'), +('영화3', 'AGE_15', '2024-11-03', 'https://xxx', 120, 'DRAMA'), +('영화4', 'ALL', '2024-11-05', 'https://xxx', 105, 'HORROR'), +('영화5', 'AGE_12', '2024-11-06', 'https://xxx', 110, 'ROMANCE'), +('영화6', 'AGE_15', '2024-11-07', 'https://xxx', 115, 'THRILLER'), +('영화7', 'AGE_12', '2024-11-08', 'https://xxx', 120, 'ACTION'), +('영화8', 'ALL', '2024-11-09', 'https://xxx', 105, 'COMEDY'), +('영화9', 'AGE_12', '2024-11-10', 'https://xxx', 110, 'DRAMA'), +('영화10', 'AGE_15', '2024-11-11', 'https://xxx', 115, 'HORROR'), +('영화11', 'AGE_12', '2024-11-12', 'https://xxx', 120, 'ROMANCE'), +('영화12', 'ALL', '2024-11-13', 'https://xxx', 110, 'THRILLER'), +('영화13', 'AGE_15', '2024-11-14', 'https://xxx', 105, 'ACTION'), +('영화14', 'AGE_12', '2024-11-15', 'https://xxx', 115, 'COMEDY'), +('영화15', 'ALL', '2024-11-16', 'https://xxx', 120, 'DRAMA'), +('영화16', 'AGE_12', '2024-11-17', 'https://xxx', 110, 'HORROR'), +('영화17', 'AGE_15', '2024-11-18', 'https://xxx', 120, 'ROMANCE'), +('영화18', 'ALL', '2024-11-19', 'https://xxx', 105, 'THRILLER'), +('영화19', 'AGE_12', '2024-11-20', 'https://xxx', 110, 'ACTION'), +('영화20', 'AGE_15', '2024-11-21', 'https://xxx', 115, 'COMEDY'), +('영화21', 'AGE_12', '2024-12-01', 'https://xxx', 120, 'DRAMA'), +('영화22', 'ALL', '2024-12-02', 'https://xxx', 105, 'HORROR'), +('영화23', 'AGE_12', '2024-12-03', 'https://xxx', 110, 'ROMANCE'), +('영화24', 'AGE_15', '2024-12-04', 'https://xxx', 115, 'THRILLER'), +('영화25', 'AGE_12', '2024-12-05', 'https://xxx', 120, 'ACTION'), +('영화26', 'ALL', '2024-12-06', 'https://xxx', 105, 'COMEDY'), +('영화27', 'AGE_15', '2024-12-07', 'https://xxx', 110, 'DRAMA'), +('영화28', 'AGE_12', '2024-12-08', 'https://xxx', 115, 'HORROR'), +('영화29', 'AGE_15', '2024-12-09', 'https://xxx', 120, 'ROMANCE'), +('영화30', 'AGE_12', '2024-12-10', 'https://xxx', 110, 'THRILLER'), +('영화31', 'AGE_19', '2024-12-15', 'https://xxx', 105, 'ACTION'), +('영화32', 'RESTRICTED', '2024-12-16', 'https://xxx', 115, 'COMEDY'), +('영화33', 'AGE_19', '2024-12-17', 'https://xxx', 120, 'DRAMA'), +('영화34', 'RESTRICTED', '2024-12-18', 'https://xxx', 110, 'HORROR'), +('영화35', 'AGE_19', '2024-12-19', 'https://xxx', 115, 'ROMANCE'), +('영화36', 'RESTRICTED', '2024-12-20', 'https://xxx', 120, 'THRILLER'), +('영화37', 'AGE_19', '2025-01-01', 'https://xxx', 110, 'ACTION'), +('영화38', 'RESTRICTED', '2025-01-02', 'https://xxx', 105, 'COMEDY'), +('영화39', 'AGE_19', '2025-01-05', 'https://xxx', 115, 'DRAMA'), +('Movie40', 'RESTRICTED', '2025-01-10', 'https://xxx', 120, 'HORROR'), +('영화41', 'ALL', '2025-11-01', 'https://xxx', 110, 'ACTION'); -- Screening 데이터 삽입 -- 영화1 상영 데이터 (상영관 1, 2) diff --git a/module-movie/src/main/java/hellojpa/domain/Genre.java b/module-movie/src/main/java/hellojpa/domain/Genre.java index e7334a348..14c0141e9 100644 --- a/module-movie/src/main/java/hellojpa/domain/Genre.java +++ b/module-movie/src/main/java/hellojpa/domain/Genre.java @@ -1,18 +1,10 @@ package hellojpa.domain; -import hellojpa.BaseEntity; -import jakarta.persistence.*; -import lombok.Getter; - -@Entity -@Getter -public class Genre extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "genre_id") - private Long id; - - @Column(nullable = false, length = 10) - private String name; // 장르 이름 +public enum Genre { + ACTION, + COMEDY, + DRAMA, + HORROR, + ROMANCE, + THRILLER } diff --git a/module-movie/src/main/java/hellojpa/domain/Movie.java b/module-movie/src/main/java/hellojpa/domain/Movie.java index fae0a44c6..1265d908d 100644 --- a/module-movie/src/main/java/hellojpa/domain/Movie.java +++ b/module-movie/src/main/java/hellojpa/domain/Movie.java @@ -5,7 +5,6 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; import java.time.LocalDate; @@ -35,7 +34,7 @@ public class Movie extends BaseEntity { @Column(nullable = false) private int runningTime; // 영화 러닝타임 - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "genre_id", nullable = false) + @Enumerated(EnumType.STRING) + @JoinColumn(nullable = false) private Genre genre; // 영화 장르 } From 928a080c67f5d5036d0f1dda4230904adb3ffa69 Mon Sep 17 00:00:00 2001 From: sliverzero Date: Mon, 13 Jan 2025 00:42:39 +0900 Subject: [PATCH 25/30] refactor: use static factory method in ScreeningDto --- .../main/java/hellojpa/dto/ScreeningDto.java | 17 +++++++++++++++++ .../hellojpa/service/ScreeningService.java | 19 ++----------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/module-screening/src/main/java/hellojpa/dto/ScreeningDto.java b/module-screening/src/main/java/hellojpa/dto/ScreeningDto.java index 361448ae9..1392134ac 100644 --- a/module-screening/src/main/java/hellojpa/dto/ScreeningDto.java +++ b/module-screening/src/main/java/hellojpa/dto/ScreeningDto.java @@ -23,4 +23,21 @@ public class ScreeningDto { private String theaterName; private LocalTime startTime; private LocalTime endTime; + + public static ScreeningDto of(Screening screening){ + String title = screening.getMovie().getTitle(); + String videoRating = screening.getMovie().getRating().toString(); + LocalDate releaseDate = screening.getMovie().getReleaseDate(); + String thumbnail = screening.getMovie().getThumbnail(); + int runningTime = screening.getMovie().getRunningTime(); + String genreName = screening.getMovie().getGenre().toString(); + String theaterName = screening.getTheater().getName(); + LocalTime startTime = screening.getStartTime(); + LocalTime endTime = screening.getStartTime().plusMinutes(runningTime); + + return new ScreeningDto( + title, videoRating, releaseDate, thumbnail, + runningTime, genreName, theaterName, startTime, endTime + ); + } } diff --git a/module-screening/src/main/java/hellojpa/service/ScreeningService.java b/module-screening/src/main/java/hellojpa/service/ScreeningService.java index 4b53dae6b..4cced1871 100644 --- a/module-screening/src/main/java/hellojpa/service/ScreeningService.java +++ b/module-screening/src/main/java/hellojpa/service/ScreeningService.java @@ -23,23 +23,8 @@ public List findCurrentScreenings() { List currentScreenings = screeningRepository.findCurrentScreenings(todayDate); return currentScreenings.stream() - .map(currentScreening -> { - String title = currentScreening.getMovie().getTitle(); - String videoRating = currentScreening.getMovie().getRating().toString(); - LocalDate releaseDate = currentScreening.getMovie().getReleaseDate(); - String thumbnail = currentScreening.getMovie().getThumbnail(); - int runningTime = currentScreening.getMovie().getRunningTime(); - String genreName = currentScreening.getMovie().getGenre().getName(); - String theaterName = currentScreening.getTheater().getName(); - LocalTime startTime = currentScreening.getStartTime(); - LocalTime endTime = currentScreening.getStartTime().plusMinutes(runningTime); - - return new ScreeningDto( - title, videoRating, releaseDate, thumbnail, - runningTime, genreName, theaterName, startTime, endTime - ); - }) - .collect(Collectors.toList()); + .map(ScreeningDto::of) // 정적 팩토리 메서드 호출 + .toList(); } } From 0198abc5d6a057af361ca31dc3610904dcc74c27 Mon Sep 17 00:00:00 2001 From: sliverzero Date: Mon, 13 Jan 2025 01:09:28 +0900 Subject: [PATCH 26/30] chore: remove duplicate module dependencies --- module-api/build.gradle | 7 ------- module-movie/build.gradle | 11 ----------- module-screening/build.gradle | 11 ----------- module-theater/build.gradle | 11 ----------- 4 files changed, 40 deletions(-) diff --git a/module-api/build.gradle b/module-api/build.gradle index b4a6c0c41..08ea57594 100644 --- a/module-api/build.gradle +++ b/module-api/build.gradle @@ -4,11 +4,4 @@ dependencies { implementation project(':module-screening') implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - developmentOnly 'org.springframework.boot:spring-boot-devtools' - - testImplementation platform('org.junit:junit-bom:5.9.1') - testImplementation 'org.junit.jupiter:junit-jupiter' } \ No newline at end of file diff --git a/module-movie/build.gradle b/module-movie/build.gradle index 162d32f35..8864758a3 100644 --- a/module-movie/build.gradle +++ b/module-movie/build.gradle @@ -4,15 +4,4 @@ jar.enabled = true dependencies { // 모듈 의존성 implementation project(':module-common') - - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - developmentOnly 'org.springframework.boot:spring-boot-devtools' - runtimeOnly 'com.mysql:mysql-connector-j' - - testImplementation platform('org.junit:junit-bom:5.9.1') - testImplementation 'org.junit.jupiter:junit-jupiter' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa' } \ No newline at end of file diff --git a/module-screening/build.gradle b/module-screening/build.gradle index 56b94a970..842f56431 100644 --- a/module-screening/build.gradle +++ b/module-screening/build.gradle @@ -6,15 +6,4 @@ dependencies { implementation project(':module-common') implementation project(':module-movie') implementation project(':module-theater') - - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - developmentOnly 'org.springframework.boot:spring-boot-devtools' - runtimeOnly 'com.mysql:mysql-connector-j' - - testImplementation platform('org.junit:junit-bom:5.9.1') - testImplementation 'org.junit.jupiter:junit-jupiter' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa' } \ No newline at end of file diff --git a/module-theater/build.gradle b/module-theater/build.gradle index 4639c43c2..d4325e5d8 100644 --- a/module-theater/build.gradle +++ b/module-theater/build.gradle @@ -4,15 +4,4 @@ jar.enabled = true dependencies { // 공통 모듈 의존성 implementation project(':module-common') - - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - developmentOnly 'org.springframework.boot:spring-boot-devtools' - runtimeOnly 'com.mysql:mysql-connector-j' - - testImplementation platform('org.junit:junit-bom:5.9.1') - testImplementation 'org.junit.jupiter:junit-jupiter' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa' } \ No newline at end of file From 56375172be552f4ef382f38fea2be74eb584078c Mon Sep 17 00:00:00 2001 From: sliverzero Date: Mon, 13 Jan 2025 23:03:15 +0900 Subject: [PATCH 27/30] chore: remove duplicate module dependencies --- module-common/build.gradle | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/module-common/build.gradle b/module-common/build.gradle index 518170264..bd3c02c27 100644 --- a/module-common/build.gradle +++ b/module-common/build.gradle @@ -2,14 +2,9 @@ bootJar.enabled = false jar.enabled = true dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - developmentOnly 'org.springframework.boot:spring-boot-devtools' - runtimeOnly 'com.mysql:mysql-connector-j' - - testImplementation platform('org.junit:junit-bom:5.9.1') - testImplementation 'org.junit.jupiter:junit-jupiter' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa' + api 'org.springframework.boot:spring-boot-starter-data-jpa' + api 'org.projectlombok:lombok' + api 'org.projectlombok:lombok' + api 'org.springframework.boot:spring-boot-devtools' + api 'com.mysql:mysql-connector-j' } \ No newline at end of file From e4cb260999e2a9d291158e65b04391030ba39ee7 Mon Sep 17 00:00:00 2001 From: sliverzero Date: Wed, 15 Jan 2025 00:48:18 +0900 Subject: [PATCH 28/30] refactor: week1 refactor(add utf8mb4, module dependencies) --- docker-compose.yml | 2 ++ module-api/build.gradle | 2 ++ module-common/build.gradle | 4 ++-- module-movie/build.gradle | 3 +++ module-screening/build.gradle | 3 +++ module-theater/build.gradle | 3 +++ 6 files changed, 15 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index c5b02ce49..e07925e3e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,6 +13,8 @@ services: - ./init-scripts:/docker-entrypoint-initdb.d # init-scripts 폴더를 MySQL 컨테이너의 초기화 스크립트 디렉토리로 매핑 command: - --skip-character-set-client-handshake + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_unicode_ci networks: - my-network diff --git a/module-api/build.gradle b/module-api/build.gradle index 08ea57594..67e533895 100644 --- a/module-api/build.gradle +++ b/module-api/build.gradle @@ -4,4 +4,6 @@ dependencies { implementation project(':module-screening') implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' } \ No newline at end of file diff --git a/module-common/build.gradle b/module-common/build.gradle index bd3c02c27..b32841417 100644 --- a/module-common/build.gradle +++ b/module-common/build.gradle @@ -3,8 +3,8 @@ jar.enabled = true dependencies { api 'org.springframework.boot:spring-boot-starter-data-jpa' - api 'org.projectlombok:lombok' - api 'org.projectlombok:lombok' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' api 'org.springframework.boot:spring-boot-devtools' api 'com.mysql:mysql-connector-j' } \ No newline at end of file diff --git a/module-movie/build.gradle b/module-movie/build.gradle index 8864758a3..ae69d13e9 100644 --- a/module-movie/build.gradle +++ b/module-movie/build.gradle @@ -4,4 +4,7 @@ jar.enabled = true dependencies { // 모듈 의존성 implementation project(':module-common') + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' } \ No newline at end of file diff --git a/module-screening/build.gradle b/module-screening/build.gradle index 842f56431..802214e8b 100644 --- a/module-screening/build.gradle +++ b/module-screening/build.gradle @@ -6,4 +6,7 @@ dependencies { implementation project(':module-common') implementation project(':module-movie') implementation project(':module-theater') + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' } \ No newline at end of file diff --git a/module-theater/build.gradle b/module-theater/build.gradle index d4325e5d8..7543f9581 100644 --- a/module-theater/build.gradle +++ b/module-theater/build.gradle @@ -4,4 +4,7 @@ jar.enabled = true dependencies { // 공통 모듈 의존성 implementation project(':module-common') + + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' } \ No newline at end of file From e388cb85e5f60d0d171b49048eae6e644c0c2891 Mon Sep 17 00:00:00 2001 From: sliverzero Date: Wed, 15 Jan 2025 22:02:54 +0900 Subject: [PATCH 29/30] fix: modify api response format --- .../main/java/hellojpa/dto/ScreeningDto.java | 29 ++++++------- .../java/hellojpa/dto/TheaterScheduleDto.java | 27 ++++++++++++ .../java/hellojpa/dto/TimeScheduleDto.java | 25 +++++++++++ .../hellojpa/service/ScreeningService.java | 43 ++++++++++++++++--- 4 files changed, 101 insertions(+), 23 deletions(-) create mode 100644 module-screening/src/main/java/hellojpa/dto/TheaterScheduleDto.java create mode 100644 module-screening/src/main/java/hellojpa/dto/TimeScheduleDto.java diff --git a/module-screening/src/main/java/hellojpa/dto/ScreeningDto.java b/module-screening/src/main/java/hellojpa/dto/ScreeningDto.java index 1392134ac..6c4f1697a 100644 --- a/module-screening/src/main/java/hellojpa/dto/ScreeningDto.java +++ b/module-screening/src/main/java/hellojpa/dto/ScreeningDto.java @@ -1,13 +1,13 @@ package hellojpa.dto; -import hellojpa.domain.Screening; -import hellojpa.domain.VideoRating; +import hellojpa.domain.Movie; + import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import java.time.LocalDate; -import java.time.LocalTime; +import java.util.List; @Getter @NoArgsConstructor @@ -20,24 +20,19 @@ public class ScreeningDto { private String thumbnail; private int runningTime; private String genreName; - private String theaterName; - private LocalTime startTime; - private LocalTime endTime; + private List theaterSheduleDtoList; - public static ScreeningDto of(Screening screening){ - String title = screening.getMovie().getTitle(); - String videoRating = screening.getMovie().getRating().toString(); - LocalDate releaseDate = screening.getMovie().getReleaseDate(); - String thumbnail = screening.getMovie().getThumbnail(); - int runningTime = screening.getMovie().getRunningTime(); - String genreName = screening.getMovie().getGenre().toString(); - String theaterName = screening.getTheater().getName(); - LocalTime startTime = screening.getStartTime(); - LocalTime endTime = screening.getStartTime().plusMinutes(runningTime); + public static ScreeningDto of(Movie movie, List theaterSchedule){ + String title = movie.getTitle(); + String videoRating = movie.getRating().toString(); + LocalDate releaseDate = movie.getReleaseDate(); + String thumbnail = movie.getThumbnail(); + int runningTime = movie.getRunningTime(); + String genreName = movie.getGenre().toString(); return new ScreeningDto( title, videoRating, releaseDate, thumbnail, - runningTime, genreName, theaterName, startTime, endTime + runningTime, genreName, theaterSchedule ); } } diff --git a/module-screening/src/main/java/hellojpa/dto/TheaterScheduleDto.java b/module-screening/src/main/java/hellojpa/dto/TheaterScheduleDto.java new file mode 100644 index 000000000..6375a7d79 --- /dev/null +++ b/module-screening/src/main/java/hellojpa/dto/TheaterScheduleDto.java @@ -0,0 +1,27 @@ +package hellojpa.dto; + +import hellojpa.domain.Screening; +import hellojpa.domain.Theater; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalTime; +import java.util.List; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class TheaterScheduleDto { + + private String theaterName; + private List timeScheduleDtoList; + + public static TheaterScheduleDto of(Theater theater, List timeSchedule){ + String theaterName = theater.getName(); + + return new TheaterScheduleDto( + theaterName, timeSchedule + ); + } +} diff --git a/module-screening/src/main/java/hellojpa/dto/TimeScheduleDto.java b/module-screening/src/main/java/hellojpa/dto/TimeScheduleDto.java new file mode 100644 index 000000000..aa71b561e --- /dev/null +++ b/module-screening/src/main/java/hellojpa/dto/TimeScheduleDto.java @@ -0,0 +1,25 @@ +package hellojpa.dto; + +import hellojpa.domain.Movie; +import hellojpa.domain.Screening; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class TimeScheduleDto { + + private LocalTime startTime; + private LocalTime endTime; + + public static TimeScheduleDto of(Screening screening) { + LocalTime startTime = screening.getStartTime(); + LocalTime endTime = startTime.plusMinutes(screening.getMovie().getRunningTime()); + + return new TimeScheduleDto(startTime, endTime); + } +} \ No newline at end of file diff --git a/module-screening/src/main/java/hellojpa/service/ScreeningService.java b/module-screening/src/main/java/hellojpa/service/ScreeningService.java index 4cced1871..8cc713863 100644 --- a/module-screening/src/main/java/hellojpa/service/ScreeningService.java +++ b/module-screening/src/main/java/hellojpa/service/ScreeningService.java @@ -1,14 +1,16 @@ package hellojpa.service; +import hellojpa.domain.Movie; import hellojpa.domain.Screening; import hellojpa.dto.ScreeningDto; +import hellojpa.dto.TheaterScheduleDto; +import hellojpa.dto.TimeScheduleDto; import hellojpa.repository.ScreeningRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.time.LocalDate; -import java.time.LocalTime; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; @Service @@ -20,11 +22,40 @@ public class ScreeningService { public List findCurrentScreenings() { LocalDate todayDate = LocalDate.now(); - List currentScreenings = screeningRepository.findCurrentScreenings(todayDate); + List currentScreenings = screeningRepository.findCurrentScreenings(todayDate); // 오늘 날짜 기준 상영되는 영화 정보 return currentScreenings.stream() - .map(ScreeningDto::of) // 정적 팩토리 메서드 호출 - .toList(); + .collect(Collectors.groupingBy(Screening::getMovie)) // 영화별 그룹화 + .entrySet().stream() + .map(entry -> { + Movie movie = entry.getKey(); + List theaterScheduleDtos = extractTheaterScheduleDto(entry.getValue()); + + return ScreeningDto.of(movie, theaterScheduleDtos); + }) + .sorted(Comparator.comparing(ScreeningDto::getReleaseDate).reversed()) // 최근 개봉일 순 정렬 + .collect(Collectors.toList()); } -} + // screening -> TheaterScheduleDto + private List extractTheaterScheduleDto(List screenings) { + return screenings.stream() + .collect(Collectors.groupingBy(Screening::getTheater)) + .entrySet().stream() + .map(entry -> { + List timeScheduleDtos = extractTimeScheduleDto(entry.getValue()); + + return TheaterScheduleDto.of(entry.getKey(), timeScheduleDtos); + }) + .collect(Collectors.toList()); + } + + // screening -> TimeScheduleDto + private List extractTimeScheduleDto(List screenings) { + return screenings.stream() + .sorted(Comparator.comparing(Screening::getStartTime)) // 상영 시간 오름차순 정렬 + .map(screening -> TimeScheduleDto.of(screening)) + .collect(Collectors.toList()); + } + +} \ No newline at end of file From 40aa523bd42568b61844c88cbc5dcd8e7434d677 Mon Sep 17 00:00:00 2001 From: sliverzero <76798340+sliverzero@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:31:34 +0900 Subject: [PATCH 30/30] Update README.md --- README.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5fcc66b4d..38a08c192 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,20 @@ ## [본 과정] 이커머스 핵심 프로세스 구현 -[단기 스킬업 Redis 교육 과정](https://hh-skillup.oopy.io/) 을 통해 상품 조회 및 주문 과정을 구현하며 현업에서 발생하는 문제를 Redis의 핵심 기술을 통해 해결합니다. -> Indexing, Caching을 통한 성능 개선 / 단계별 락 구현을 통한 동시성 이슈 해결 (낙관적/비관적 락, 분산락 등) + +### Multi Module +* module-movie: 영화와 관련된 작업을 합니다. +* module-theater: 상영관과 관련된 작업을 합니다. +* module-screening: 상영 정보와 관련된 작업을 합니다. +* module-common: Auditing 등 모든 모듈에 적용될 작업을 합니다. +* module-api: 현재 상영 중인 영화 조회 API 등 영화, 상영관, 상영 정보 외의 api와 관련된 작업을 합니다. + +### Architecture +* Layered Architecture를 사용하여 계층별로 책임을 분리하여 진행했습니다. + +### Table Design +![image](https://github.com/user-attachments/assets/b55c39d3-2488-40d9-a6ce-a60cfb507124) +* movie와 screening 관계 + * 1:N 관계 -> 하나의 영화는 여러 상영 정보를 가집니다. +* theater과 screening 관계 + * 1:N 관계 -> 하나의 상영관은 여러 상영 정보를 가집니다. +* theater과 seat 관계 + * 1:N 관계 -> 하나의 상영관은 여러 개의 좌석을 갖습니다.