diff --git a/backend/src/main/java/corea/DataInitializer.java b/backend/src/main/java/corea/DataInitializer.java new file mode 100644 index 000000000..2d1291d51 --- /dev/null +++ b/backend/src/main/java/corea/DataInitializer.java @@ -0,0 +1,64 @@ +package corea; + +import corea.domain.Member; +import corea.domain.Participation; +import corea.domain.Room; +import corea.repository.MemberRepository; +import corea.repository.ParticipationRepository; +import corea.repository.RoomRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +@Component +@RequiredArgsConstructor +public class DataInitializer implements CommandLineRunner { + private final MemberRepository memberRepository; + private final RoomRepository roomRepository; + private final ParticipationRepository participationRepository; + + @Override + public void run(final String... args) throws Exception { + final var members = memberRepository.saveAll(List.of( + new Member("pororo@gmail.com", "뽀로로"), + new Member("ashty@gmal.com", "애쉬"), + new Member("moving@gmail.com", "무빙"), + new Member("joyson@gmail.com", "조이썬썬"), + new Member("tenten@gmail.com", "팔팔"), + new Member("choco@gmail.com", "초코"), + new Member("dal@gmail.com", "다르"), + new Member("pobi@gmail.com", "포비") + )); + + final Room room = new Room( + "레이싱 카와 함께하는 TDD", + members.get(0) + .getId(), + "https://github.com/jcoding-play/java-racingcar", + "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBwgHBgkIBwgKCgkLDRYPDQwMDRsUFRAWIB0iIiAdHx8kKDQsJCYxJx8fLT0tMTU3Ojo6Iys/RD84QzQ5OjcBCgoKDQwNGg8PGjclHyU3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N//AABEIAK8AuwMBIgACEQEDEQH/xAAcAAABBQEBAQAAAAAAAAAAAAAEAgMFBgcBAAj/xABTEAACAQMBAggHCQwHBwUAAAABAgMABBEFEiEGEyIxQVFh0QcUcYHB0uEjMlJicpGSobEVM0JTVXOCg5Oi4vAWJENjssLxJTQ1RFSj0xdFdJTy/8QAGgEAAwEBAQEAAAAAAAAAAAAAAAIDAQQFBv/EADQRAAICAQIFAQMKBwAAAAAAAAABAhEDEiEEEzFBUWEFkfAUIlJxgaGxwdHhFTJDU4KS8f/aAAwDAQACEQMRAD8Azu9INy5XY875NISGaTcNvHxM1LSwo9w+ztsNrojHfTyWqY3q/nOK87nJF3hbZEpBxe+QyDHS8mz6KOgGRlEV9r++B+rFeu7eJd+xF+mfbXrJtkKEaJd/RmqYp3uSnjcXQPdRyxktxC/SPoo6xvfcVLhRndjaam7ydMhZJIjuPOvsonT9hrdCrLjP4MY7qMqj4KYlv1E3xQsjFYd/WzUIOKLgcZEOwJn7RR96E2hyv+2KCw+2NppsfFQ+g1ONCzpSHAgxukUj82veKQ0ch3K0JHaSPsNER7l99Iflg0i4bA/B+Yn0VrE2ZHyRSg88A/SalWJ2XfjHQDI2cIftIpbSDO8qP1fsoqyCEOdpeb8WO6qQk0zNh+SOBkDcZCWzzFfZXBbxgbjGCepWxRNxAWgGyyY3c8Y7qi22o5WBeEeSL2UZfnMZUhyVZF960XnQ91KhErkF2hIHUmfRXYpg4wZYvoDuomIKpGJAc9SjuqLdDKvAiSEIN/Fb+vdQEyrt88A7dlmqYlikdeQw86ZoFrG4bOyik9YhPq00WhWn4E20KJj3VMHm2YseinW2hyElcY6h7RT0dndoArLuX4mPRTkiFRukkU9OyPaKWUo+R1FvsNW2RvaZyeo/60bGM7xJs9uDQkeznlzSnsP+tPsAQAoY9uM1x5N5dTrx7LoOtHONyOGz15pHFT9Oz9KmW45dyq2PkAeivcbOPwW+qhRdbfH3DNkc0TSXEmUm99z7XsohLUBctJgdTN7KHW1ZbyZjGrcr8J/bUhjCAERjsBz6avke+xGC9AWeGMDkyJntj2vRXoIyApC7XasYHop/kk7uM/RU99EoMIpxOfMabDJp0LOC60Rs9uzuvLZeT1Zom2jWOJQ87fNTk7coYSY8npzTCrMxJEUmO3Pq1XLJ2LBJdjtw0bHkzzZHVnuoHbLsccexHVnuo5kOOVE58jHuoWVLcb1gOe1h6RU4yMlG3YtbRpEzhx2vnups2LK20XtxjrGT/hrqXijkgYA6NpadF0pGBnzIPtzTNyMSQ8hSMAHLHsOO6m0hlkLlBIFwN5OfTSBcHIxJcr8kfxUXBcNhvd5/PSxbi9iuzjTFTRMkf3xg27eVqNnhlY5Fzg9YUVLSOSoLTzY7VFDOwLsFMpPWF9tWySrchXqARu0ZAect5V9tGiQFQVmcHrAHfTUhYb9uYdhX20hZ2U4LyfRPfU/5jW9hb3EoOBcTMOphmmpHkYHaZMfms+iiFn2xs8YDnrWkuTg4dR5vZTkxFnI0LjbkQDrK49FTcd0rIBx2excd4qGt2Z2wZVGOqpOJ41jw0wPYQD6a5OJ3OvAxUkiHnEh7SB30w1zGnvQ5PZXLmTfyGY/Jj9tD7QO5uMz9H0VCMbRVySHxdljshZBn+eqvbTH+T3UE8JY5WCRh+c9ldFvu3wMP0vZTaF2M1jk4XbPJtxyugsT9ldj2ej90HupmWUMcI0ufk+2kAydJJ7CAPTVqJ6tww839r5s4+ylxSxqq7Wc7+dvL2UBy0I5CHPWwoyFwyICI1OD+HVMa3EkKneAkFTjk78yVGSXGJCFIPYJR31Iz24cjMduRs85ZvQaDeBEbfFFj4pPprZ1qMV0NC4bpWP8ASkXvpmW4+La+eT20YptwMSRoD0Z2vQaHlitWbkLCD5GojV7oKfg5Em3yhJEOxJT61PAzLuWSYjqD5/zGkqkYXC8/xfaK5sna3RsT17u6qWgr0HVM5P8Ab0RGZgHLCUjtU0wqMVxxU36JHq05BbsokzaStnpOPVpFWoN6DS8oTcrgbuZfbQk1zKHYe7/R9tET8lMcRKvNzN7KFWfYdt8o7C1UyioSLnfyppx2bPtp1ZFcbpJj5RTc11kgFH8oYV2CWJt3EyFj05zUtzavwKlST3yuMduaaMuNz3IHYBRXFlhkB4x1sN32UnYSM4Wdd/PzUazNL+KGk4s71uXz2L7aJjGWI8YlbsCin4JF3KJ1+nj009KkhGVmcjqDnvrmyZ96s6IYu4wuI+fxkA/hAUNcSA5CyXRPUf8AWn2mMe5uMz1knvoSWXabnc9g2u+kju7Gk62GeKZm3pckdeaTxH/yR/Pkpwptjcsn19xps28vQsn191V6/H7ErYUAxXlrLn5Q7qRKhyNlDntkHdSkjiAwRCT2TgemusxQe8j7cSA+mmVjNryDssoBPI5uYgmnoI9sLtLGOT0K1J44Z3lQOrZH25o2DZZI/dJByTvFUg9+hNv1BLhVRhjZzs/BNCCeNSdueFfKp7qkrmWGBgGuHB2fwkBH21HteQZOLpB5Y1762fUVfWMSMk55N4mOxRj6xXkgQEZmtz2lUz9lNT3m/kXDHt4od9IW8D7jcTA9YGPTVFF0LaskDxagbMiE9QQd1Duodt8bt5B7K4k/94z9jY9YV4sH57dfLtfx0VQzaY7Hsx7xDIO3OKItrtwXAMoHVxwPppEMaqOZRno4z+KpG1Cja5CDyy8/79TTWroa+hy6HGw/eizZHO/sNQ727ca3ucg38ysvdU9fQpJHgohyw97IM1DPp0XGO2JBg8zBT6KvlewkUjy6czrk294e3aHoFc4hIGzi6LDoL49FP4dVAj4/A+Ao7qE8UkkfbkinY9G0B6tc8bfUfSuwpBIWysdwB1mXNFoGCb5ZFPaT300kKIvvZVbsx7KIVsLgPcDtOPWokZTBlv2hfBvHx1D/APVHwXZlXk3MhPUc99R10JiwK3kq+THrU/ajABeW5kb5XtqU4xaspjbXYLk40jOZj2qo9JpvMnT43541p5GbHuUcidrMe+kSJdEEhjjsk9tSXgq2gWVAMgwyknr3H6qYMGf+VufpN3Uud51z/V5Hbrz6aH8Yuf8AopPpeyrRhKuhByjfQKjgjO9hbA9fK9WigAmNlmx/do59FTUzWoclXuM9OIFx/joWYQSAjYdvlBF/zV1PGxFMDB3bQN4ewKcfNilK8+RsLd834s0QlpDjaEG/88v2b6OtLb+sRf1fK4/GKPsFVWKNGKTshLqO8f8AtLodhjoRo7mLnluQcfi/ZWv6dYRFFJtoQcfhb/RSr2xjwcW9sezZFa+HvezNZi7Lcs2TNeHsEZrxNwBgLesfzZrSr20VUyLO38yr6tVm7X3Uj7mbW/8ABjHq1jw0GpvuRlnHKyrt207bvwo27qIltp2kwtoo7WRhRojkCjYtGi/Vjd+7SS86H/eI07Gj/gpcmNNGxm13BFsroffreEr8WImvCzh2W2oVDdXFMPRREs85x/XYB27H8FFWu26vt3MLbvgZ/wAtTjg8jSmRV1acg7EUPRzswoVNPkcjaREHUsjb/rqxXMcmOTJAd4591CvHPlstb+abZ/zCqyghU2wW303G02Ac9Bk76butOJQAQqf1go4RSY3tB/8AZ/jrksY3bTQZ/OZ/zVsYKjdTT6gMOmP0Ky/Jlz6aWdOuM7KzEDqLe2joSqDc6eYk+mnBM4P+8OF6gpxSLHua8jIw6PctzznzMe+lwaVMow22w7D7amoijjfMxPk9lPcQ2NpHY9lZKMOjDdqyKS1dBgW0zeXFO+LymIDiAvlxmjnaRRvMo7QmR9lJcsQCZJD+rHdSQ4fHdg5uqIa50+aVgysFI6wfVNCrot0RnjV/e9Sp0LxjhdqQ564x3VIrpmVB91+ruq/Ji+xOyKkiuJSSq3mOyRsf4aYa0ufgy/pzP3CtcHBHQRv8Rb6cnfTicF9DXm05T8ot31XTLyFrwZCsTKeWkJ+VK/rUdaKBPERFbZx0ykf5q1L+jWi/k2PzbXfXhwa0XP8Aw5D5c99bpYKSRAadJMEwI7UDHOJz3Uq+lODtC2J/PHuqf/o3ov5MiPlBPprw4OaL0aVBntjptxbKBfDbT3lufJNVYurHalLcVB55a2kaDo43fcq2/ZilfcLSBzaVa/sVrGmzbMZS2CgbUcePiyD0mkPDHtbi47AqkfbW2LpOnJ73S7YdvEpSxp1iP/brfzQpWOAajDxCuffuPJGKKgjYBtmWTzwrWzjT7Ic2nwD9UlK8RtOixh/ZrS8p+TdRjkscpTHGRnm3NF3UxJZSMxJEJHZlf8wrafErX/oYf2a10WdsOaxhB/NrWvHYajFVsnHMkZ7OMP8A5KV4jKwwLSM56eN/jrafFYB/ykX0FpQt4BzWsfmVa3RsGoxQ6ZOP+Tb9GT20nxN1PLhuB2CQdxrbuJj6LZR+ite4pR/YL8y1ix13M1GI+KkndFcedwfRTghZRjipD83dW17C9EC581eC/wBwo8mKHjvuCkYqImz95lHaD7KWNoDBWbHb/pW0Y6ovsruW/F4/SFYsXqbqMhs4JPvqQK3ymNFMZQcGzXzSHurVMt8H96vbT/B/ep9ItkS/CKyUNtR3gwcHNs+44z1dVVaXws6GlxJb/c/V3eNip2bdDvBwccvfXdGlnldLVri646+kmZri703HGYLdIkwFK7Wxu96vkyuTwaQzvJI3CnhMokYtsx34VVz0AbPN0VVrT1IYnkbetfHvYz/6saexxFoGvysf7NbddoDrxt5x2jdSW8KTMPceB3CRvLaH0Zp3/wBJtJP33WeEMrAYDyX3R5lrkXgh4NtCqXs+qXbD8Ka8Pl5his28FgDUfCzcafa8fc8D9Wt4ubjLpWiQHq2ih309H4X9JdUZrZ0ZjvQs+R8yEH5/mqu+E/wc8G+DfBC41LSLSaK6jkiAdp2bAZsHcTWO6che6QszYQ+msYI+wPHbjd/sq7z2ND69eN9c4/4Ve/Sh/wDJRhBG8Mceaou/1MQ7KQyK7sQo2huJO7du37+2hK+gGe+Efhfws0K1niNrbW1veFo7SWI5uO04DkKQDz795FUHgXwl1LRuHmlJJc3MsU5W3ubbxzjdtnJUZDEBWBK5GdxB378VbPCDZaldSXmu6nOgfT5EW0iUhI3jVsksm0WJYnoPNjqqI8EPBvStYuru71WNZri1eMwIWbG0cks2Oc9XQME45qxzio3ZR4pp7o3AX93k/wCxr0dpkg/8lKF9d9OkXY/WQ+vUNwhFhBasuo3sECnlbU98Yz5mzn5qwrx6/GsXKabwxuILdHLQM9/LslcZ3lc7hvG/fS45Od2qMlGuh9H+O3P5KuvPJF69d8cufyVcj9ZF69Zj4MOH2qX/AAhbg1rl1DqEhQvBf2pBBwu1hsAAjGd+OcYOc1rOy2ffN9XdTCAnjl1+TLj9pH61d8bufyZP+0j9aitlvhN9XdXtlvhsPo91AAnjl1+TLk/rI/Wr3jl1+SrgeWSP1qL2W6ZGPzd1e2T0O31d1AAnjdz06bOB+cj9alC6n/J0/wC0j9aidlvht9XdXtlvht9XdQAMbmf8nzftI/WrnjVx0adOf04/WorZbpdvq7q9snodvq7qABfGrnP/AAyfzSR+tXvG7r8mXP7SP1qK2W+Gw+bur2y341vojuoAqOi2uow3mnxtpstrZx3Msuy1yJOIAjKEEkksGY7SnnwTnHNVhW2yNrx+6GegMuP8NfMZ4S8ItIu/ctVuQ68pWZtvIJzzMD2+U1dNI8M+tvCttPp1tdXKgnjUVhtgDJyoO44BO7dW3Ob+ckvt/UHSWxtYth031152HdXvF1zuvrn6Y7qxl/DJr7x3D2+lWgFvgzZic8WDuGeWD81Nr4W+FEtol0lrYC3c4Vwm843HkmQtz9OKfl+qF1ehf/CbZCXghdxteTMGZQQ5BHTz4A+2svseC3BuCzaKW4up76ZgEFrE6mNhglMscMd+8481M69w21/hbp/3HuWiWGd12jHFsbgc5znsqctdV8QsorWzm3pGIjIDvbHTntO+o5Zcvuj2PZXA/KrcotpfZ79mTsvDDXdMaSK8KtNIiujTKAIgc8wB3+f/AFA06XWtajkmtNZitlDYZZLriWYjpAReaq5O091MUijEztna6SfNml2uhaw0iPBZOrqQylsLvz8Y15ss2STrej6z5Bw2GF/NjLy0vwfQmdV4J6tFZ3M95c200QXMieNM5k382CN++qTeQz2tq0ensVty/GukfJdXUYDKehgCR5/n0R7nhtAjmfVI4SEJKuqs2PMp3ZPkoLhRotjpfBuW/SzltLySaPiXe6Z+NQvgkqXI3jfggEA9eQtseOerVC19Z5PGcZiWPlcVplfRw7VXlL9+5Dzy6EeCNnDqj2tpqh5SSyxyyuyNg8t1RiDnJ2cnAwM7qoetWcn3SV9Lme7SWNX4yBHUDPRvA/k1dLHT+DF48Y1bUZ7eQgEr4iHXzNkgjzdVWX+hvBjT9Nk1294QzzacORF4uiBmPQgGzz9mO3djNXhkm5Nx6vtt/wBPGn7M4fBNSyZG49LSf4vb3Fb8FM54O6jPd6xNHAs0OyssYEkyb8494249O8cwq+2/DpVunafUJntjgJHHDy1xnJLFADndu2ejnrO5OEGjxylbLQbqWLGVN1qOyxHxgibvnNdseGfB8ShNS4LOFzyngv5HYeRTs5+lRXEvwXf8Hj/cf+ppc/D7TxK5iudV4vAxiOIDmGedP58lSUOs6gWbjLXV1hK5SRBCxbzbAH1mguD2j8Fdd0+G90YWcsb5C7aSF1Yc6kNJnI/nIqXn4NRxq0pmsY1UZaSW1LKAN/TJuFUxxn/Ufu/c4OKy8Iq+TQl66q/Jog9W4bwadc8RJLq22BlhsW42d/Vs0heHtm658d1RDj+1WDH7qGojVLiz1G5TTrE6TK93GyWtzJaMjSHmzEAxYgZztEAHnXaoiTgxZOog8QBmAO0bG5IdgNxPEyjJ39XbU5LMpPS00deHN7LeJc7HNPu1uvubpDr8Orsye5SXEgxvAuIQwHkMFWvg/qUWtRB4NYvBKo5cMqwhl7dyYI7RuqhWen3+lzGXRpF1OGI7UtjKjRToOc8jOerepIzjdRUV9b34nudOlvHkEglbTtpUnhK4yI3LAbO7HMx378DeHxSTdZHT9f1M4zDili5vBxUofSTbf+SfQ03xa4xu1Kf9nH6tcFrc536jMezi4/VrM+EPCrX20+Sw0Z7VrxQX8YBiMrrk8hUDHEgGM5Xfg4CnFZLPq17fzlNRvdQWd+bxmZzv6RvPPVduzPKPqk29xjdfSeeNO6k+L3n/AFzfsUr5Y03X9Z0K/WayvJoZUb3u2WV+xlzgj+eetm0nww8FZdOgfV28Uvivu0K2zuqtnoIHMeceWhoDJOEdpIYYTMqi4hnmtZtldxZG6Ozq8lQ9vbyQTJPDI0ciHaDrzirJwgkF3PI8YOZruW4wfjkn01GBeLU7akeSrRhZjlvuDW+pahCh2blNg7mXmz5e3uoKS9kjdcxjAba3AEH56dlgWVyRtZrq2Tf2iuw6sYpnBdhNRsXAfgGx06wv9QuYkeULPIgTDFSuQhwRjnB5+geSrvY8CtBtFUeIrMwGNqY7W7PN1VWOB3DKGfSNPshLbPeQWkYmhdZInLAYJB2dk5OOb4VXyLVLCWQxJe2xkXnTjlLL1bq5pR33R1ricsVUZUvQUumWCxiFLSBI15lRdkDzCuxaZYxSGSK0hDncW2Bkjymn1kRhyHB7QwxSXmiRTtyIvaXwBW26og93bG3trS3t5jBbwxko2SqBeisE8JcspvNNjlVdiGDi48SLuGxGzDZ2QVPKU5LNkdWK2bWOE+g2EEpu9Zs0wpyizKz+ZRvJ7BWQcLpRqlhaW893oEC2m2ycTcySN73BGOKHPsgjPYPJu7AzTW5LpdUukuHkDLK2Mk42c7sdmObG6rno+mC5sra2Mjy2lqMiASYLyPv3ke9zyt/OFjbG8ioW81XTb/Q/FLks08IDW8nFklT1Z6jzY8/RV14B25l4GapeRuVnhS6ZHUcoMtumCo7A8nnoaoLb6gElrptyILWays4vGHAh1C0jMYjDKuxJs4yyFmKsCSRst01W+EGnNHZ29xJHsXAeS2uEz72WM7x9Y+vFXqJY7jS4U8V2rfiNh3AROJbYBUY2mKDlcwC++3DpMD4Qr63kW4jjj2HS9fjG3e6Pg7TfPuz2eSsTNrd+hCcDtcXQtT8YaWeJHUYlhxtI496TkEbO8g7juJ3Hmq8xcPtBuv6zr+qPeyE7rHxaWaCMA7sIxRS+ccogjqVap/gp02x17htbWGqwia1eKUmMkjJCnG8fPW3aVwH07Q7eSxn0y01XTGYtHJNbI88QJyQ27lrnmI3jqOM1rMM7l8JXBs63Bcumsz2tsrLDGI4osZHVGy7s58wHP0TFh4SuCslrZ2SQQpBLOZb37pJIuJGILSR7AkAO0WOOSB1ipjWPBFwW1qNptLjm0y4yfvRJTa7UJ6PikVnmveCnVtESRuLe9tMcqWyhDFQD0qSXHm3dZpZPY2LadpmmztYX8Pjml366xZw7+Mtpw93ZY5iGG91+K2/pBNRupWdpqIiub2ZUkk/3TWrTckh6BKBvDdB5iMdlYnCunWsonsr2+t7mNuTKm4ofMAfrqa0DhxqehXMwkkTVrG4Obm3nz7p1nJG5u3ec1KlL5rVr46F45HGXOxS0ZV3XSXpJfn7/ACT+v2uuaLcGG9ubgiTlLIs7Mkq/CDZ3j66hNb0q3mhLrfxT3JOH2Qxyd/KLEb+Yb9x5uir1p3CvQ761a3hl8a0yQ+6abenYntiemM9OPiny8+aA1ngubKL7r6Iy6lpnTtLloux19NQeOeB6o9Pjqe3wntHhvai5HELl5Po7VL1i6tGUXU1ykvFXYJdBgE85HR5aa8ZUbsZ7atOu+K6q7ZijtpY1GVjUgoR1g82d2dwFVYWkx5onYdYU4rqx5HJXR5XF8HyMlJ2n9X30XqOJJpNs7gN2D6KJj0qO929tzFGOdwuST1YyKbRio3WzfTPdXfGHG4Wpz2n2V282NUjzOXK7YgaHaQScm+bP95CF+vaNHQWUJTAuIGIG4h6jpGLHlWy5/R7qegupIcbNqpA+T3UqypGvG2WKxhtrK78ajGzJsbBCxhwPMfJRwnSTaBt7Bg5/Dslyu7GQevu7cVAQavsgB7Nj8nZouPXrZffWUo7Qo763VBmJTT2J+R9PZrVvFI4jECJikYBfAA35GCRUdq8emTzsY4BxTDIDgZX+eb7eehpNfsyMeLXP0fbQU2p2cjZNtc/RPfQpwM0T8CzwX0+5lV7R3Xfy1fGPNip2Xg5YNbuJFVi2RzZqLsNdsLQcq1ucfJ7zUonC3SAVLw3A7Co76NcTXGb6lXu+A9mk6Es8cORtNEMkDO846Tipng7d6boUk9tbca9tHIJWN0McnZxtkdC8p0YjOzmNj01JzcMtFkTHFTHdjeq99RWpatwevrdUjS5hmT7zLFgNGesZP1dPNSTcWbFSQLf2lvosU95HfRXFgNl4raRw7tkS5Q78e+kU5B3hAN5G/MNbvWuTiRmZ2cyOx/CZjvPNU9rUWpai6IGtGjiLbDRxiHazzkqN2Sd5x01C/wBHNQds+5HyPUbK0WLwKSbPhJ0z4yzD/tOfRX0hcvqe3IttBHjACMWGzv6T07uc+Tdmvmfg3b6zoOo21/pxtUuIHZlZwG3lSpz5id1WafhPw54wyLq8iljn3NUIHYAWO6lavuMtuxsq3PCU5YWVspwBsO2cnG8ghubPXvxTkF3rTSwq1rFsE8osuwQuef353jfu6efI97WKHhp4QYSNjVJnx0NbQEH6qXH4SvCHCw24LaRQcnNsvK7DgimEpgPhBtrSbwh67HPNBARLGV29xYGJTu3/AM5qLi0nQ0/3i9iLH4LhfTQvCY6rwk1661i70+K3uLgqWCS8kFVVd28nor1svCO3QCHWXt9nmKXDqR51HprpjxKjFJxRGWDU7sj+EVtp8N9H9yn45GTL8raAOevyUdoHDPWuDsnG2U4eM8lo7gF0cdRG7I89cuNK1C9nFxqGsJcTEbJeWWRzgdBJ304mgxAk8ZY+cSN9rVCctTtIpyk0r3oe1rhjaarJHLHpjWjJ7xElBEbdOw2AwXpwScfNivy6gzuWSJUU8wMhqcbg7byrhp7VT1xJs4+djSP6K2fTeN9JanGOnpZ15eIyZElKnXelf2urZaeJi6Y8fP3V7iYPg4/So8W/TgnyVwwfFYfpCmIAIig6M+ZlrvFR9G2D2OO+izDu/C+ekmHHON389tAA/Er8KQ+evcQvXIPLmiOKTqrnFR0AMcQvwm+ia94uvQ+PKKf4qL+f9K7xQA3McUACmD+9WucQeiRT56L4sD8NhXNkfjSf0aABeIb4SmuG2c82zROyPhjzrXQmThTGT8k0ABG1k6QppBs2PPGp7KkeIk+Cnmr3EuOdB9KgCN8TI3iBR81dFs45o1FSQjb8X+9XuKf8WR5G9tAEabeTpVx5GNcNu3959I1J8WwGSrAeUUkjHSw+agCLMDdcg8p9tIMDfDceTFS4GTjaau7HxvnFAEKYGx98kPzd1c4hvhOfKtTRTrZfo1wxr0bPzUBRCGBusDyp7aTxLfCX6I76nOK+KvmPsr3FfE/eoMo//9k=", + 3, + "TDD", + LocalDateTime.now() + .plusDays(7), + LocalDateTime.now() + .plusDays(14) + ); + roomRepository.save(room); + + participationRepository.saveAll( + List.of( + new Participation(room.getId(),members.get(0).getId()), + new Participation(room.getId(),members.get(1).getId()), + new Participation(room.getId(),members.get(2).getId()), + new Participation(room.getId(),members.get(3).getId()), + new Participation(room.getId(),members.get(4).getId()), + new Participation(room.getId(),members.get(5).getId()), + new Participation(room.getId(),members.get(6).getId()), + new Participation(room.getId(),members.get(7).getId()) + + )); + } +} diff --git a/backend/src/main/java/corea/domain/Member.java b/backend/src/main/java/corea/domain/Member.java index 22487ce1f..3bb8a8e87 100644 --- a/backend/src/main/java/corea/domain/Member.java +++ b/backend/src/main/java/corea/domain/Member.java @@ -21,8 +21,9 @@ public class Member { private Long id; private String email; + private String name; - public Member(final String email) { - this(null, email); + public Member(final String email, final String name) { + this(null,email,name); } } diff --git a/backend/src/main/java/corea/dto/ApiResponse.java b/backend/src/main/java/corea/dto/ApiResponse.java new file mode 100644 index 000000000..e79360ae4 --- /dev/null +++ b/backend/src/main/java/corea/dto/ApiResponse.java @@ -0,0 +1,4 @@ +package corea.dto; + +public record ApiResponse(String message) { +} diff --git a/backend/src/main/java/corea/dto/MatchedGroupResponse.java b/backend/src/main/java/corea/dto/MatchedGroupResponse.java new file mode 100644 index 000000000..6085c0f2c --- /dev/null +++ b/backend/src/main/java/corea/dto/MatchedGroupResponse.java @@ -0,0 +1,6 @@ +package corea.dto; + +import java.util.List; + +public record MatchedGroupResponse(List emails) { +} diff --git a/backend/src/main/java/corea/member/controller/MemberController.java b/backend/src/main/java/corea/member/controller/MemberController.java new file mode 100644 index 000000000..27251db17 --- /dev/null +++ b/backend/src/main/java/corea/member/controller/MemberController.java @@ -0,0 +1,29 @@ +package corea.member.controller; + +import corea.dto.ApiResponse; +import corea.dto.MatchedGroupResponse; +import corea.member.service.MatchService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +public class MemberController { + private final MatchService matchService; + + @GetMapping("/my/reviewer") + public MatchedGroupResponse getMyReviewer(@RequestHeader("Authorization") final String email) { + return matchService.getMatchedGroup(email); + } + + @GetMapping("/my/reviewee") + public MatchedGroupResponse getMyReviewee(@RequestHeader("Authorization") final String email) { + return matchService.getMatchedGroup(email); + } + + @PostMapping("/match/{roomId}") + public ApiResponse match(@PathVariable final long roomId) { + matchService.match(roomId); + return new ApiResponse("GOOD"); + } +} diff --git a/backend/src/main/java/corea/member/domain/Matching.java b/backend/src/main/java/corea/member/domain/Matching.java index 8f050e23c..489140795 100644 --- a/backend/src/main/java/corea/member/domain/Matching.java +++ b/backend/src/main/java/corea/member/domain/Matching.java @@ -1,6 +1,5 @@ package corea.member.domain; -import corea.domain.Member; import lombok.NoArgsConstructor; import org.springframework.stereotype.Component; @@ -13,18 +12,17 @@ @NoArgsConstructor(access = PROTECTED) public class Matching { - public Map> matchGroup(final List members, final int matchingSize) { + public Map> matchGroup(final List memberIds, final int matchingSize) { final Map> matchedGroup = new HashMap<>(); - final List memberIds = new ArrayList<>(members.stream().map(Member::getId).toList()); Collections.shuffle(memberIds); - final List> groupedMemberIds = IntStream.range(0, (members.size() + matchingSize - 1) / matchingSize) + final List> groupedMemberIds = IntStream.range(0, (memberIds.size() + matchingSize - 1) / matchingSize) .mapToObj(i -> memberIds.subList(i * matchingSize, Math.min(i * matchingSize + matchingSize, memberIds.size()))) .toList(); long groupId = 1L; - for (List l : groupedMemberIds) { + for (final List l : groupedMemberIds) { matchedGroup.put(groupId++, l); } diff --git a/backend/src/main/java/corea/member/entity/MatchedGroup.java b/backend/src/main/java/corea/member/entity/MatchedGroup.java index bba05e210..be1de8e26 100644 --- a/backend/src/main/java/corea/member/entity/MatchedGroup.java +++ b/backend/src/main/java/corea/member/entity/MatchedGroup.java @@ -4,6 +4,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import static jakarta.persistence.GenerationType.IDENTITY; @@ -12,6 +13,7 @@ @Entity @NoArgsConstructor(access = PROTECTED) @AllArgsConstructor +@Getter public class MatchedGroup { @Id @@ -25,4 +27,7 @@ public class MatchedGroup { public MatchedGroup(final Long groupId, final Long memberId) { this(null, groupId, memberId); } + public boolean isEqualMember(final long memberId){ + return this.memberId.equals(memberId); + } } diff --git a/backend/src/main/java/corea/member/repository/MatchedGroupRepository.java b/backend/src/main/java/corea/member/repository/MatchedGroupRepository.java index 6dad5156e..270ac67ed 100644 --- a/backend/src/main/java/corea/member/repository/MatchedGroupRepository.java +++ b/backend/src/main/java/corea/member/repository/MatchedGroupRepository.java @@ -4,10 +4,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface MatchedGroupRepository extends JpaRepository { - Long findGroupIdByMemberId(final Long memberId); + Optional findOneByMemberId(final long memberId); - List findMemberIdsByGroupId(final Long groupId); + List findByGroupId(final long groupId); } diff --git a/backend/src/main/java/corea/member/service/MatchService.java b/backend/src/main/java/corea/member/service/MatchService.java new file mode 100644 index 000000000..b89a5a981 --- /dev/null +++ b/backend/src/main/java/corea/member/service/MatchService.java @@ -0,0 +1,53 @@ +package corea.member.service; + +import corea.domain.Member; +import corea.domain.Participation; +import corea.dto.MatchedGroupResponse; +import corea.member.entity.MatchedGroup; +import corea.member.repository.MatchedGroupRepository; +import corea.repository.MemberRepository; +import corea.repository.ParticipationRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class MatchService { + private final MatchingService matchingService; + private final ParticipationRepository participationRepository; + private final MatchedGroupRepository matchedGroupRepository; + private final MemberRepository memberRepository; + + public void match(final long roomId) { + final List participations = participationRepository.findAllByRoomId(roomId); + + matchingService.matchMaking(participations, 2); + } + + public MatchedGroupResponse getMatchedGroup(final String email) { + final Member member = memberRepository.findByEmail(email) + .orElseThrow(() -> new IllegalArgumentException(String.format("%s는 없는 이메일입니다.", email))); + + final MatchedGroup matchedGroup = matchedGroupRepository.findOneByMemberId(member.getId()) + .orElseThrow(IllegalArgumentException::new); + + final List memberIds = matchedGroupRepository.findByGroupId(matchedGroup.getGroupId()) + .stream() + .filter(matching -> !matching.isEqualMember(member.getId())) + .map(MatchedGroup::getMemberId) + .toList(); + + + + final List memberEmails = + memberIds.stream() + .map(id -> memberRepository.findById(id) + .orElse(null)) + .map(Member::getEmail) + .toList(); + + return new MatchedGroupResponse(memberEmails); + } +} diff --git a/backend/src/main/java/corea/member/service/MatchingService.java b/backend/src/main/java/corea/member/service/MatchingService.java index 5bcd82492..9347ef2a2 100644 --- a/backend/src/main/java/corea/member/service/MatchingService.java +++ b/backend/src/main/java/corea/member/service/MatchingService.java @@ -1,12 +1,13 @@ package corea.member.service; -import corea.domain.Member; +import corea.domain.Participation; import corea.member.domain.Matching; import corea.member.entity.MatchedGroup; import corea.member.repository.MatchedGroupRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -17,10 +18,17 @@ public class MatchingService { private final MatchedGroupRepository matchedGroupRepository; private final Matching matching; - public void matchMaking(final List members, final int matchingSize) { - final Map> results = matching.matchGroup(members, matchingSize); - results.entrySet().stream() - .flatMap(entry -> entry.getValue().stream() + public void matchMaking(final List participations, final int matchingSize) { + final ArrayList memberIds = new ArrayList<>(participations.stream() + .map(Participation::getMemberId) + .toList() + ); + + final Map> results = matching.matchGroup(memberIds, matchingSize); + results.entrySet() + .stream() + .flatMap(entry -> entry.getValue() + .stream() .map(memberId -> new MatchedGroup(entry.getKey(), memberId))) .forEach(matchedGroupRepository::save); } diff --git a/backend/src/main/java/corea/repository/MemberRepository.java b/backend/src/main/java/corea/repository/MemberRepository.java index 6dd41b982..21347d678 100644 --- a/backend/src/main/java/corea/repository/MemberRepository.java +++ b/backend/src/main/java/corea/repository/MemberRepository.java @@ -3,5 +3,8 @@ import corea.domain.Member; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface MemberRepository extends JpaRepository { + Optional findByEmail(String email); } diff --git a/backend/src/main/java/corea/repository/ParticipationRepository.java b/backend/src/main/java/corea/repository/ParticipationRepository.java index d48a7f409..ddd72ccda 100644 --- a/backend/src/main/java/corea/repository/ParticipationRepository.java +++ b/backend/src/main/java/corea/repository/ParticipationRepository.java @@ -3,5 +3,8 @@ import corea.domain.Participation; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface ParticipationRepository extends JpaRepository { + List findAllByRoomId(long roomId); }