From a93ba35f97c3450b8a16bf1f67c38bdcd52b79ce Mon Sep 17 00:00:00 2001 From: swing <69034766+swing-park@users.noreply.github.com> Date: Mon, 17 May 2021 15:33:14 +0900 Subject: [PATCH 001/117] Update README.md --- README.md | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8ec09bd21..bce0d264b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,31 @@ -# airbnb -그룹 프로젝트 #4 +# ✈️ airbnb + +## Team-08 + +## 👨‍👧‍👦 Members + +[Swing](https://github.com/swing-park) 🏌️‍♂️ : 뷰깎기인형🧚‍♂️

+[Marco](https://github.com/95degree) 👻 : 명상으로 코드 석가모니가 된 ⛩⛩

+[Lia](https://github.com/Lia316) 🐿 : 까먹지...않을 거에요..🌰

+ +--- + +## 🔗 Links + +- ### [Notion](https://www.notion.so/Team08-768dcf3cb1054933817c84a567c7ac97) +- ### [Team Convention](https://github.com/swing-park/airbnb/wiki) +- ### [IOS 데모 화면]() +- ### [FE 데모 화면]() + +--- + +## 📜 스케줄표 + +| 시간 | 내용 | +|-----|-----| +|10:00 ~ 10:30| 데일리 스크럼 | +|10:30 ~ 12:30| 클래스별 수업 or 프로젝트 진행 | +|12:30 ~ 14:00| 점심 시간 🍚 | +|14:00 ~ 14:30| 팀 회의 | +|14:30 ~ 17:30| 프로젝트 진행 | +|17:30 ~ 18:00| 회고 | From f0b5b617490fadb3776c1307b26f915905506fed Mon Sep 17 00:00:00 2001 From: swing <69034766+swing-park@users.noreply.github.com> Date: Mon, 17 May 2021 20:52:27 +0900 Subject: [PATCH 002/117] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index bce0d264b..e5a374931 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,9 @@ ## Team-08 +### TMI로 똘똘뭉친 우리의 이야기 +[저희의 TMI,, 들어보실래요 ?](https://www.notion.so/f3914a95f61a4128a580cd4051d4aeb3) + ## 👨‍👧‍👦 Members [Swing](https://github.com/swing-park) 🏌️‍♂️ : 뷰깎기인형🧚‍♂️

From d5c34542553f4a09f3679b21fde0265b077d0aee Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 18 May 2021 12:32:43 +0900 Subject: [PATCH 003/117] =?UTF-8?q?feat:=20=E2=9C=A8=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=20=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/.gitignore | 37 ++++ BE/build.gradle | 24 +++ BE/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes BE/gradle/wrapper/gradle-wrapper.properties | 5 + BE/gradlew | 185 ++++++++++++++++++ BE/gradlew.bat | 89 +++++++++ BE/settings.gradle | 1 + .../main/java/airbnb/AirbnbApplication.java | 13 ++ BE/src/main/resources/application.properties | 1 + .../java/airbnb/AirbnbApplicationTests.java | 13 ++ 10 files changed, 368 insertions(+) create mode 100644 BE/.gitignore create mode 100644 BE/build.gradle create mode 100644 BE/gradle/wrapper/gradle-wrapper.jar create mode 100644 BE/gradle/wrapper/gradle-wrapper.properties create mode 100644 BE/gradlew create mode 100644 BE/gradlew.bat create mode 100644 BE/settings.gradle create mode 100644 BE/src/main/java/airbnb/AirbnbApplication.java create mode 100644 BE/src/main/resources/application.properties create mode 100644 BE/src/test/java/airbnb/AirbnbApplicationTests.java diff --git a/BE/.gitignore b/BE/.gitignore new file mode 100644 index 000000000..c2065bc26 --- /dev/null +++ b/BE/.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/BE/build.gradle b/BE/build.gradle new file mode 100644 index 000000000..727a35a42 --- /dev/null +++ b/BE/build.gradle @@ -0,0 +1,24 @@ +plugins { + id 'org.springframework.boot' version '2.4.5' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'java' +} + +group = 'com.example' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '1.8' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-web' + runtimeOnly 'mysql:mysql-connector-java' + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +test { + useJUnitPlatform() +} diff --git a/BE/gradle/wrapper/gradle-wrapper.jar b/BE/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/BE/gradle/wrapper/gradle-wrapper.properties b/BE/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..442d9132e --- /dev/null +++ b/BE/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/BE/gradlew b/BE/gradlew new file mode 100644 index 000000000..4f906e0c8 --- /dev/null +++ b/BE/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# 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 + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/BE/gradlew.bat b/BE/gradlew.bat new file mode 100644 index 000000000..107acd32c --- /dev/null +++ b/BE/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/BE/settings.gradle b/BE/settings.gradle new file mode 100644 index 000000000..aab815121 --- /dev/null +++ b/BE/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'airbnb' diff --git a/BE/src/main/java/airbnb/AirbnbApplication.java b/BE/src/main/java/airbnb/AirbnbApplication.java new file mode 100644 index 000000000..7065b5170 --- /dev/null +++ b/BE/src/main/java/airbnb/AirbnbApplication.java @@ -0,0 +1,13 @@ +package airbnb; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AirbnbApplication { + + public static void main(String[] args) { + SpringApplication.run(AirbnbApplication.class, args); + } + +} diff --git a/BE/src/main/resources/application.properties b/BE/src/main/resources/application.properties new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/BE/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/BE/src/test/java/airbnb/AirbnbApplicationTests.java b/BE/src/test/java/airbnb/AirbnbApplicationTests.java new file mode 100644 index 000000000..90dc2997b --- /dev/null +++ b/BE/src/test/java/airbnb/AirbnbApplicationTests.java @@ -0,0 +1,13 @@ +package airbnb; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class AirbnbApplicationTests { + + @Test + void contextLoads() { + } + +} From 0f10ebf3888bbe9891aa21a1c6099f0c41e9913a Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 18 May 2021 15:32:36 +0900 Subject: [PATCH 004/117] =?UTF-8?q?feat:=20=E2=9C=A8=20=EC=8A=A4=ED=82=A4?= =?UTF-8?q?=EB=A7=88=20sql=EB=AC=B8=20=EC=83=9D=EC=84=B1(#6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/shcema.sql | 96 ++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 BE/src/main/resources/shcema.sql diff --git a/BE/src/main/resources/shcema.sql b/BE/src/main/resources/shcema.sql new file mode 100644 index 000000000..c5f6d7075 --- /dev/null +++ b/BE/src/main/resources/shcema.sql @@ -0,0 +1,96 @@ +create databases airbnb; + +drop table city; +create table city( + id int not null auto_increment, + name varchar(45) not null, + latitude int, + longitude int, + primary key(id) +); + +drop table category; +create table category( + id int not null auto_increment, + name varchar(45) not null +); + +drop tabel room; +create table room( + id int not null auto_increment, + price int not null, + title varchar (45) not null, + description varchar (300), + people int not null, + oneroom tinyint(1) not null default 0, + bed int not null default 0, + bath int not null default 0, + hair_dryer tinyint(1) not null default 0, + air_conditioner tinyint(1) not null default 0, + wifi tinyint(1) not null default 0, + clean_tax int , + service_tax int , + accommodation_tax int, + city_id int not null, + category_id int not null, + + primary key (id), + foreign key (city_id) references city(id), + foreign key (category_id) references category(id) +); + +drop table image; +create table image( + id int not null auto_increment, + url varchar(100) not null, + room_id int, + category_id int, + city_id int, + image_type_id int not null, + primary key (id), + foreign key (room_id) references room(id), + foreign key (category_id) references category(id), + foreign key (city_id) references city(id), + foreign key (image_type_id) references image_type(id) +); + +drop table image_type; +create table image_type( + id int not null auto_increment, + type varchar(45) not null, + primary key (id) +); + +drop table user; +create tabel user( + id varchar(45) not null, + primary key (id) +) + +drop table wish_list; +create table wish_list( + id int not null auto_increment, + room_id int not null, + user_id varchar(45) not null, + save tinyint(1) not null default 1, + primary key (id), + foreign key (room_id) references room(id), + foreign key (user_id) references `user`(id) +); + +drop table reservation; +create table reservation( + id int not null auto_increment, + room_id int not null, + user_id varchar(45), + check_in datetime, + check_out datetime, + cancel tinyint(1) not null default 0, + primary key (id), + foreign key (room_id) references room(id), + foreign key (user_id) references user(id) +); + + + + From e58df9276df85a33989b8b65e76c7557cce021e9 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 18 May 2021 15:48:30 +0900 Subject: [PATCH 005/117] =?UTF-8?q?fix:=20=F0=9F=90=9E=EC=8A=A4=ED=82=A4?= =?UTF-8?q?=EB=A7=88=20sql=EB=AC=B8=20=EC=88=98=EC=A0=95(#6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/shcema.sql | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/BE/src/main/resources/shcema.sql b/BE/src/main/resources/shcema.sql index c5f6d7075..bb42182f1 100644 --- a/BE/src/main/resources/shcema.sql +++ b/BE/src/main/resources/shcema.sql @@ -12,7 +12,8 @@ create table city( drop table category; create table category( id int not null auto_increment, - name varchar(45) not null + name varchar(45) not null, + primary key(id) ); drop tabel room; @@ -61,11 +62,11 @@ create table image_type( primary key (id) ); -drop table user; -create tabel user( +drop table 'user'; +create table user( id varchar(45) not null, primary key (id) -) +); drop table wish_list; create table wish_list( From 74bd4127ce3e223a7555d6a36d7ca7bbd694a83c Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 18 May 2021 16:30:33 +0900 Subject: [PATCH 006/117] =?UTF-8?q?feat:=20=E2=9C=A8mock=20api=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/MainMockResponse.java | 5 +++++ .../java/airbnb/controller/MainController.java | 14 ++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 BE/src/main/java/airbnb/MainMockResponse.java create mode 100644 BE/src/main/java/airbnb/controller/MainController.java diff --git a/BE/src/main/java/airbnb/MainMockResponse.java b/BE/src/main/java/airbnb/MainMockResponse.java new file mode 100644 index 000000000..b04b99c54 --- /dev/null +++ b/BE/src/main/java/airbnb/MainMockResponse.java @@ -0,0 +1,5 @@ +package airbnb; + +public class MainMockResponse { + +} diff --git a/BE/src/main/java/airbnb/controller/MainController.java b/BE/src/main/java/airbnb/controller/MainController.java new file mode 100644 index 000000000..5cd3fd7db --- /dev/null +++ b/BE/src/main/java/airbnb/controller/MainController.java @@ -0,0 +1,14 @@ +package airbnb.controller; + +import airbnb.MainMockResponse; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MainController { + + @GetMapping("/main") + public MainMockResponse showMain(){ + return new MainMockResponse(); + } +} From f2a1bd62db79b584868b45e428a7bf336e025604 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 18 May 2021 16:55:20 +0900 Subject: [PATCH 007/117] =?UTF-8?q?feat:=20=E2=9C=A8CityListResponse=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 도시에 관한 정보를 담기 위해 Wrapper dto생성 --- BE/src/main/java/airbnb/CityListResponse.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 BE/src/main/java/airbnb/CityListResponse.java diff --git a/BE/src/main/java/airbnb/CityListResponse.java b/BE/src/main/java/airbnb/CityListResponse.java new file mode 100644 index 000000000..2f1c531cd --- /dev/null +++ b/BE/src/main/java/airbnb/CityListResponse.java @@ -0,0 +1,4 @@ +package airbnb; + +public class CityListResponse { +} From 8d661f90e76180c2a1565ca8fbe4eec10991f711 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 18 May 2021 16:56:03 +0900 Subject: [PATCH 008/117] =?UTF-8?q?feat:=20=E2=9C=A8ObjectMapper=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @JsonRootName을 사용하기 위해 objectMapper 설정 --- BE/src/main/java/airbnb/controller/MainController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/BE/src/main/java/airbnb/controller/MainController.java b/BE/src/main/java/airbnb/controller/MainController.java index 5cd3fd7db..99cae0436 100644 --- a/BE/src/main/java/airbnb/controller/MainController.java +++ b/BE/src/main/java/airbnb/controller/MainController.java @@ -1,6 +1,8 @@ package airbnb.controller; import airbnb.MainMockResponse; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -9,6 +11,8 @@ public class MainController { @GetMapping("/main") public MainMockResponse showMain(){ + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE); return new MainMockResponse(); } } From 57886365766736128fd1dc5215a82cb7011439c2 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 18 May 2021 16:59:49 +0900 Subject: [PATCH 009/117] =?UTF-8?q?feat:=20=E2=9C=A8CityListWrapper=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CityList를 Wrapper로 감싸주기 위해 CityListWrapper를 생성 --- BE/src/main/java/airbnb/CityListResponse.java | 4 ---- BE/src/main/java/airbnb/CityListWrapper.java | 10 ++++++++++ 2 files changed, 10 insertions(+), 4 deletions(-) delete mode 100644 BE/src/main/java/airbnb/CityListResponse.java create mode 100644 BE/src/main/java/airbnb/CityListWrapper.java diff --git a/BE/src/main/java/airbnb/CityListResponse.java b/BE/src/main/java/airbnb/CityListResponse.java deleted file mode 100644 index 2f1c531cd..000000000 --- a/BE/src/main/java/airbnb/CityListResponse.java +++ /dev/null @@ -1,4 +0,0 @@ -package airbnb; - -public class CityListResponse { -} diff --git a/BE/src/main/java/airbnb/CityListWrapper.java b/BE/src/main/java/airbnb/CityListWrapper.java new file mode 100644 index 000000000..fde74f934 --- /dev/null +++ b/BE/src/main/java/airbnb/CityListWrapper.java @@ -0,0 +1,10 @@ +package airbnb; + +public class CityListWrapper { + + List cities; + + public CityListWrapper(List cities) { + this.cities = cities; + } +} From 258783ac1420a9286d35d17d2da77ac3a6f4df28 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 18 May 2021 18:43:46 +0900 Subject: [PATCH 010/117] =?UTF-8?q?feat:=20=E2=9C=A8Get=20Mock=20Api=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/airbnb/AirbnbApplication.java | 3 ++ BE/src/main/java/airbnb/Category.java | 20 +++++++++ BE/src/main/java/airbnb/CityListWrapper.java | 10 ----- BE/src/main/java/airbnb/CityResponse.java | 33 +++++++++++++++ .../airbnb/controller/MainController.java | 41 ++++++++++++++++--- BE/src/main/java/airbnb/domain/City.java | 9 ++++ BE/src/main/resources/application.properties | 2 +- 7 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 BE/src/main/java/airbnb/Category.java delete mode 100644 BE/src/main/java/airbnb/CityListWrapper.java create mode 100644 BE/src/main/java/airbnb/CityResponse.java create mode 100644 BE/src/main/java/airbnb/domain/City.java diff --git a/BE/src/main/java/airbnb/AirbnbApplication.java b/BE/src/main/java/airbnb/AirbnbApplication.java index 7065b5170..6c7323b8a 100644 --- a/BE/src/main/java/airbnb/AirbnbApplication.java +++ b/BE/src/main/java/airbnb/AirbnbApplication.java @@ -1,9 +1,12 @@ package airbnb; import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @SpringBootApplication +@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class AirbnbApplication { public static void main(String[] args) { diff --git a/BE/src/main/java/airbnb/Category.java b/BE/src/main/java/airbnb/Category.java new file mode 100644 index 000000000..b040981d0 --- /dev/null +++ b/BE/src/main/java/airbnb/Category.java @@ -0,0 +1,20 @@ +package airbnb; + +public class Category { + + private String category; + private String image; + + public Category(String category, String image) { + this.category = category; + this.image = image; + } + + public String getCategory() { + return category; + } + + public String getImage() { + return image; + } +} diff --git a/BE/src/main/java/airbnb/CityListWrapper.java b/BE/src/main/java/airbnb/CityListWrapper.java deleted file mode 100644 index fde74f934..000000000 --- a/BE/src/main/java/airbnb/CityListWrapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package airbnb; - -public class CityListWrapper { - - List cities; - - public CityListWrapper(List cities) { - this.cities = cities; - } -} diff --git a/BE/src/main/java/airbnb/CityResponse.java b/BE/src/main/java/airbnb/CityResponse.java new file mode 100644 index 000000000..bc3a425ac --- /dev/null +++ b/BE/src/main/java/airbnb/CityResponse.java @@ -0,0 +1,33 @@ +package airbnb; + +public class CityResponse { + private Long id; + private String name; + private String image; + private int distance; + + public CityResponse(Long id, String name, String image, int distance) { + this.id = id; + this.name = name; + this.image = image; + this.distance = distance; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getImage() { + return image; + } + + public int getDistance() { + return distance; + } +} + + diff --git a/BE/src/main/java/airbnb/controller/MainController.java b/BE/src/main/java/airbnb/controller/MainController.java index 99cae0436..d4b5d78f6 100644 --- a/BE/src/main/java/airbnb/controller/MainController.java +++ b/BE/src/main/java/airbnb/controller/MainController.java @@ -1,18 +1,49 @@ package airbnb.controller; +import airbnb.Category; +import airbnb.CityResponse; import airbnb.MainMockResponse; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.ArrayList; +import java.util.List; + @RestController public class MainController { @GetMapping("/main") public MainMockResponse showMain(){ - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.enable(SerializationFeature.WRAP_ROOT_VALUE); - return new MainMockResponse(); + CityResponse seoul = new CityResponse(1L,"서울", "https://a0.muscache.com/im/pictures/71e23854-a3c7-491c-b715-6e86233a293f.jpg?im_q=medq&im_w=240",0); + CityResponse gyeonggi = new CityResponse(2L, "경기도", "https://a0.muscache.com/im/pictures/a0eb36e7-b468-4c5e-93b2-819e793563b2.jpg?im_q=medq&im_w=240", 5); + CityResponse cityResponse1 = new CityResponse(3L, "강원도", "https://a0.muscache.com/im/pictures/926d56aa-8b36-4138-8eae-ad991868b858.jpg?im_q=medq&im_w=240", 10); + CityResponse cityResponse2 = new CityResponse(4L, "충청도", "https://a0.muscache.com/im/pictures/f7736f4a-f8b9-4527-b46c-d0d8df856984.jpg?im_q=medq&im_w=240", 30); + CityResponse cityResponse3 = new CityResponse(5L, "전라남도", "https://a0.muscache.com/im/pictures/558a403a-aeed-4829-83a6-c9b0ccf21866.jpg?im_q=medq&im_w=240", 50); + CityResponse cityResponse4 = new CityResponse(6L, "전라북도", "https://a0.muscache.com/im/pictures/a161fb95-6875-4aaa-aecd-3a46dead3220.jpg?im_q=medq&im_w=240", 60); + CityResponse cityResponse5 = new CityResponse(7L, "경상남도", "https://a0.muscache.com/im/pictures/31e445ed-8b69-477b-aefd-d04dae6d0bb1.jpg?im_q=medq&im_w=240", 80); + CityResponse cityResponse6 = new CityResponse(8L, "경상북도", "https://a0.muscache.com/im/pictures/087a8dff-a609-4084-86db-f45051c6f23a.jpg?im_q=medq&im_w=240", 90); + + + List cityResponseList = new ArrayList<>(); + cityResponseList.add(seoul); + cityResponseList.add(gyeonggi); + cityResponseList.add(cityResponse1); + cityResponseList.add(cityResponse2); + cityResponseList.add(cityResponse3); + cityResponseList.add(cityResponse4); + cityResponseList.add(cityResponse5); + cityResponseList.add(cityResponse6); + + Category category1 = new Category("자연생활을 만끽 할 수 있는 숙소", "https://a0.muscache.com/im/pictures/36f53e61-db8d-403c-9122-5b761c0e4264.jpg?im_w=480"); + Category category2 = new Category("독특한 공간", "https://a0.muscache.com/im/pictures/2f13349d-879d-43c6-83e3-8e5679291d53.jpg?im_w=480"); + Category category3 = new Category("집 전체", "https://a0.muscache.com/im/pictures/7d82ca14-56e5-4465-8218-dcfa7d69b6ac.jpg?im_w=480"); + Category category4 = new Category("반려 동물과 함께 할 수 있는 공간", "https://a0.muscache.com/im/pictures/10a638e1-6aff-4313-8033-1275cec83987.jpg?im_w=480"); + List categories = new ArrayList<>(); + categories.add(category1); + categories.add(category2); + categories.add(category3); + categories.add(category4); + + return new MainMockResponse("https://a0.muscache.com/im/pictures/ddc7f01f-3fb3-483c-87e6-701dad52c930.jpg?im_w=1920",cityResponseList,categories); } } diff --git a/BE/src/main/java/airbnb/domain/City.java b/BE/src/main/java/airbnb/domain/City.java new file mode 100644 index 000000000..35a24e5f8 --- /dev/null +++ b/BE/src/main/java/airbnb/domain/City.java @@ -0,0 +1,9 @@ +package airbnb.domain; + +import org.springframework.data.annotation.Id; + +public class City { + @Id + private Long id; + private String name; +} diff --git a/BE/src/main/resources/application.properties b/BE/src/main/resources/application.properties index 8b1378917..7e7b5fded 100644 --- a/BE/src/main/resources/application.properties +++ b/BE/src/main/resources/application.properties @@ -1 +1 @@ - +spring.jackson.serialization.wrap-root-value=true From eac7842dddb0d575a98f0d0b4ebcfb9d63dcf054 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 18 May 2021 18:44:03 +0900 Subject: [PATCH 011/117] =?UTF-8?q?feat:=20=E2=9C=A8Get=20Mock=20Api=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/MainMockResponse.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/BE/src/main/java/airbnb/MainMockResponse.java b/BE/src/main/java/airbnb/MainMockResponse.java index b04b99c54..22765a026 100644 --- a/BE/src/main/java/airbnb/MainMockResponse.java +++ b/BE/src/main/java/airbnb/MainMockResponse.java @@ -1,5 +1,31 @@ package airbnb; +import com.fasterxml.jackson.annotation.JsonRootName; + +import java.util.List; + +@JsonRootName(value = "mainPage") public class MainMockResponse { - + + private String hiroImage; + private List cities; + private List categories; + + public MainMockResponse(String hiroImage, List cities, List categories) { + this.hiroImage = hiroImage; + this.cities = cities; + this.categories = categories; + } + + public String getHiroImage() { + return hiroImage; + } + + public List getCities() { + return cities; + } + + public List getCategories() { + return categories; + } } From 9749e3d81b8243bb386cfac725e5060a8894028a Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 18 May 2021 19:40:05 +0900 Subject: [PATCH 012/117] =?UTF-8?q?bug:=20=F0=9F=90=9E=20=EC=8A=A4?= =?UTF-8?q?=ED=82=A4=EB=A7=88=20=EC=88=98=EC=A0=95(#6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/shcema.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/BE/src/main/resources/shcema.sql b/BE/src/main/resources/shcema.sql index bb42182f1..a048e5bba 100644 --- a/BE/src/main/resources/shcema.sql +++ b/BE/src/main/resources/shcema.sql @@ -1,5 +1,6 @@ create databases airbnb; + drop table city; create table city( id int not null auto_increment, From 2cb34f407abeb9162171c86a63ac31e7136cb767 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 11:46:42 +0900 Subject: [PATCH 013/117] =?UTF-8?q?feat:=20=E2=9C=A8=20main=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=9E=91=EC=97=85=20=EB=B8=8C=EB=9E=9C?= =?UTF-8?q?=EC=B9=98=20=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/Category.java | 20 -------- BE/src/main/java/airbnb/MainMockResponse.java | 31 ------------ .../airbnb/controller/MainController.java | 49 ------------------- 3 files changed, 100 deletions(-) delete mode 100644 BE/src/main/java/airbnb/Category.java delete mode 100644 BE/src/main/java/airbnb/MainMockResponse.java delete mode 100644 BE/src/main/java/airbnb/controller/MainController.java diff --git a/BE/src/main/java/airbnb/Category.java b/BE/src/main/java/airbnb/Category.java deleted file mode 100644 index b040981d0..000000000 --- a/BE/src/main/java/airbnb/Category.java +++ /dev/null @@ -1,20 +0,0 @@ -package airbnb; - -public class Category { - - private String category; - private String image; - - public Category(String category, String image) { - this.category = category; - this.image = image; - } - - public String getCategory() { - return category; - } - - public String getImage() { - return image; - } -} diff --git a/BE/src/main/java/airbnb/MainMockResponse.java b/BE/src/main/java/airbnb/MainMockResponse.java deleted file mode 100644 index 22765a026..000000000 --- a/BE/src/main/java/airbnb/MainMockResponse.java +++ /dev/null @@ -1,31 +0,0 @@ -package airbnb; - -import com.fasterxml.jackson.annotation.JsonRootName; - -import java.util.List; - -@JsonRootName(value = "mainPage") -public class MainMockResponse { - - private String hiroImage; - private List cities; - private List categories; - - public MainMockResponse(String hiroImage, List cities, List categories) { - this.hiroImage = hiroImage; - this.cities = cities; - this.categories = categories; - } - - public String getHiroImage() { - return hiroImage; - } - - public List getCities() { - return cities; - } - - public List getCategories() { - return categories; - } -} diff --git a/BE/src/main/java/airbnb/controller/MainController.java b/BE/src/main/java/airbnb/controller/MainController.java deleted file mode 100644 index d4b5d78f6..000000000 --- a/BE/src/main/java/airbnb/controller/MainController.java +++ /dev/null @@ -1,49 +0,0 @@ -package airbnb.controller; - -import airbnb.Category; -import airbnb.CityResponse; -import airbnb.MainMockResponse; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.ArrayList; -import java.util.List; - -@RestController -public class MainController { - - @GetMapping("/main") - public MainMockResponse showMain(){ - CityResponse seoul = new CityResponse(1L,"서울", "https://a0.muscache.com/im/pictures/71e23854-a3c7-491c-b715-6e86233a293f.jpg?im_q=medq&im_w=240",0); - CityResponse gyeonggi = new CityResponse(2L, "경기도", "https://a0.muscache.com/im/pictures/a0eb36e7-b468-4c5e-93b2-819e793563b2.jpg?im_q=medq&im_w=240", 5); - CityResponse cityResponse1 = new CityResponse(3L, "강원도", "https://a0.muscache.com/im/pictures/926d56aa-8b36-4138-8eae-ad991868b858.jpg?im_q=medq&im_w=240", 10); - CityResponse cityResponse2 = new CityResponse(4L, "충청도", "https://a0.muscache.com/im/pictures/f7736f4a-f8b9-4527-b46c-d0d8df856984.jpg?im_q=medq&im_w=240", 30); - CityResponse cityResponse3 = new CityResponse(5L, "전라남도", "https://a0.muscache.com/im/pictures/558a403a-aeed-4829-83a6-c9b0ccf21866.jpg?im_q=medq&im_w=240", 50); - CityResponse cityResponse4 = new CityResponse(6L, "전라북도", "https://a0.muscache.com/im/pictures/a161fb95-6875-4aaa-aecd-3a46dead3220.jpg?im_q=medq&im_w=240", 60); - CityResponse cityResponse5 = new CityResponse(7L, "경상남도", "https://a0.muscache.com/im/pictures/31e445ed-8b69-477b-aefd-d04dae6d0bb1.jpg?im_q=medq&im_w=240", 80); - CityResponse cityResponse6 = new CityResponse(8L, "경상북도", "https://a0.muscache.com/im/pictures/087a8dff-a609-4084-86db-f45051c6f23a.jpg?im_q=medq&im_w=240", 90); - - - List cityResponseList = new ArrayList<>(); - cityResponseList.add(seoul); - cityResponseList.add(gyeonggi); - cityResponseList.add(cityResponse1); - cityResponseList.add(cityResponse2); - cityResponseList.add(cityResponse3); - cityResponseList.add(cityResponse4); - cityResponseList.add(cityResponse5); - cityResponseList.add(cityResponse6); - - Category category1 = new Category("자연생활을 만끽 할 수 있는 숙소", "https://a0.muscache.com/im/pictures/36f53e61-db8d-403c-9122-5b761c0e4264.jpg?im_w=480"); - Category category2 = new Category("독특한 공간", "https://a0.muscache.com/im/pictures/2f13349d-879d-43c6-83e3-8e5679291d53.jpg?im_w=480"); - Category category3 = new Category("집 전체", "https://a0.muscache.com/im/pictures/7d82ca14-56e5-4465-8218-dcfa7d69b6ac.jpg?im_w=480"); - Category category4 = new Category("반려 동물과 함께 할 수 있는 공간", "https://a0.muscache.com/im/pictures/10a638e1-6aff-4313-8033-1275cec83987.jpg?im_w=480"); - List categories = new ArrayList<>(); - categories.add(category1); - categories.add(category2); - categories.add(category3); - categories.add(category4); - - return new MainMockResponse("https://a0.muscache.com/im/pictures/ddc7f01f-3fb3-483c-87e6-701dad52c930.jpg?im_w=1920",cityResponseList,categories); - } -} From 7419f064c25a1792b2676c37d6bd63f7b13aaf1a Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 11:48:22 +0900 Subject: [PATCH 014/117] =?UTF-8?q?feat:=20=E2=9C=A8=20RoomDao=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dao/RoomDao.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 BE/src/main/java/airbnb/dao/RoomDao.java diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java new file mode 100644 index 000000000..fea0f70e1 --- /dev/null +++ b/BE/src/main/java/airbnb/dao/RoomDao.java @@ -0,0 +1,4 @@ +package airbnb.dao; + +public class RoomDao { +} From 24bc7749c578c59c38657336ef018dcf29fa7f18 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 11:48:57 +0900 Subject: [PATCH 015/117] =?UTF-8?q?feat:=20=E2=9C=A8=20ImageDao=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dao/ImageDao.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 BE/src/main/java/airbnb/dao/ImageDao.java diff --git a/BE/src/main/java/airbnb/dao/ImageDao.java b/BE/src/main/java/airbnb/dao/ImageDao.java new file mode 100644 index 000000000..a3647d8e5 --- /dev/null +++ b/BE/src/main/java/airbnb/dao/ImageDao.java @@ -0,0 +1,4 @@ +package airbnb.dao; + +public class ImageDao { +} From d7e14f999d0208d0213c7df034978b933db9bcb0 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 11:49:42 +0900 Subject: [PATCH 016/117] =?UTF-8?q?feat:=20=E2=9C=A8=20CityDao=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dao/CityDao.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 BE/src/main/java/airbnb/dao/CityDao.java diff --git a/BE/src/main/java/airbnb/dao/CityDao.java b/BE/src/main/java/airbnb/dao/CityDao.java new file mode 100644 index 000000000..000c9499e --- /dev/null +++ b/BE/src/main/java/airbnb/dao/CityDao.java @@ -0,0 +1,4 @@ +package airbnb.dao; + +public class CityDao { +} From 8478a1896248725e5d79c6adcdcfdfe81007bc48 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 11:50:09 +0900 Subject: [PATCH 017/117] =?UTF-8?q?feat:=20=E2=9C=A8=20CategoryDao=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dao/CategoryDao.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 BE/src/main/java/airbnb/dao/CategoryDao.java diff --git a/BE/src/main/java/airbnb/dao/CategoryDao.java b/BE/src/main/java/airbnb/dao/CategoryDao.java new file mode 100644 index 000000000..2a8d1bd15 --- /dev/null +++ b/BE/src/main/java/airbnb/dao/CategoryDao.java @@ -0,0 +1,4 @@ +package airbnb.dao; + +public class CategoryDao { +} From 199b90f5b2badf0fc7551976931e7cff7181f5ee Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 12:01:06 +0900 Subject: [PATCH 018/117] =?UTF-8?q?feat:=20=E2=9C=A8=20findAll=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 모든 도시의 값을 가져오기 위해 findAll 메소드를 생성 --- BE/src/main/java/airbnb/dao/CityDao.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/BE/src/main/java/airbnb/dao/CityDao.java b/BE/src/main/java/airbnb/dao/CityDao.java index 000c9499e..aba473b2a 100644 --- a/BE/src/main/java/airbnb/dao/CityDao.java +++ b/BE/src/main/java/airbnb/dao/CityDao.java @@ -1,4 +1,24 @@ package airbnb.dao; +import airbnb.domain.City; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import javax.sql.DataSource; +import java.util.List; + +@Repository public class CityDao { + + private JdbcTemplate jdbcTemplate; + private CityMapper cityMapper = new CityMapepr; + + public CityDao(DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + public List findAll(){ + String sql = "SELECT id, name FROM city"; + return jdbcTemplate.query(sql,CityMapper); + } } From e156152626d34ef17f27137a45f3a555927ec705 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 12:14:25 +0900 Subject: [PATCH 019/117] =?UTF-8?q?feat:=20=E2=9C=A8=20CityMapper=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/mapper/CityMapper.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 BE/src/main/java/airbnb/mapper/CityMapper.java diff --git a/BE/src/main/java/airbnb/mapper/CityMapper.java b/BE/src/main/java/airbnb/mapper/CityMapper.java new file mode 100644 index 000000000..a666a963b --- /dev/null +++ b/BE/src/main/java/airbnb/mapper/CityMapper.java @@ -0,0 +1,15 @@ +package airbnb.mapper; + +import airbnb.domain.City; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + + +public class CityMapper implements RowMapper { + @Override + public City mapRow(ResultSet rs, int rowNum) throws SQLException{ + return new City(rs.getLong("id"),rs.getString("name")); + } +} From d034dc55d8f4f4b3de53189ad6d93299758ef90e Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 12:15:27 +0900 Subject: [PATCH 020/117] =?UTF-8?q?feat:=20=E2=9C=A8=20CityMapper=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit City 객체 반환을 위해 만든 Mapper를 사용한 로직을 추가 --- BE/src/main/java/airbnb/dao/CityDao.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BE/src/main/java/airbnb/dao/CityDao.java b/BE/src/main/java/airbnb/dao/CityDao.java index aba473b2a..271bf6394 100644 --- a/BE/src/main/java/airbnb/dao/CityDao.java +++ b/BE/src/main/java/airbnb/dao/CityDao.java @@ -1,6 +1,7 @@ package airbnb.dao; import airbnb.domain.City; +import airbnb.mapper.CityMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @@ -11,7 +12,7 @@ public class CityDao { private JdbcTemplate jdbcTemplate; - private CityMapper cityMapper = new CityMapepr; + private CityMapper cityMapper = new CityMapper(); public CityDao(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); @@ -19,6 +20,6 @@ public CityDao(DataSource dataSource) { public List findAll(){ String sql = "SELECT id, name FROM city"; - return jdbcTemplate.query(sql,CityMapper); + return jdbcTemplate.query(sql,cityMapper); } } From bf857120ab65511e756f6b9c601990c4918b68f0 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 12:15:53 +0900 Subject: [PATCH 021/117] =?UTF-8?q?feat:=20=E2=9C=A8=20City=20domain?= =?UTF-8?q?=EC=9D=98=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EB=B0=8F=20getter=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/domain/City.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/BE/src/main/java/airbnb/domain/City.java b/BE/src/main/java/airbnb/domain/City.java index 35a24e5f8..bd24abbc5 100644 --- a/BE/src/main/java/airbnb/domain/City.java +++ b/BE/src/main/java/airbnb/domain/City.java @@ -6,4 +6,17 @@ public class City { @Id private Long id; private String name; + + public City(Long id, String name) { + this.id = id; + this.name = name; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } } From 8c93a1c5e712ee0aebbe6ee810a035c56207838d Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 12:16:40 +0900 Subject: [PATCH 022/117] =?UTF-8?q?feat:=20=E2=9C=A8=20@EnableAutoConfigur?= =?UTF-8?q?ation=20=EC=A0=9C=EA=B1=B0=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dataSource를 추가 해서 실행 하기 위해 어노테이션 제거 --- BE/src/main/java/airbnb/AirbnbApplication.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/BE/src/main/java/airbnb/AirbnbApplication.java b/BE/src/main/java/airbnb/AirbnbApplication.java index 6c7323b8a..a902aad41 100644 --- a/BE/src/main/java/airbnb/AirbnbApplication.java +++ b/BE/src/main/java/airbnb/AirbnbApplication.java @@ -1,16 +1,12 @@ package airbnb; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @SpringBootApplication -@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class AirbnbApplication { public static void main(String[] args) { SpringApplication.run(AirbnbApplication.class, args); } - } From 686e572a72cd7a840a4692b123d6a027fc2b0457 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 12:21:32 +0900 Subject: [PATCH 023/117] =?UTF-8?q?feat:=20=E2=9C=A8=20dataSource=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - db와의 연결을 위해 dataSource 추가 - 쿼리문을 보기 위해 logging 설정 추가 --- BE/src/main/resources/application.properties | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/BE/src/main/resources/application.properties b/BE/src/main/resources/application.properties index 7e7b5fded..8c61c8f9d 100644 --- a/BE/src/main/resources/application.properties +++ b/BE/src/main/resources/application.properties @@ -1 +1,8 @@ +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/airbnb +spring.datasource.username=root +spring.datasource.password=password +logging.level.baseball.*=debug +logging.level.org.springframework.jdbc.*=trace + spring.jackson.serialization.wrap-root-value=true From b6f6def6303e8798673ad05a15428640035dd98a Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 12:30:47 +0900 Subject: [PATCH 024/117] =?UTF-8?q?feat:=20=E2=9C=A8=20MainController=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CityDao 의존성 주입 - 모든 도시의 정보를 찾아오기 위해 readCities() 추가 --- .../airbnb/controller/MainController.java | 23 +++++++++++++++++++ .../java/airbnb/AirbnbApplicationTests.java | 6 ----- 2 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 BE/src/main/java/airbnb/controller/MainController.java diff --git a/BE/src/main/java/airbnb/controller/MainController.java b/BE/src/main/java/airbnb/controller/MainController.java new file mode 100644 index 000000000..e52cc7cac --- /dev/null +++ b/BE/src/main/java/airbnb/controller/MainController.java @@ -0,0 +1,23 @@ +package airbnb.controller; + +import airbnb.dao.CityDao; +import airbnb.domain.City; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class MainController { + + private CityDao cityDao; + + public MainController(CityDao cityDao) { + this.cityDao = cityDao; + } + + @GetMapping("/main") + public List readCities(){ + return cityDao.findAll(); + } +} diff --git a/BE/src/test/java/airbnb/AirbnbApplicationTests.java b/BE/src/test/java/airbnb/AirbnbApplicationTests.java index 90dc2997b..47467f5fd 100644 --- a/BE/src/test/java/airbnb/AirbnbApplicationTests.java +++ b/BE/src/test/java/airbnb/AirbnbApplicationTests.java @@ -1,13 +1,7 @@ package airbnb; -import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class AirbnbApplicationTests { - - @Test - void contextLoads() { - } - } From b17e9737d0522b5076c4568a7ce046dd792ae923 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 17:00:15 +0900 Subject: [PATCH 025/117] =?UTF-8?q?feat:=20=E2=9C=A8=20data.sql=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - City(도시정보) INSERT문 작성 --- BE/src/main/resources/data.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 BE/src/main/resources/data.sql diff --git a/BE/src/main/resources/data.sql b/BE/src/main/resources/data.sql new file mode 100644 index 000000000..b3db697f8 --- /dev/null +++ b/BE/src/main/resources/data.sql @@ -0,0 +1,3 @@ +INSERT INTO city(name) +values ('서울'),('경기도'),('강원도'),('충청도'),('경상남도'),('경상북도'),('전라남도'),('전라북도'); + From 486110470638126399ad11d607e53b711c1eaffd Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 17:02:31 +0900 Subject: [PATCH 026/117] =?UTF-8?q?feat:=20=E2=9C=A8=20CitiesWrapper=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - List를 감싸기 위한 Wrapper 클래스 --- BE/src/main/java/airbnb/wrapper/CitiesWrapper.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 BE/src/main/java/airbnb/wrapper/CitiesWrapper.java diff --git a/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java b/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java new file mode 100644 index 000000000..446fa52fb --- /dev/null +++ b/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java @@ -0,0 +1,4 @@ +package airbnb.wrapper; + +public class CitiesWrapper { +} From d536195f1d950b681c8ea4340f33ce87a23f28ee Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 17:03:54 +0900 Subject: [PATCH 027/117] =?UTF-8?q?feat:=20=E2=9C=A8=20CitiesWrapper=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=20=EB=B0=8F=20getter=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/wrapper/CitiesWrapper.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java b/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java index 446fa52fb..d0a9373dd 100644 --- a/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java +++ b/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java @@ -1,4 +1,18 @@ package airbnb.wrapper; +import airbnb.domain.City; + +import java.util.List; + public class CitiesWrapper { + + private List cities; + + public CitiesWrapper(List cities) { + this.cities = cities; + } + + public List getCities() { + return cities; + } } From 9e7434f595268c6358b8389c787f1fe9f8b5e532 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 17:04:49 +0900 Subject: [PATCH 028/117] =?UTF-8?q?feat:=20=E2=9C=A8=20CitiesWrapper?= =?UTF-8?q?=EB=A1=9C=20return=20=EB=B3=80=EA=B2=BD=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - json으로 출력될때 어떤 데이터의 정보인지 알 수 있게 Wrapper로 감싸서 리턴하도록 변경 --- BE/src/main/java/airbnb/controller/MainController.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/BE/src/main/java/airbnb/controller/MainController.java b/BE/src/main/java/airbnb/controller/MainController.java index e52cc7cac..ea39c2d8b 100644 --- a/BE/src/main/java/airbnb/controller/MainController.java +++ b/BE/src/main/java/airbnb/controller/MainController.java @@ -1,12 +1,10 @@ package airbnb.controller; import airbnb.dao.CityDao; -import airbnb.domain.City; +import airbnb.wrapper.CitiesWrapper; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - @RestController public class MainController { @@ -17,7 +15,7 @@ public MainController(CityDao cityDao) { } @GetMapping("/main") - public List readCities(){ - return cityDao.findAll(); + public CitiesWrapper readCities(){ + return new CitiesWrapper(cityDao.findAll()); } } From 7b8001015d5f63ca9ff67f4e6758c7116dffed1d Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 17:05:12 +0900 Subject: [PATCH 029/117] =?UTF-8?q?feat:=20=E2=9C=A8=20wrap-root-value=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=A0=9C=EA=B1=B0(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/application.properties | 2 -- 1 file changed, 2 deletions(-) diff --git a/BE/src/main/resources/application.properties b/BE/src/main/resources/application.properties index 8c61c8f9d..f173bdc68 100644 --- a/BE/src/main/resources/application.properties +++ b/BE/src/main/resources/application.properties @@ -4,5 +4,3 @@ spring.datasource.username=root spring.datasource.password=password logging.level.baseball.*=debug logging.level.org.springframework.jdbc.*=trace - -spring.jackson.serialization.wrap-root-value=true From 349a8ff4cc423e87a70054c7453c765f733135ff Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 17:10:04 +0900 Subject: [PATCH 030/117] =?UTF-8?q?feat:=20=E2=9C=A8Image=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Image의 정보를 담고 있는 도메인 --- BE/src/main/java/airbnb/domain/Image.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 BE/src/main/java/airbnb/domain/Image.java diff --git a/BE/src/main/java/airbnb/domain/Image.java b/BE/src/main/java/airbnb/domain/Image.java new file mode 100644 index 000000000..820e74a57 --- /dev/null +++ b/BE/src/main/java/airbnb/domain/Image.java @@ -0,0 +1,4 @@ +package airbnb.domain; + +public class Image { +} From 13964f1539d643e50d45ae7553e3ae5bde095fb2 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 17:23:54 +0900 Subject: [PATCH 031/117] =?UTF-8?q?feat:=20=E2=9C=A8Image=EC=97=90=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - id, url, imageTypeId, ImageClassId를 필드로 추가 --- BE/src/main/java/airbnb/domain/Image.java | 38 +++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/BE/src/main/java/airbnb/domain/Image.java b/BE/src/main/java/airbnb/domain/Image.java index 820e74a57..c78cb389d 100644 --- a/BE/src/main/java/airbnb/domain/Image.java +++ b/BE/src/main/java/airbnb/domain/Image.java @@ -1,4 +1,42 @@ package airbnb.domain; +import org.springframework.data.annotation.Id; +import org.springframework.data.relational.core.mapping.Column; +import org.springframework.data.relational.core.mapping.Embedded; + public class Image { + + @Id + private Long id; + private String url; + + @Column(value = "image_type_id") + private Long imageTypeId; + + @Embedded.Nullable + private ImageClassId imageClassId; + + + public Image(Long id, String url, Long imageTypeId, ImageClassId imageClassId) { + this.id = id; + this.url = url; + this.imageTypeId = imageTypeId; + this.imageClassId = imageClassId; + } + + public Long getId() { + return id; + } + + public String getUrl() { + return url; + } + + public Long getImageTypeId() { + return imageTypeId; + } + + public ImageClassId getImageClassId() { + return imageClassId; + } } From e21fc896fb8d8e4c60a3e175d52ac7cf5168bcde Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 17:29:51 +0900 Subject: [PATCH 032/117] =?UTF-8?q?chore:=20=F0=9F=94=A7Image=EC=97=90=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=88=98=EC=A0=95(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 각 domain에서 Image를 Set으로 관리하기 때문에 ImageClassId 필드 제거 --- BE/src/main/java/airbnb/domain/Image.java | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/BE/src/main/java/airbnb/domain/Image.java b/BE/src/main/java/airbnb/domain/Image.java index c78cb389d..f27ce0c6d 100644 --- a/BE/src/main/java/airbnb/domain/Image.java +++ b/BE/src/main/java/airbnb/domain/Image.java @@ -2,7 +2,6 @@ import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Column; -import org.springframework.data.relational.core.mapping.Embedded; public class Image { @@ -13,15 +12,10 @@ public class Image { @Column(value = "image_type_id") private Long imageTypeId; - @Embedded.Nullable - private ImageClassId imageClassId; - - - public Image(Long id, String url, Long imageTypeId, ImageClassId imageClassId) { + public Image(Long id, String url, Long imageTypeId) { this.id = id; this.url = url; this.imageTypeId = imageTypeId; - this.imageClassId = imageClassId; } public Long getId() { @@ -35,8 +29,4 @@ public String getUrl() { public Long getImageTypeId() { return imageTypeId; } - - public ImageClassId getImageClassId() { - return imageClassId; - } } From 47c44edecc879a08ce04e10f6c276246931f6fe7 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 20 May 2021 17:31:31 +0900 Subject: [PATCH 033/117] =?UTF-8?q?style:=20=F0=9F=8E=A8=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=ED=8F=AC=EB=A7=B7=ED=8C=85=20=EC=88=98=EC=A0=95(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/controller/MainController.java | 2 +- BE/src/main/java/airbnb/dao/CityDao.java | 4 ++-- BE/src/main/java/airbnb/domain/City.java | 1 + BE/src/main/java/airbnb/mapper/CityMapper.java | 5 +++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/BE/src/main/java/airbnb/controller/MainController.java b/BE/src/main/java/airbnb/controller/MainController.java index ea39c2d8b..e5285e4fa 100644 --- a/BE/src/main/java/airbnb/controller/MainController.java +++ b/BE/src/main/java/airbnb/controller/MainController.java @@ -15,7 +15,7 @@ public MainController(CityDao cityDao) { } @GetMapping("/main") - public CitiesWrapper readCities(){ + public CitiesWrapper readCities() { return new CitiesWrapper(cityDao.findAll()); } } diff --git a/BE/src/main/java/airbnb/dao/CityDao.java b/BE/src/main/java/airbnb/dao/CityDao.java index 271bf6394..d50e307db 100644 --- a/BE/src/main/java/airbnb/dao/CityDao.java +++ b/BE/src/main/java/airbnb/dao/CityDao.java @@ -18,8 +18,8 @@ public CityDao(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } - public List findAll(){ + public List findAll() { String sql = "SELECT id, name FROM city"; - return jdbcTemplate.query(sql,cityMapper); + return jdbcTemplate.query(sql, cityMapper); } } diff --git a/BE/src/main/java/airbnb/domain/City.java b/BE/src/main/java/airbnb/domain/City.java index bd24abbc5..9943befd6 100644 --- a/BE/src/main/java/airbnb/domain/City.java +++ b/BE/src/main/java/airbnb/domain/City.java @@ -3,6 +3,7 @@ import org.springframework.data.annotation.Id; public class City { + @Id private Long id; private String name; diff --git a/BE/src/main/java/airbnb/mapper/CityMapper.java b/BE/src/main/java/airbnb/mapper/CityMapper.java index a666a963b..58b694240 100644 --- a/BE/src/main/java/airbnb/mapper/CityMapper.java +++ b/BE/src/main/java/airbnb/mapper/CityMapper.java @@ -8,8 +8,9 @@ public class CityMapper implements RowMapper { + @Override - public City mapRow(ResultSet rs, int rowNum) throws SQLException{ - return new City(rs.getLong("id"),rs.getString("name")); + public City mapRow(ResultSet rs, int rowNum) throws SQLException { + return new City(rs.getLong("id"), rs.getString("name")); } } From 73aa17712057a7875ed48aa17541b3d43894b510 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 10:38:05 +0900 Subject: [PATCH 034/117] =?UTF-8?q?feat:=20=E2=9C=A8CityRequest=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 필드에 id, name, image, distance 존재 - builder 추가 --- BE/src/main/java/airbnb/dto/CityRequest.java | 66 ++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 BE/src/main/java/airbnb/dto/CityRequest.java diff --git a/BE/src/main/java/airbnb/dto/CityRequest.java b/BE/src/main/java/airbnb/dto/CityRequest.java new file mode 100644 index 000000000..22571a1d3 --- /dev/null +++ b/BE/src/main/java/airbnb/dto/CityRequest.java @@ -0,0 +1,66 @@ +package airbnb.dto; + +public class CityRequest { + + private final Long id; + private final String name; + private final String image; + private final int distance; + + public CityRequest(Builder builder) { + this.id = builder.id; + this.name = builder.name; + this.image = builder.image; + this.distance = builder.distance; + } + + public static class Builder { + + private final Long id; + + private String name; + private String image; + private int distance; + + public Builder(Long id) { + this.id = id; + } + + public Builder name(String name) { + this.name = name; + return this; + } + + public Builder image(String image) { + this.image = image; + return this; + } + + public Builder distance(int distance) { + this.distance = distance; + return this; + } + + public CityRequest build() { + return new CityRequest(this); + } + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getImage() { + return image; + } + + public int getDistance() { + return distance; + } + + +} From 52becffce695d328f4430175354f56230ee7e507 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 10:43:00 +0900 Subject: [PATCH 035/117] =?UTF-8?q?feat:=20=E2=9C=A8Image=EC=99=80=201:N?= =?UTF-8?q?=EA=B4=80=EA=B3=84=20=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Set으로 관계를 맺음 - addImage 메소드 추가 --- BE/src/main/java/airbnb/domain/City.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/BE/src/main/java/airbnb/domain/City.java b/BE/src/main/java/airbnb/domain/City.java index 9943befd6..0cd0ecdca 100644 --- a/BE/src/main/java/airbnb/domain/City.java +++ b/BE/src/main/java/airbnb/domain/City.java @@ -2,11 +2,14 @@ import org.springframework.data.annotation.Id; +import java.util.Set; + public class City { @Id private Long id; private String name; + private Set images; public City(Long id, String name) { this.id = id; @@ -20,4 +23,12 @@ public Long getId() { public String getName() { return name; } + + public Set getImages() { + return images; + } + + public void addImage(Image image){ + images.add(image); + } } From 545219a450522a0e4b98a230acbd7c08d1f2b347 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 11:22:59 +0900 Subject: [PATCH 036/117] =?UTF-8?q?feat:=20=E2=9C=A8ImageType=20Enum=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 이미지의 Type을 효과적으로 관리하기 위해 Enum으로 생성 --- BE/src/main/java/airbnb/domain/ImageType.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 BE/src/main/java/airbnb/domain/ImageType.java diff --git a/BE/src/main/java/airbnb/domain/ImageType.java b/BE/src/main/java/airbnb/domain/ImageType.java new file mode 100644 index 000000000..77f6735d1 --- /dev/null +++ b/BE/src/main/java/airbnb/domain/ImageType.java @@ -0,0 +1,7 @@ +package airbnb.domain; + +public enum ImageType { + HIRO, + MAIN, + DETAIL +} From 188301f0ec5b410a6de10cb978bdba5957e6552e Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 11:24:21 +0900 Subject: [PATCH 037/117] =?UTF-8?q?chore:=20=F0=9F=94=A7=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=20=EC=8A=A4=ED=82=A4=EB=A7=88=20=EC=88=98=EC=A0=95(#5?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Image_Type의 기본키를 type컬럼으로 변경 - Image 테이블의 외래키 수정 --- BE/src/main/resources/shcema.sql | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/BE/src/main/resources/shcema.sql b/BE/src/main/resources/shcema.sql index a048e5bba..0ecf12baf 100644 --- a/BE/src/main/resources/shcema.sql +++ b/BE/src/main/resources/shcema.sql @@ -48,19 +48,18 @@ create table image( room_id int, category_id int, city_id int, - image_type_id int not null, + image_type varchar(10) not null, primary key (id), foreign key (room_id) references room(id), foreign key (category_id) references category(id), foreign key (city_id) references city(id), - foreign key (image_type_id) references image_type(id) + foreign key (image_type) references image_type(type) ); drop table image_type; create table image_type( - id int not null auto_increment, - type varchar(45) not null, - primary key (id) + type varchar(10) not null, + primary key (type) ); drop table 'user'; From 89687db91bf21355601364060a9051e0de56766d Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 11:26:19 +0900 Subject: [PATCH 038/117] =?UTF-8?q?chore:=20=F0=9F=94=A7final=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 좀 더 확실한 접근제어자를 위해 final 추가 --- BE/src/main/java/airbnb/dao/CityDao.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BE/src/main/java/airbnb/dao/CityDao.java b/BE/src/main/java/airbnb/dao/CityDao.java index d50e307db..2a8e8c0c0 100644 --- a/BE/src/main/java/airbnb/dao/CityDao.java +++ b/BE/src/main/java/airbnb/dao/CityDao.java @@ -11,15 +11,15 @@ @Repository public class CityDao { - private JdbcTemplate jdbcTemplate; - private CityMapper cityMapper = new CityMapper(); + private final JdbcTemplate jdbcTemplate; + private final CityMapper cityMapper = new CityMapper(); public CityDao(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } public List findAll() { - String sql = "SELECT id, name FROM city"; + String sql = "SELECT id, 'name' FROM city"; return jdbcTemplate.query(sql, cityMapper); } } From a60478b01fafeb7df5af184461caa2fb6de82dd1 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 11:36:02 +0900 Subject: [PATCH 039/117] =?UTF-8?q?feat:=20=E2=9C=A8ImagType=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Enum으로 선언한 ImageType을 사용하기 위해 필드에 추가 --- BE/src/main/java/airbnb/domain/Image.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/BE/src/main/java/airbnb/domain/Image.java b/BE/src/main/java/airbnb/domain/Image.java index f27ce0c6d..a3670ca24 100644 --- a/BE/src/main/java/airbnb/domain/Image.java +++ b/BE/src/main/java/airbnb/domain/Image.java @@ -9,13 +9,13 @@ public class Image { private Long id; private String url; - @Column(value = "image_type_id") - private Long imageTypeId; + @Column(value = "image_type") + private ImageType imageType; - public Image(Long id, String url, Long imageTypeId) { + public Image(Long id, String url, ImageType imageType) { this.id = id; this.url = url; - this.imageTypeId = imageTypeId; + this.imageType = imageType; } public Long getId() { @@ -26,7 +26,7 @@ public String getUrl() { return url; } - public Long getImageTypeId() { - return imageTypeId; + public ImageType getImageType() { + return imageType; } } From 237ac055adad184a88edbe03f3e16393fa5da746 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 11:36:39 +0900 Subject: [PATCH 040/117] =?UTF-8?q?feat:=20=E2=9C=A8ImageDao=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dao/ImageDao.java | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 BE/src/main/java/airbnb/dao/ImageDao.java diff --git a/BE/src/main/java/airbnb/dao/ImageDao.java b/BE/src/main/java/airbnb/dao/ImageDao.java deleted file mode 100644 index a3647d8e5..000000000 --- a/BE/src/main/java/airbnb/dao/ImageDao.java +++ /dev/null @@ -1,4 +0,0 @@ -package airbnb.dao; - -public class ImageDao { -} From 727e4349a4fa646210128a58e1965d5908018ea5 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 11:37:19 +0900 Subject: [PATCH 041/117] =?UTF-8?q?feat:=20=E2=9C=A8findMainImageUrl=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 도시의 메인 이미지를 가져오기 위해 메소드 생성 --- BE/src/main/java/airbnb/domain/City.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/BE/src/main/java/airbnb/domain/City.java b/BE/src/main/java/airbnb/domain/City.java index 0cd0ecdca..1f47c61ae 100644 --- a/BE/src/main/java/airbnb/domain/City.java +++ b/BE/src/main/java/airbnb/domain/City.java @@ -31,4 +31,10 @@ public Set getImages() { public void addImage(Image image){ images.add(image); } + + public String findMainImageUrl(){ + Image mainImage = images.stream().filter(image ->ImageType.MAIN.equals(image.getImageType())) + .findFirst().orElseThrow(NullPointerException::new); + return mainImage.getUrl(); + } } From a5bfe667647d1a1db5fffe1bd8ef226a2579966d Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 11:40:31 +0900 Subject: [PATCH 042/117] =?UTF-8?q?feat:=20=E2=9C=A8CityService=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CityDao를 사용한 비즈니스 로직을 담기 위해 CityService 생성 --- BE/src/main/java/airbnb/Service/CityService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 BE/src/main/java/airbnb/Service/CityService.java diff --git a/BE/src/main/java/airbnb/Service/CityService.java b/BE/src/main/java/airbnb/Service/CityService.java new file mode 100644 index 000000000..6a3d32212 --- /dev/null +++ b/BE/src/main/java/airbnb/Service/CityService.java @@ -0,0 +1,14 @@ +package airbnb.Service; + +import airbnb.dao.CityDao; +import org.springframework.stereotype.Service; + +@Service +public class CityService { + + private final CityDao cityDao; + + public CityService(CityDao cityDao) { + this.cityDao = cityDao; + } +} From 51ccaee7cdd07f076471cf20233add850bda2903 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 11:41:12 +0900 Subject: [PATCH 043/117] =?UTF-8?q?feat:=20=E2=9C=A8=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EB=AA=85=20=EB=B3=80=EA=B2=BD(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MainController -> HomeController --- .../controller/{MainController.java => HomeController.java} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename BE/src/main/java/airbnb/controller/{MainController.java => HomeController.java} (80%) diff --git a/BE/src/main/java/airbnb/controller/MainController.java b/BE/src/main/java/airbnb/controller/HomeController.java similarity index 80% rename from BE/src/main/java/airbnb/controller/MainController.java rename to BE/src/main/java/airbnb/controller/HomeController.java index e5285e4fa..062d526bf 100644 --- a/BE/src/main/java/airbnb/controller/MainController.java +++ b/BE/src/main/java/airbnb/controller/HomeController.java @@ -6,15 +6,15 @@ import org.springframework.web.bind.annotation.RestController; @RestController -public class MainController { +public class HomeController { private CityDao cityDao; - public MainController(CityDao cityDao) { + public HomeController(CityDao cityDao) { this.cityDao = cityDao; } - @GetMapping("/main") + @GetMapping public CitiesWrapper readCities() { return new CitiesWrapper(cityDao.findAll()); } From df7410105677954b603a57555747f141e394409f Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 12:09:15 +0900 Subject: [PATCH 044/117] =?UTF-8?q?feat:=20=E2=9C=A8createAllToRequestList?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 모든 도시를 List로 만들어 주기 위해 메소드 생성 --- .../main/java/airbnb/Service/CityService.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/BE/src/main/java/airbnb/Service/CityService.java b/BE/src/main/java/airbnb/Service/CityService.java index 6a3d32212..ab2631b28 100644 --- a/BE/src/main/java/airbnb/Service/CityService.java +++ b/BE/src/main/java/airbnb/Service/CityService.java @@ -1,8 +1,13 @@ package airbnb.Service; import airbnb.dao.CityDao; +import airbnb.domain.City; +import airbnb.dto.CityRequest; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + @Service public class CityService { @@ -11,4 +16,21 @@ public class CityService { public CityService(CityDao cityDao) { this.cityDao = cityDao; } + + public List findAll() { + return cityDao.findAll(); + } + + public List createAllToRequestList() { + + List requestList = new ArrayList<>(); + List cities = findAll(); + + for (City city : cities) { + CityRequest cityRequest = CityRequest.of(city, city.findMainImageUrl()); + requestList.add(cityRequest); + } + + return requestList; + } } From 504f39bf12e33ea163d70916238790a323e0103f Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 12:13:26 +0900 Subject: [PATCH 045/117] =?UTF-8?q?chore:=20=E2=9C=A8CityRequest->CityResp?= =?UTF-8?q?onse=EB=A1=9C=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 요청이 아닌 응답 Dto이므로 메소드 명을 올바르게 정정 --- BE/src/main/java/airbnb/CityResponse.java | 33 ------------------- .../main/java/airbnb/Service/CityService.java | 10 +++--- .../airbnb/controller/HomeController.java | 10 +++--- .../{CityRequest.java => CityResponse.java} | 18 ++++++---- .../java/airbnb/wrapper/CitiesWrapper.java | 8 ++--- 5 files changed, 26 insertions(+), 53 deletions(-) delete mode 100644 BE/src/main/java/airbnb/CityResponse.java rename BE/src/main/java/airbnb/dto/{CityRequest.java => CityResponse.java} (72%) diff --git a/BE/src/main/java/airbnb/CityResponse.java b/BE/src/main/java/airbnb/CityResponse.java deleted file mode 100644 index bc3a425ac..000000000 --- a/BE/src/main/java/airbnb/CityResponse.java +++ /dev/null @@ -1,33 +0,0 @@ -package airbnb; - -public class CityResponse { - private Long id; - private String name; - private String image; - private int distance; - - public CityResponse(Long id, String name, String image, int distance) { - this.id = id; - this.name = name; - this.image = image; - this.distance = distance; - } - - public Long getId() { - return id; - } - - public String getName() { - return name; - } - - public String getImage() { - return image; - } - - public int getDistance() { - return distance; - } -} - - diff --git a/BE/src/main/java/airbnb/Service/CityService.java b/BE/src/main/java/airbnb/Service/CityService.java index ab2631b28..073f1c716 100644 --- a/BE/src/main/java/airbnb/Service/CityService.java +++ b/BE/src/main/java/airbnb/Service/CityService.java @@ -2,7 +2,7 @@ import airbnb.dao.CityDao; import airbnb.domain.City; -import airbnb.dto.CityRequest; +import airbnb.dto.CityResponse; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -21,14 +21,14 @@ public List findAll() { return cityDao.findAll(); } - public List createAllToRequestList() { + public List createAllToRequestList() { - List requestList = new ArrayList<>(); + List requestList = new ArrayList<>(); List cities = findAll(); for (City city : cities) { - CityRequest cityRequest = CityRequest.of(city, city.findMainImageUrl()); - requestList.add(cityRequest); + CityResponse cityResponse = CityResponse.of(city, city.findMainImageUrl()); + requestList.add(cityResponse); } return requestList; diff --git a/BE/src/main/java/airbnb/controller/HomeController.java b/BE/src/main/java/airbnb/controller/HomeController.java index 062d526bf..52c59a903 100644 --- a/BE/src/main/java/airbnb/controller/HomeController.java +++ b/BE/src/main/java/airbnb/controller/HomeController.java @@ -1,6 +1,6 @@ package airbnb.controller; -import airbnb.dao.CityDao; +import airbnb.Service.CityService; import airbnb.wrapper.CitiesWrapper; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -8,14 +8,14 @@ @RestController public class HomeController { - private CityDao cityDao; + private final CityService cityService; - public HomeController(CityDao cityDao) { - this.cityDao = cityDao; + public HomeController(CityService cityService) { + this.cityService = cityService; } @GetMapping public CitiesWrapper readCities() { - return new CitiesWrapper(cityDao.findAll()); + return new CitiesWrapper(cityService.createAllToRequestList()); } } diff --git a/BE/src/main/java/airbnb/dto/CityRequest.java b/BE/src/main/java/airbnb/dto/CityResponse.java similarity index 72% rename from BE/src/main/java/airbnb/dto/CityRequest.java rename to BE/src/main/java/airbnb/dto/CityResponse.java index 22571a1d3..58d6d6d27 100644 --- a/BE/src/main/java/airbnb/dto/CityRequest.java +++ b/BE/src/main/java/airbnb/dto/CityResponse.java @@ -1,13 +1,15 @@ package airbnb.dto; -public class CityRequest { +import airbnb.domain.City; + +public class CityResponse { private final Long id; private final String name; private final String image; private final int distance; - public CityRequest(Builder builder) { + public CityResponse(Builder builder) { this.id = builder.id; this.name = builder.name; this.image = builder.image; @@ -20,7 +22,7 @@ public static class Builder { private String name; private String image; - private int distance; + private int distance = 10; public Builder(Long id) { this.id = id; @@ -41,8 +43,8 @@ public Builder distance(int distance) { return this; } - public CityRequest build() { - return new CityRequest(this); + public CityResponse build() { + return new CityResponse(this); } } @@ -62,5 +64,9 @@ public int getDistance() { return distance; } - + public static CityResponse of(City city, String imageUrl) { + return new CityResponse.Builder(city.getId()) + .name(city.getName()) + .image(imageUrl).build(); + } } diff --git a/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java b/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java index d0a9373dd..fc999acf5 100644 --- a/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java +++ b/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java @@ -1,18 +1,18 @@ package airbnb.wrapper; -import airbnb.domain.City; +import airbnb.dto.CityResponse; import java.util.List; public class CitiesWrapper { - private List cities; + private List cities; - public CitiesWrapper(List cities) { + public CitiesWrapper(List cities) { this.cities = cities; } - public List getCities() { + public List getCities() { return cities; } } From 1a05ed142d023084695e4994eec10b88c8c92c13 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 14:22:58 +0900 Subject: [PATCH 046/117] =?UTF-8?q?feat:=20=E2=9C=A8image,=20image=5Ftype?= =?UTF-8?q?=20INSERT=20=EB=AC=B8=20=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/data.sql | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/BE/src/main/resources/data.sql b/BE/src/main/resources/data.sql index b3db697f8..168f5cc7e 100644 --- a/BE/src/main/resources/data.sql +++ b/BE/src/main/resources/data.sql @@ -1,3 +1,18 @@ INSERT INTO city(name) values ('서울'),('경기도'),('강원도'),('충청도'),('경상남도'),('경상북도'),('전라남도'),('전라북도'); +INSERT INTO image_type(type) +values ('HIRO'),('MAIN'),('DETAIL'); + +INSERT INTO image(url,image_type) +values ('https://a0.muscache.com/im/pictures/ddc7f01f-3fb3-483c-87e6-701dad52c930.jpg?im_w=1920', 'HIRO'); + +INSERT INTO image(url,image_type,city_id) +values ('https://a0.muscache.com/im/pictures/71e23854-a3c7-491c-b715-6e86233a293f.jpg?im_q=medq&im_w=240','MAIN',1), + ('https://a0.muscache.com/im/pictures/a0eb36e7-b468-4c5e-93b2-819e793563b2.jpg?im_q=medq&im_w=240','MAIN',2), + ('https://a0.muscache.com/im/pictures/926d56aa-8b36-4138-8eae-ad991868b858.jpg?im_q=medq&im_w=240','MAIN',3), + ('https://a0.muscache.com/im/pictures/f7736f4a-f8b9-4527-b46c-d0d8df856984.jpg?im_q=medq&im_w=240','MAIN',4), + ('https://a0.muscache.com/im/pictures/31e445ed-8b69-477b-aefd-d04dae6d0bb1.jpg?im_q=medq&im_w=240','MAIN',5), + ('https://a0.muscache.com/im/pictures/087a8dff-a609-4084-86db-f45051c6f23a.jpg?im_q=medq&im_w=240','MAIN',6), + ('https://a0.muscache.com/im/pictures/558a403a-aeed-4829-83a6-c9b0ccf21866.jpg?im_q=medq&im_w=240','MAIN',7), + ('https://a0.muscache.com/im/pictures/a161fb95-6875-4aaa-aecd-3a46dead3220.jpg?im_q=medq&im_w=240','MAIN',8); From a6d9edea2f2199984b8f1e6f768545c9455a57ca Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 14:36:37 +0900 Subject: [PATCH 047/117] =?UTF-8?q?feat:=20=E2=9C=A8Image=20=EB=B9=8C?= =?UTF-8?q?=EB=93=9C=20=ED=8C=A8=ED=84=B4=20=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/domain/Image.java | 56 +++++++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/BE/src/main/java/airbnb/domain/Image.java b/BE/src/main/java/airbnb/domain/Image.java index a3670ca24..b3c3d1841 100644 --- a/BE/src/main/java/airbnb/domain/Image.java +++ b/BE/src/main/java/airbnb/domain/Image.java @@ -11,11 +11,59 @@ public class Image { @Column(value = "image_type") private ImageType imageType; + @Column(value = "city_id") + private Long cityId; + @Column(value = "room_id") + private Long roomId; + @Column(value = "category_id") + private Long categoryId; - public Image(Long id, String url, ImageType imageType) { - this.id = id; - this.url = url; - this.imageType = imageType; + private Image(Builder builder) { + this.id = builder.id; + this.url = builder.url; + this.imageType = builder.imageType; + this.cityId = builder.cityId; + this.roomId = builder.roomId; + this.categoryId = builder.categoryId; + } + + public static class Builder{ + private final Long id; + private final String url; + + private ImageType imageType; + private Long cityId; + private Long roomId; + private Long categoryId; + + public Builder(Long id, String url) { + this.id = id; + this.url = url; + } + + public Builder imageType(ImageType imageType){ + this.imageType = imageType; + return this; + } + + public Builder cityId(Long cityId){ + this.cityId = cityId; + return this; + } + + public Builder roomId(Long roomId){ + this.roomId = roomId; + return this; + } + + public Builder categoryId(Long categoryId){ + this.categoryId = categoryId; + return this; + } + + public Builder build(){ + return new Image(this); + } } public Long getId() { From f804c576baad27afac4a7b8be0429ee29c57e211 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 14:36:55 +0900 Subject: [PATCH 048/117] =?UTF-8?q?feat:=20=E2=9C=A8private=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=EB=A1=9C=20=EB=B3=80=EA=B2=BD(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dto/CityResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BE/src/main/java/airbnb/dto/CityResponse.java b/BE/src/main/java/airbnb/dto/CityResponse.java index 58d6d6d27..778d97b05 100644 --- a/BE/src/main/java/airbnb/dto/CityResponse.java +++ b/BE/src/main/java/airbnb/dto/CityResponse.java @@ -9,7 +9,7 @@ public class CityResponse { private final String image; private final int distance; - public CityResponse(Builder builder) { + private CityResponse(Builder builder) { this.id = builder.id; this.name = builder.name; this.image = builder.image; From c58f07cbea58be97452b250285e7bab50b0556e7 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 14:43:07 +0900 Subject: [PATCH 049/117] =?UTF-8?q?feat:=20=E2=9C=A8ImageMapper=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/domain/Image.java | 8 +------- .../main/java/airbnb/mapper/ImageMapper.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 BE/src/main/java/airbnb/mapper/ImageMapper.java diff --git a/BE/src/main/java/airbnb/domain/Image.java b/BE/src/main/java/airbnb/domain/Image.java index b3c3d1841..3696730e0 100644 --- a/BE/src/main/java/airbnb/domain/Image.java +++ b/BE/src/main/java/airbnb/domain/Image.java @@ -1,21 +1,15 @@ package airbnb.domain; import org.springframework.data.annotation.Id; -import org.springframework.data.relational.core.mapping.Column; public class Image { @Id private Long id; private String url; - - @Column(value = "image_type") private ImageType imageType; - @Column(value = "city_id") private Long cityId; - @Column(value = "room_id") private Long roomId; - @Column(value = "category_id") private Long categoryId; private Image(Builder builder) { @@ -61,7 +55,7 @@ public Builder categoryId(Long categoryId){ return this; } - public Builder build(){ + public Image build(){ return new Image(this); } } diff --git a/BE/src/main/java/airbnb/mapper/ImageMapper.java b/BE/src/main/java/airbnb/mapper/ImageMapper.java new file mode 100644 index 000000000..b151072c0 --- /dev/null +++ b/BE/src/main/java/airbnb/mapper/ImageMapper.java @@ -0,0 +1,19 @@ +package airbnb.mapper; + +import airbnb.domain.Image; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ImageMapper implements RowMapper { + + @Override + public Image mapRow(ResultSet rs, int rowNum) throws SQLException { + return new Image.Builder(rs.getLong("id"),rs.getString("image_type")) + .cityId(rs.getLong("city_id")) + .roomId(rs.getLong("room_id")) + .categoryId(rs.getLong("category_id")) + .build(); + } +} From f668ff5979e3ec499d280547779f1742291481f6 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 14:56:25 +0900 Subject: [PATCH 050/117] =?UTF-8?q?feat:=20=E2=9C=A8ImageDao=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dao/ImageDao.java | 28 +++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 BE/src/main/java/airbnb/dao/ImageDao.java diff --git a/BE/src/main/java/airbnb/dao/ImageDao.java b/BE/src/main/java/airbnb/dao/ImageDao.java new file mode 100644 index 000000000..668be94b1 --- /dev/null +++ b/BE/src/main/java/airbnb/dao/ImageDao.java @@ -0,0 +1,28 @@ +package airbnb.dao; + +import airbnb.domain.Image; +import airbnb.mapper.ImageMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public class ImageDao { + + private NamedParameterJdbcTemplate jdbcTemplate; + private final ImageMapper imageMapper = new ImageMapper(); + + public ImageDao(NamedParameterJdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + public List findByCityId(Long cityId){ + String sql = "SELECT id, url, room_id, city_id, category_id, image_type FROM image " + + "WHERE city_id = :cityId"; + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("cityId",cityId); + return jdbcTemplate.query(sql,parameter,imageMapper); + } +} From 879c03da145b681257a11d0fd01a0049124e4a1f Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 14:57:42 +0900 Subject: [PATCH 051/117] =?UTF-8?q?chore:=20=F0=9F=94=A7Set?= =?UTF-8?q?=EB=A5=BC=20List=EB=A1=9C=20=EB=B3=80=EA=B2=BD(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/domain/City.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BE/src/main/java/airbnb/domain/City.java b/BE/src/main/java/airbnb/domain/City.java index 1f47c61ae..e41e8bcf8 100644 --- a/BE/src/main/java/airbnb/domain/City.java +++ b/BE/src/main/java/airbnb/domain/City.java @@ -2,14 +2,14 @@ import org.springframework.data.annotation.Id; -import java.util.Set; +import java.util.List; public class City { @Id private Long id; private String name; - private Set images; + private List images; public City(Long id, String name) { this.id = id; @@ -24,7 +24,7 @@ public String getName() { return name; } - public Set getImages() { + public List getImages() { return images; } From afac7376afe6044e28eb4dc4d4c2891b896d0f73 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 14:58:06 +0900 Subject: [PATCH 052/117] =?UTF-8?q?chore:=20=F0=9F=94=A7DataSource=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85=20=EC=A0=9C=EA=B1=B0(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dao/CityDao.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/BE/src/main/java/airbnb/dao/CityDao.java b/BE/src/main/java/airbnb/dao/CityDao.java index 2a8e8c0c0..cc060d36b 100644 --- a/BE/src/main/java/airbnb/dao/CityDao.java +++ b/BE/src/main/java/airbnb/dao/CityDao.java @@ -5,7 +5,6 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; -import javax.sql.DataSource; import java.util.List; @Repository @@ -14,12 +13,12 @@ public class CityDao { private final JdbcTemplate jdbcTemplate; private final CityMapper cityMapper = new CityMapper(); - public CityDao(DataSource dataSource) { - this.jdbcTemplate = new JdbcTemplate(dataSource); + public CityDao(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; } public List findAll() { - String sql = "SELECT id, 'name' FROM city"; + String sql = "SELECT id, name FROM city"; return jdbcTemplate.query(sql, cityMapper); } } From d156f16b64a99213dcb2ac6b6953b774ac0e83f7 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 15:43:53 +0900 Subject: [PATCH 053/117] =?UTF-8?q?feat:=20=E2=9C=A8SetImages=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/domain/City.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/BE/src/main/java/airbnb/domain/City.java b/BE/src/main/java/airbnb/domain/City.java index e41e8bcf8..40421a6e1 100644 --- a/BE/src/main/java/airbnb/domain/City.java +++ b/BE/src/main/java/airbnb/domain/City.java @@ -32,6 +32,10 @@ public void addImage(Image image){ images.add(image); } + public void setImages(List images) { + this.images = images; + } + public String findMainImageUrl(){ Image mainImage = images.stream().filter(image ->ImageType.MAIN.equals(image.getImageType())) .findFirst().orElseThrow(NullPointerException::new); From 4ef35ea964c30b17c00e24a5a41ee16cea924730 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 15:44:29 +0900 Subject: [PATCH 054/117] =?UTF-8?q?feat:=20=E2=9C=A8ImageMapper=EC=97=90?= =?UTF-8?q?=20Enum=ED=95=84=EB=93=9C=20=EB=B3=80=EA=B2=BD=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/mapper/ImageMapper.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/BE/src/main/java/airbnb/mapper/ImageMapper.java b/BE/src/main/java/airbnb/mapper/ImageMapper.java index b151072c0..ff1e0515c 100644 --- a/BE/src/main/java/airbnb/mapper/ImageMapper.java +++ b/BE/src/main/java/airbnb/mapper/ImageMapper.java @@ -1,6 +1,7 @@ package airbnb.mapper; import airbnb.domain.Image; +import airbnb.domain.ImageType; import org.springframework.jdbc.core.RowMapper; import java.sql.ResultSet; @@ -10,7 +11,8 @@ public class ImageMapper implements RowMapper { @Override public Image mapRow(ResultSet rs, int rowNum) throws SQLException { - return new Image.Builder(rs.getLong("id"),rs.getString("image_type")) + return new Image.Builder(rs.getLong("id"),rs.getString("url")) + .imageType(ImageType.valueOf(rs.getString("image_type"))) .cityId(rs.getLong("city_id")) .roomId(rs.getLong("room_id")) .categoryId(rs.getLong("category_id")) From f7fd3272c948bdb5821c7090113a4bc7d05bccf9 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 15:45:37 +0900 Subject: [PATCH 055/117] =?UTF-8?q?feat:=20=E2=9C=A8ImageDao=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - City를 가져올때 image까지 관계 설정 된 City를 불러오기 위해 필드에 ImageDao 추가 --- BE/src/main/java/airbnb/dao/CityDao.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/BE/src/main/java/airbnb/dao/CityDao.java b/BE/src/main/java/airbnb/dao/CityDao.java index cc060d36b..437b6c8b0 100644 --- a/BE/src/main/java/airbnb/dao/CityDao.java +++ b/BE/src/main/java/airbnb/dao/CityDao.java @@ -11,14 +11,19 @@ public class CityDao { private final JdbcTemplate jdbcTemplate; + private final ImageDao imageDao; private final CityMapper cityMapper = new CityMapper(); - public CityDao(JdbcTemplate jdbcTemplate) { + + public CityDao(JdbcTemplate jdbcTemplate, ImageDao imageDao) { this.jdbcTemplate = jdbcTemplate; + this.imageDao = imageDao; } public List findAll() { String sql = "SELECT id, name FROM city"; - return jdbcTemplate.query(sql, cityMapper); + List cities = jdbcTemplate.query(sql, cityMapper); + cities.forEach(city -> city.setImages(imageDao.findByCityId(city.getId()))); + return cities; } } From ccb8cca58e544ff0916b4cf5fc374dfe8a316932 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 15:48:29 +0900 Subject: [PATCH 056/117] =?UTF-8?q?feat:=20=E2=9C=A8Category=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/domain/Category.java | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 BE/src/main/java/airbnb/domain/Category.java diff --git a/BE/src/main/java/airbnb/domain/Category.java b/BE/src/main/java/airbnb/domain/Category.java new file mode 100644 index 000000000..29a57219f --- /dev/null +++ b/BE/src/main/java/airbnb/domain/Category.java @@ -0,0 +1,40 @@ +package airbnb.domain; + +import org.springframework.data.annotation.Id; + +import java.util.List; + +public class Category { + + @Id + private Long id; + private String name; + private List images; + + public Category(Long id, String name) { + this.id = id; + this.name = name; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public List getImages() { + return images; + } + + public void setImages(List images) { + this.images = images; + } + + public String findMainImageUrl(){ + Image mainImage = images.stream().filter(image ->ImageType.MAIN.equals(image.getImageType())) + .findFirst().orElseThrow(NullPointerException::new); + return mainImage.getUrl(); + } +} From 0bcb94eccdba24d154c5446735c8df376d5ffe4b Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:04:13 +0900 Subject: [PATCH 057/117] =?UTF-8?q?feat:=20=E2=9C=A8CategoryDao=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dao/CategoryDao.java | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/BE/src/main/java/airbnb/dao/CategoryDao.java b/BE/src/main/java/airbnb/dao/CategoryDao.java index 2a8d1bd15..30b67d3bd 100644 --- a/BE/src/main/java/airbnb/dao/CategoryDao.java +++ b/BE/src/main/java/airbnb/dao/CategoryDao.java @@ -1,4 +1,30 @@ package airbnb.dao; +import airbnb.domain.Category; +import airbnb.domain.City; +import airbnb.mapper.CityMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository public class CategoryDao { + + private final JdbcTemplate jdbcTemplate; + private final ImageDao imageDao; + private final CategoryMapper categoryMapper = new CityMapper(); + + + public CategoryDao(JdbcTemplate jdbcTemplate, ImageDao imageDao) { + this.jdbcTemplate = jdbcTemplate; + this.imageDao = imageDao; + } + + public List findAll() { + String sql = "SELECT id, name FROM category"; + List categories = jdbcTemplate.query(sql, categoryMapper); + categories.forEach(category -> category.setImages(imageDao.findByCategoryId(category.getId()))); + return categories; + } } From 0c31f60630f1fcd86d4c7108ec729ed944eb636c Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:04:25 +0900 Subject: [PATCH 058/117] =?UTF-8?q?feat:=20=E2=9C=A8CategoryResponse=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/airbnb/dto/CategoryResponse.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 BE/src/main/java/airbnb/dto/CategoryResponse.java diff --git a/BE/src/main/java/airbnb/dto/CategoryResponse.java b/BE/src/main/java/airbnb/dto/CategoryResponse.java new file mode 100644 index 000000000..7729c6e4c --- /dev/null +++ b/BE/src/main/java/airbnb/dto/CategoryResponse.java @@ -0,0 +1,58 @@ +package airbnb.dto; + +import airbnb.domain.Category; + +public class CategoryResponse { + + private final Long id; + private final String name; + private final String image; + + private CategoryResponse(Builder builder) { + this.id = builder.id; + this.name = builder.name; + this.image = builder.image; + } + + public static class Builder { + + private final Long id; + private final String name; + + private String image; + + public Builder(Long id, String name) { + this.id = id; + this.name = name; + } + + + public Builder image(String image) { + this.image = image; + return this; + } + + + public CategoryResponse build() { + return new CategoryResponse(this); + } + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getImage() { + return image; + } + + public static CategoryResponse of(Category category, String imageUrl) { + return new CategoryResponse.Builder(category.getId(), category.getName()) + .image(imageUrl).build(); + } + +} From aefd982525dad4e9f9e3c48b1c1654ea19dfae5e Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:04:42 +0900 Subject: [PATCH 059/117] =?UTF-8?q?feat:=20=E2=9C=A8CategoryService=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/airbnb/Service/CategoryService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 BE/src/main/java/airbnb/Service/CategoryService.java diff --git a/BE/src/main/java/airbnb/Service/CategoryService.java b/BE/src/main/java/airbnb/Service/CategoryService.java new file mode 100644 index 000000000..6c5f34c5d --- /dev/null +++ b/BE/src/main/java/airbnb/Service/CategoryService.java @@ -0,0 +1,14 @@ +package airbnb.Service; + +import airbnb.dao.CategoryDao; +import org.springframework.stereotype.Service; + +@Service +public class CategoryService { + + private final CategoryDao categoryDao; + + public CategoryService(CategoryDao categoryDao) { + this.categoryDao = categoryDao; + } +} From 4abc47f57c2cda01a6896b1e7ede53a9c54c0e12 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:05:25 +0900 Subject: [PATCH 060/117] =?UTF-8?q?feat:=20=E2=9C=A8CityResponse=20?= =?UTF-8?q?=EB=B9=8C=EB=8D=94=20=EC=88=98=EC=A0=95(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -name을 필수매개변수로 변경 --- BE/src/main/java/airbnb/dto/CityResponse.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/BE/src/main/java/airbnb/dto/CityResponse.java b/BE/src/main/java/airbnb/dto/CityResponse.java index 778d97b05..f0b78018e 100644 --- a/BE/src/main/java/airbnb/dto/CityResponse.java +++ b/BE/src/main/java/airbnb/dto/CityResponse.java @@ -19,18 +19,14 @@ private CityResponse(Builder builder) { public static class Builder { private final Long id; + private final String name; - private String name; private String image; private int distance = 10; - public Builder(Long id) { + public Builder(Long id, String name) { this.id = id; - } - - public Builder name(String name) { this.name = name; - return this; } public Builder image(String image) { @@ -65,8 +61,7 @@ public int getDistance() { } public static CityResponse of(City city, String imageUrl) { - return new CityResponse.Builder(city.getId()) - .name(city.getName()) + return new CityResponse.Builder(city.getId(), city.getName()) .image(imageUrl).build(); } } From fa4d7fc8b06512171420165c8a76fdfa9f4bf198 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:09:16 +0900 Subject: [PATCH 061/117] =?UTF-8?q?feat:=20=E2=9C=A8CategoryMapper=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dao/CategoryDao.java | 5 ++--- .../main/java/airbnb/mapper/CategoryMapper.java | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 BE/src/main/java/airbnb/mapper/CategoryMapper.java diff --git a/BE/src/main/java/airbnb/dao/CategoryDao.java b/BE/src/main/java/airbnb/dao/CategoryDao.java index 30b67d3bd..c58bff0a3 100644 --- a/BE/src/main/java/airbnb/dao/CategoryDao.java +++ b/BE/src/main/java/airbnb/dao/CategoryDao.java @@ -1,8 +1,7 @@ package airbnb.dao; import airbnb.domain.Category; -import airbnb.domain.City; -import airbnb.mapper.CityMapper; +import airbnb.mapper.CategoryMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @@ -13,7 +12,7 @@ public class CategoryDao { private final JdbcTemplate jdbcTemplate; private final ImageDao imageDao; - private final CategoryMapper categoryMapper = new CityMapper(); + private final CategoryMapper categoryMapper = new CategoryMapper(); public CategoryDao(JdbcTemplate jdbcTemplate, ImageDao imageDao) { diff --git a/BE/src/main/java/airbnb/mapper/CategoryMapper.java b/BE/src/main/java/airbnb/mapper/CategoryMapper.java new file mode 100644 index 000000000..587843d26 --- /dev/null +++ b/BE/src/main/java/airbnb/mapper/CategoryMapper.java @@ -0,0 +1,15 @@ +package airbnb.mapper; + +import airbnb.domain.Category; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class CategoryMapper implements RowMapper { + + @Override + public Category mapRow(ResultSet rs, int rowNum) throws SQLException { + return new Category(rs.getLong("id"), rs.getString("name")); + } +} From 41fca98c4225628aef9d7d4413fe83e22f517c61 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:09:59 +0900 Subject: [PATCH 062/117] =?UTF-8?q?feat:=20=E2=9C=A8findByCategoryId=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 카테고리의 List를 가져오기 위해 메소드 생성 --- BE/src/main/java/airbnb/dao/ImageDao.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/BE/src/main/java/airbnb/dao/ImageDao.java b/BE/src/main/java/airbnb/dao/ImageDao.java index 668be94b1..357928995 100644 --- a/BE/src/main/java/airbnb/dao/ImageDao.java +++ b/BE/src/main/java/airbnb/dao/ImageDao.java @@ -25,4 +25,12 @@ public List findByCityId(Long cityId){ parameter.addValue("cityId",cityId); return jdbcTemplate.query(sql,parameter,imageMapper); } + + public List findByCategoryId(Long categoryId){ + String sql = "SELECT id, url, room_id, city_id, category_id, image_type FROM image " + + "WHERE category_id = :categoryId"; + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("categoryId",categoryId); + return jdbcTemplate.query(sql,parameter,imageMapper); + } } From 8d7bccec077a16c54ff2d15a0076e6ef13e0c4aa Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:12:08 +0900 Subject: [PATCH 063/117] =?UTF-8?q?feat:=20=E2=9C=A8CategoriesWrapper=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CategoryResponse 리스트를 감싸기 위한 Wrapper 클래스 --- .../java/airbnb/wrapper/CategoriesWrapper.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 BE/src/main/java/airbnb/wrapper/CategoriesWrapper.java diff --git a/BE/src/main/java/airbnb/wrapper/CategoriesWrapper.java b/BE/src/main/java/airbnb/wrapper/CategoriesWrapper.java new file mode 100644 index 000000000..1b337e731 --- /dev/null +++ b/BE/src/main/java/airbnb/wrapper/CategoriesWrapper.java @@ -0,0 +1,18 @@ +package airbnb.wrapper; + +import airbnb.dto.CategoryResponse; + +import java.util.List; + +public class CategoriesWrapper { + + private List categories; + + public CategoriesWrapper(List categories) { + this.categories = categories; + } + + public List getCategories() { + return categories; + } +} From 472df891b89a417d67b72305e19f3faa262f61d3 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:29:20 +0900 Subject: [PATCH 064/117] =?UTF-8?q?feat:=20=E2=9C=A8findByType=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 같은 타입의 image를 가져오기 위해 메소드 생성 --- BE/src/main/java/airbnb/dao/ImageDao.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/BE/src/main/java/airbnb/dao/ImageDao.java b/BE/src/main/java/airbnb/dao/ImageDao.java index 357928995..fc2e0100e 100644 --- a/BE/src/main/java/airbnb/dao/ImageDao.java +++ b/BE/src/main/java/airbnb/dao/ImageDao.java @@ -33,4 +33,12 @@ public List findByCategoryId(Long categoryId){ parameter.addValue("categoryId",categoryId); return jdbcTemplate.query(sql,parameter,imageMapper); } + + public List findByType(String imageType){ + String sql = "SELECT id, url, room_id, city_id, category_id, image_type FROM image " + + "WHERE image_type = :imageType"; + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("imageType",imageType); + return jdbcTemplate.query(sql,parameter,imageMapper); + } } From 1a44d80c261fd8d695b9a488f749bef232bbfd7b Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:30:37 +0900 Subject: [PATCH 065/117] =?UTF-8?q?feat:=20=E2=9C=A8ImageService=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/airbnb/Service/ImageService.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 BE/src/main/java/airbnb/Service/ImageService.java diff --git a/BE/src/main/java/airbnb/Service/ImageService.java b/BE/src/main/java/airbnb/Service/ImageService.java new file mode 100644 index 000000000..c02a2f5e4 --- /dev/null +++ b/BE/src/main/java/airbnb/Service/ImageService.java @@ -0,0 +1,20 @@ +package airbnb.Service; + +import airbnb.dao.ImageDao; +import airbnb.domain.Image; +import airbnb.domain.ImageType; +import org.springframework.stereotype.Service; + +@Service +public class ImageService { + + private final ImageDao imageDao; + + public ImageService(ImageDao imageDao) { + this.imageDao = imageDao; + } + + public Image findHiroImage(){ + return imageDao.findByType(ImageType.HIRO.name()).get(0); + } +} From f0ccd3787129291f04e0218970c3d214803d4f49 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:31:20 +0900 Subject: [PATCH 066/117] =?UTF-8?q?feat:=20=E2=9C=A8@JsonProperty=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 프론트와 협의한 네임으로 보내주기 위해 JsonProperty 추가 --- BE/src/main/java/airbnb/dto/CategoryResponse.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BE/src/main/java/airbnb/dto/CategoryResponse.java b/BE/src/main/java/airbnb/dto/CategoryResponse.java index 7729c6e4c..aa530a314 100644 --- a/BE/src/main/java/airbnb/dto/CategoryResponse.java +++ b/BE/src/main/java/airbnb/dto/CategoryResponse.java @@ -1,10 +1,13 @@ package airbnb.dto; import airbnb.domain.Category; +import com.fasterxml.jackson.annotation.JsonProperty; public class CategoryResponse { private final Long id; + + @JsonProperty(value = "Category") private final String name; private final String image; From db512f7ace0bb817a174a7bf5b72d8b4f3e2ff15 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:32:32 +0900 Subject: [PATCH 067/117] =?UTF-8?q?feat:=20=E2=9C=A8createAllToCategoriesW?= =?UTF-8?q?rapper=20=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 모든 카테고리를 CategoryResponse로 변환 후 List에 저장 - List를 감싸고있는 wrapper로 리턴하는 메소드 추가 --- .../java/airbnb/Service/CategoryService.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/BE/src/main/java/airbnb/Service/CategoryService.java b/BE/src/main/java/airbnb/Service/CategoryService.java index 6c5f34c5d..c13a1176b 100644 --- a/BE/src/main/java/airbnb/Service/CategoryService.java +++ b/BE/src/main/java/airbnb/Service/CategoryService.java @@ -1,8 +1,14 @@ package airbnb.Service; import airbnb.dao.CategoryDao; +import airbnb.domain.Category; +import airbnb.dto.CategoryResponse; +import airbnb.wrapper.CategoriesWrapper; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; + @Service public class CategoryService { @@ -11,4 +17,20 @@ public class CategoryService { public CategoryService(CategoryDao categoryDao) { this.categoryDao = categoryDao; } + + public List findAll(){ + return categoryDao.findAll(); + } + + public CategoriesWrapper createAllToCategoriesWrapper(){ + + List responsesList = new ArrayList<>(); + List categories = findAll(); + + for(Category category:categories){ + CategoryResponse categoryResponse = CategoryResponse.of(category, category.findMainImageUrl()); + responsesList.add(categoryResponse); + } + return new CategoriesWrapper(responsesList); + } } From eddb037ce203262f2642923359997768255b05b8 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:33:16 +0900 Subject: [PATCH 068/117] =?UTF-8?q?chore:=20=F0=9F=94=A7citiesWrapper?= =?UTF-8?q?=EB=A1=9C=20=EB=B0=98=ED=99=98=ED=83=80=EC=9E=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/Service/CityService.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/BE/src/main/java/airbnb/Service/CityService.java b/BE/src/main/java/airbnb/Service/CityService.java index 073f1c716..9c8ebf31a 100644 --- a/BE/src/main/java/airbnb/Service/CityService.java +++ b/BE/src/main/java/airbnb/Service/CityService.java @@ -3,6 +3,7 @@ import airbnb.dao.CityDao; import airbnb.domain.City; import airbnb.dto.CityResponse; +import airbnb.wrapper.CitiesWrapper; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -21,16 +22,15 @@ public List findAll() { return cityDao.findAll(); } - public List createAllToRequestList() { + public CitiesWrapper createAllToRequestList() { - List requestList = new ArrayList<>(); + List responseList = new ArrayList<>(); List cities = findAll(); for (City city : cities) { CityResponse cityResponse = CityResponse.of(city, city.findMainImageUrl()); - requestList.add(cityResponse); + responseList.add(cityResponse); } - - return requestList; + return new CitiesWrapper(responseList); } } From a5a212ba2d519fc971721d0840522574522926bd Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:52:46 +0900 Subject: [PATCH 069/117] =?UTF-8?q?feat:=20=E2=9C=A8cities=EC=99=80categor?= =?UTF-8?q?iesWrapper=20=EC=82=AD=EC=A0=9C(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/airbnb/wrapper/CategoriesWrapper.java | 18 ------------------ .../java/airbnb/wrapper/CitiesWrapper.java | 18 ------------------ BE/src/main/resources/data.sql | 9 +++++++++ 3 files changed, 9 insertions(+), 36 deletions(-) delete mode 100644 BE/src/main/java/airbnb/wrapper/CategoriesWrapper.java delete mode 100644 BE/src/main/java/airbnb/wrapper/CitiesWrapper.java diff --git a/BE/src/main/java/airbnb/wrapper/CategoriesWrapper.java b/BE/src/main/java/airbnb/wrapper/CategoriesWrapper.java deleted file mode 100644 index 1b337e731..000000000 --- a/BE/src/main/java/airbnb/wrapper/CategoriesWrapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package airbnb.wrapper; - -import airbnb.dto.CategoryResponse; - -import java.util.List; - -public class CategoriesWrapper { - - private List categories; - - public CategoriesWrapper(List categories) { - this.categories = categories; - } - - public List getCategories() { - return categories; - } -} diff --git a/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java b/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java deleted file mode 100644 index fc999acf5..000000000 --- a/BE/src/main/java/airbnb/wrapper/CitiesWrapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package airbnb.wrapper; - -import airbnb.dto.CityResponse; - -import java.util.List; - -public class CitiesWrapper { - - private List cities; - - public CitiesWrapper(List cities) { - this.cities = cities; - } - - public List getCities() { - return cities; - } -} diff --git a/BE/src/main/resources/data.sql b/BE/src/main/resources/data.sql index 168f5cc7e..e06b8fa3e 100644 --- a/BE/src/main/resources/data.sql +++ b/BE/src/main/resources/data.sql @@ -4,6 +4,9 @@ values ('서울'),('경기도'),('강원도'),('충청도'),('경상남도'),(' INSERT INTO image_type(type) values ('HIRO'),('MAIN'),('DETAIL'); +INSERT INTO category(name) +values ('자연생활을 만끽 할 수 있는 숙소'),('독특한 공간'),('집 전체'),('반려 동물과 함께 할 수 있는 공간'); + INSERT INTO image(url,image_type) values ('https://a0.muscache.com/im/pictures/ddc7f01f-3fb3-483c-87e6-701dad52c930.jpg?im_w=1920', 'HIRO'); @@ -16,3 +19,9 @@ values ('https://a0.muscache.com/im/pictures/71e23854-a3c7-491c-b715-6e86233a293 ('https://a0.muscache.com/im/pictures/087a8dff-a609-4084-86db-f45051c6f23a.jpg?im_q=medq&im_w=240','MAIN',6), ('https://a0.muscache.com/im/pictures/558a403a-aeed-4829-83a6-c9b0ccf21866.jpg?im_q=medq&im_w=240','MAIN',7), ('https://a0.muscache.com/im/pictures/a161fb95-6875-4aaa-aecd-3a46dead3220.jpg?im_q=medq&im_w=240','MAIN',8); + +INSERT INTO image(url,image_type,category_id) +values ('https://a0.muscache.com/im/pictures/36f53e61-db8d-403c-9122-5b761c0e4264.jpg?im_w=480','MAIN',1), + ('https://a0.muscache.com/im/pictures/2f13349d-879d-43c6-83e3-8e5679291d53.jpg?im_w=480','MAIN',2), + ('https://a0.muscache.com/im/pictures/7d82ca14-56e5-4465-8218-dcfa7d69b6ac.jpg?im_w=480','MAIN',3), + ('https://a0.muscache.com/im/pictures/10a638e1-6aff-4313-8033-1275cec83987.jpg?im_w=480','MAIN',4); From 08ce9172ce4924e280492a3745d949aa924b7c0c Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:53:17 +0900 Subject: [PATCH 070/117] =?UTF-8?q?feat:=20=E2=9C=A8MainPageWrapper=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Json 루트네임을 표시해 주기 위한 Wrapper --- .../java/airbnb/wrapper/MainPageWrapper.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 BE/src/main/java/airbnb/wrapper/MainPageWrapper.java diff --git a/BE/src/main/java/airbnb/wrapper/MainPageWrapper.java b/BE/src/main/java/airbnb/wrapper/MainPageWrapper.java new file mode 100644 index 000000000..cffda5aac --- /dev/null +++ b/BE/src/main/java/airbnb/wrapper/MainPageWrapper.java @@ -0,0 +1,16 @@ +package airbnb.wrapper; + +import airbnb.dto.MainPageResponse; + +public class MainPageWrapper { + + private MainPageResponse mainPageResponse; + + public MainPageWrapper(MainPageResponse mainPageResponse) { + this.mainPageResponse = mainPageResponse; + } + + public MainPageResponse getMainPage() { + return mainPageResponse; + } +} From f742c2f3c3b9031f87338f74bdfc95e80088df74 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:54:09 +0900 Subject: [PATCH 071/117] =?UTF-8?q?feat:=20=E2=9C=A8MainPageResponse=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 각 CityResponse와 CategoryResponse를 List로 필드를 가지기 위해 Dto 생성 --- .../java/airbnb/dto/MainPageResponse.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 BE/src/main/java/airbnb/dto/MainPageResponse.java diff --git a/BE/src/main/java/airbnb/dto/MainPageResponse.java b/BE/src/main/java/airbnb/dto/MainPageResponse.java new file mode 100644 index 000000000..c6373c9a5 --- /dev/null +++ b/BE/src/main/java/airbnb/dto/MainPageResponse.java @@ -0,0 +1,22 @@ +package airbnb.dto; + +import java.util.List; + +public class MainPageResponse { + + private final List cities; + private final List categories; + + public MainPageResponse(List cities, List categories) { + this.cities = cities; + this.categories = categories; + } + + public List getCities() { + return cities; + } + + public List getCategories() { + return categories; + } +} From 6d547703f88ffa542c46717e5da301f51e8fc8c1 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:55:01 +0900 Subject: [PATCH 072/117] =?UTF-8?q?style:=20=F0=9F=8E=A8=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=ED=8F=AC=EB=A7=B7=ED=8C=85=20=EC=88=98=EC=A0=95(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 코드를 좀더 깔끔하게 하기 위해 포멧팅 수정 --- .../java/airbnb/Service/CategoryService.java | 10 +++++----- .../main/java/airbnb/Service/CityService.java | 5 ++--- .../main/java/airbnb/Service/ImageService.java | 2 +- .../java/airbnb/controller/HomeController.java | 13 +++++++++---- BE/src/main/java/airbnb/dao/CategoryDao.java | 1 - BE/src/main/java/airbnb/dao/CityDao.java | 1 - BE/src/main/java/airbnb/dao/ImageDao.java | 18 +++++++++--------- BE/src/main/java/airbnb/domain/Category.java | 4 ++-- BE/src/main/java/airbnb/domain/City.java | 6 +++--- BE/src/main/java/airbnb/domain/Image.java | 13 +++++++------ .../main/java/airbnb/mapper/ImageMapper.java | 2 +- 11 files changed, 39 insertions(+), 36 deletions(-) diff --git a/BE/src/main/java/airbnb/Service/CategoryService.java b/BE/src/main/java/airbnb/Service/CategoryService.java index c13a1176b..ffe748386 100644 --- a/BE/src/main/java/airbnb/Service/CategoryService.java +++ b/BE/src/main/java/airbnb/Service/CategoryService.java @@ -3,7 +3,6 @@ import airbnb.dao.CategoryDao; import airbnb.domain.Category; import airbnb.dto.CategoryResponse; -import airbnb.wrapper.CategoriesWrapper; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -18,19 +17,20 @@ public CategoryService(CategoryDao categoryDao) { this.categoryDao = categoryDao; } - public List findAll(){ + public List findAll() { return categoryDao.findAll(); } - public CategoriesWrapper createAllToCategoriesWrapper(){ + public List createAllToCategoryResponseList() { List responsesList = new ArrayList<>(); List categories = findAll(); - for(Category category:categories){ + for (Category category : categories) { CategoryResponse categoryResponse = CategoryResponse.of(category, category.findMainImageUrl()); responsesList.add(categoryResponse); } - return new CategoriesWrapper(responsesList); + + return responsesList; } } diff --git a/BE/src/main/java/airbnb/Service/CityService.java b/BE/src/main/java/airbnb/Service/CityService.java index 9c8ebf31a..5fe07ccce 100644 --- a/BE/src/main/java/airbnb/Service/CityService.java +++ b/BE/src/main/java/airbnb/Service/CityService.java @@ -3,7 +3,6 @@ import airbnb.dao.CityDao; import airbnb.domain.City; import airbnb.dto.CityResponse; -import airbnb.wrapper.CitiesWrapper; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -22,7 +21,7 @@ public List findAll() { return cityDao.findAll(); } - public CitiesWrapper createAllToRequestList() { + public List createAllToCityResponseList() { List responseList = new ArrayList<>(); List cities = findAll(); @@ -31,6 +30,6 @@ public CitiesWrapper createAllToRequestList() { CityResponse cityResponse = CityResponse.of(city, city.findMainImageUrl()); responseList.add(cityResponse); } - return new CitiesWrapper(responseList); + return responseList; } } diff --git a/BE/src/main/java/airbnb/Service/ImageService.java b/BE/src/main/java/airbnb/Service/ImageService.java index c02a2f5e4..8a8e3b4c6 100644 --- a/BE/src/main/java/airbnb/Service/ImageService.java +++ b/BE/src/main/java/airbnb/Service/ImageService.java @@ -14,7 +14,7 @@ public ImageService(ImageDao imageDao) { this.imageDao = imageDao; } - public Image findHiroImage(){ + public Image findHiroImage() { return imageDao.findByType(ImageType.HIRO.name()).get(0); } } diff --git a/BE/src/main/java/airbnb/controller/HomeController.java b/BE/src/main/java/airbnb/controller/HomeController.java index 52c59a903..cc5960ac9 100644 --- a/BE/src/main/java/airbnb/controller/HomeController.java +++ b/BE/src/main/java/airbnb/controller/HomeController.java @@ -1,7 +1,9 @@ package airbnb.controller; +import airbnb.Service.CategoryService; import airbnb.Service.CityService; -import airbnb.wrapper.CitiesWrapper; +import airbnb.dto.MainPageResponse; +import airbnb.wrapper.MainPageWrapper; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -9,13 +11,16 @@ public class HomeController { private final CityService cityService; + private final CategoryService categoryService; - public HomeController(CityService cityService) { + public HomeController(CityService cityService, CategoryService categoryService) { this.cityService = cityService; + this.categoryService = categoryService; } @GetMapping - public CitiesWrapper readCities() { - return new CitiesWrapper(cityService.createAllToRequestList()); + public MainPageWrapper readCities() { + MainPageResponse mainPageResponse = new MainPageResponse(cityService.createAllToCityResponseList(), categoryService.createAllToCategoryResponseList()); + return new MainPageWrapper(mainPageResponse); } } diff --git a/BE/src/main/java/airbnb/dao/CategoryDao.java b/BE/src/main/java/airbnb/dao/CategoryDao.java index c58bff0a3..63a6f775e 100644 --- a/BE/src/main/java/airbnb/dao/CategoryDao.java +++ b/BE/src/main/java/airbnb/dao/CategoryDao.java @@ -14,7 +14,6 @@ public class CategoryDao { private final ImageDao imageDao; private final CategoryMapper categoryMapper = new CategoryMapper(); - public CategoryDao(JdbcTemplate jdbcTemplate, ImageDao imageDao) { this.jdbcTemplate = jdbcTemplate; this.imageDao = imageDao; diff --git a/BE/src/main/java/airbnb/dao/CityDao.java b/BE/src/main/java/airbnb/dao/CityDao.java index 437b6c8b0..88aa23dbd 100644 --- a/BE/src/main/java/airbnb/dao/CityDao.java +++ b/BE/src/main/java/airbnb/dao/CityDao.java @@ -14,7 +14,6 @@ public class CityDao { private final ImageDao imageDao; private final CityMapper cityMapper = new CityMapper(); - public CityDao(JdbcTemplate jdbcTemplate, ImageDao imageDao) { this.jdbcTemplate = jdbcTemplate; this.imageDao = imageDao; diff --git a/BE/src/main/java/airbnb/dao/ImageDao.java b/BE/src/main/java/airbnb/dao/ImageDao.java index fc2e0100e..d3346f5e5 100644 --- a/BE/src/main/java/airbnb/dao/ImageDao.java +++ b/BE/src/main/java/airbnb/dao/ImageDao.java @@ -18,27 +18,27 @@ public ImageDao(NamedParameterJdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } - public List findByCityId(Long cityId){ + public List findByCityId(Long cityId) { String sql = "SELECT id, url, room_id, city_id, category_id, image_type FROM image " + "WHERE city_id = :cityId"; MapSqlParameterSource parameter = new MapSqlParameterSource(); - parameter.addValue("cityId",cityId); - return jdbcTemplate.query(sql,parameter,imageMapper); + parameter.addValue("cityId", cityId); + return jdbcTemplate.query(sql, parameter, imageMapper); } - public List findByCategoryId(Long categoryId){ + public List findByCategoryId(Long categoryId) { String sql = "SELECT id, url, room_id, city_id, category_id, image_type FROM image " + "WHERE category_id = :categoryId"; MapSqlParameterSource parameter = new MapSqlParameterSource(); - parameter.addValue("categoryId",categoryId); - return jdbcTemplate.query(sql,parameter,imageMapper); + parameter.addValue("categoryId", categoryId); + return jdbcTemplate.query(sql, parameter, imageMapper); } - public List findByType(String imageType){ + public List findByType(String imageType) { String sql = "SELECT id, url, room_id, city_id, category_id, image_type FROM image " + "WHERE image_type = :imageType"; MapSqlParameterSource parameter = new MapSqlParameterSource(); - parameter.addValue("imageType",imageType); - return jdbcTemplate.query(sql,parameter,imageMapper); + parameter.addValue("imageType", imageType); + return jdbcTemplate.query(sql, parameter, imageMapper); } } diff --git a/BE/src/main/java/airbnb/domain/Category.java b/BE/src/main/java/airbnb/domain/Category.java index 29a57219f..aca7bb967 100644 --- a/BE/src/main/java/airbnb/domain/Category.java +++ b/BE/src/main/java/airbnb/domain/Category.java @@ -32,8 +32,8 @@ public void setImages(List images) { this.images = images; } - public String findMainImageUrl(){ - Image mainImage = images.stream().filter(image ->ImageType.MAIN.equals(image.getImageType())) + public String findMainImageUrl() { + Image mainImage = images.stream().filter(image -> ImageType.MAIN.equals(image.getImageType())) .findFirst().orElseThrow(NullPointerException::new); return mainImage.getUrl(); } diff --git a/BE/src/main/java/airbnb/domain/City.java b/BE/src/main/java/airbnb/domain/City.java index 40421a6e1..90d728805 100644 --- a/BE/src/main/java/airbnb/domain/City.java +++ b/BE/src/main/java/airbnb/domain/City.java @@ -28,7 +28,7 @@ public List getImages() { return images; } - public void addImage(Image image){ + public void addImage(Image image) { images.add(image); } @@ -36,8 +36,8 @@ public void setImages(List images) { this.images = images; } - public String findMainImageUrl(){ - Image mainImage = images.stream().filter(image ->ImageType.MAIN.equals(image.getImageType())) + public String findMainImageUrl() { + Image mainImage = images.stream().filter(image -> ImageType.MAIN.equals(image.getImageType())) .findFirst().orElseThrow(NullPointerException::new); return mainImage.getUrl(); } diff --git a/BE/src/main/java/airbnb/domain/Image.java b/BE/src/main/java/airbnb/domain/Image.java index 3696730e0..ee568f6cc 100644 --- a/BE/src/main/java/airbnb/domain/Image.java +++ b/BE/src/main/java/airbnb/domain/Image.java @@ -21,7 +21,8 @@ private Image(Builder builder) { this.categoryId = builder.categoryId; } - public static class Builder{ + public static class Builder { + private final Long id; private final String url; @@ -35,27 +36,27 @@ public Builder(Long id, String url) { this.url = url; } - public Builder imageType(ImageType imageType){ + public Builder imageType(ImageType imageType) { this.imageType = imageType; return this; } - public Builder cityId(Long cityId){ + public Builder cityId(Long cityId) { this.cityId = cityId; return this; } - public Builder roomId(Long roomId){ + public Builder roomId(Long roomId) { this.roomId = roomId; return this; } - public Builder categoryId(Long categoryId){ + public Builder categoryId(Long categoryId) { this.categoryId = categoryId; return this; } - public Image build(){ + public Image build() { return new Image(this); } } diff --git a/BE/src/main/java/airbnb/mapper/ImageMapper.java b/BE/src/main/java/airbnb/mapper/ImageMapper.java index ff1e0515c..8de553a95 100644 --- a/BE/src/main/java/airbnb/mapper/ImageMapper.java +++ b/BE/src/main/java/airbnb/mapper/ImageMapper.java @@ -11,7 +11,7 @@ public class ImageMapper implements RowMapper { @Override public Image mapRow(ResultSet rs, int rowNum) throws SQLException { - return new Image.Builder(rs.getLong("id"),rs.getString("url")) + return new Image.Builder(rs.getLong("id"), rs.getString("url")) .imageType(ImageType.valueOf(rs.getString("image_type"))) .cityId(rs.getLong("city_id")) .roomId(rs.getLong("room_id")) From 5c8934bac19800253b2c7b2697a24bcf6fd33cce Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 16:59:45 +0900 Subject: [PATCH 073/117] =?UTF-8?q?feat:=20=F0=9F=94=A7MainPageResponse?= =?UTF-8?q?=EC=97=90=20=EC=A0=95=EC=A0=81=ED=8C=A9=ED=86=A0=EB=A6=AC=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 게터를 dto 안에서 해주기 위해 정적 팩토리 메소드 추가 --- BE/src/main/java/airbnb/dao/RoomDao.java | 4 ---- BE/src/main/java/airbnb/dto/MainPageResponse.java | 14 +++++++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) delete mode 100644 BE/src/main/java/airbnb/dao/RoomDao.java diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java deleted file mode 100644 index fea0f70e1..000000000 --- a/BE/src/main/java/airbnb/dao/RoomDao.java +++ /dev/null @@ -1,4 +0,0 @@ -package airbnb.dao; - -public class RoomDao { -} diff --git a/BE/src/main/java/airbnb/dto/MainPageResponse.java b/BE/src/main/java/airbnb/dto/MainPageResponse.java index c6373c9a5..5f6ba9b12 100644 --- a/BE/src/main/java/airbnb/dto/MainPageResponse.java +++ b/BE/src/main/java/airbnb/dto/MainPageResponse.java @@ -1,17 +1,25 @@ package airbnb.dto; +import airbnb.domain.Image; + import java.util.List; public class MainPageResponse { + private final String hiroImage; private final List cities; private final List categories; - public MainPageResponse(List cities, List categories) { + private MainPageResponse(String hiroImage, List cities, List categories) { + this.hiroImage = hiroImage; this.cities = cities; this.categories = categories; } + public String getHiroImage() { + return hiroImage; + } + public List getCities() { return cities; } @@ -19,4 +27,8 @@ public List getCities() { public List getCategories() { return categories; } + + public static MainPageResponse of(Image hiroImage, List cities, List categories) { + return new MainPageResponse(hiroImage.getUrl(), cities, categories); + } } From fdf1c1c7e7d0cd127a53fdc4818ab8cfdfa3b75a Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 17:02:17 +0900 Subject: [PATCH 074/117] =?UTF-8?q?feat:=20=E2=9C=A8home()=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=A9=94=EC=86=8C=EB=93=9C=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20HiroImage=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/controller/HomeController.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/BE/src/main/java/airbnb/controller/HomeController.java b/BE/src/main/java/airbnb/controller/HomeController.java index cc5960ac9..9f85879b0 100644 --- a/BE/src/main/java/airbnb/controller/HomeController.java +++ b/BE/src/main/java/airbnb/controller/HomeController.java @@ -2,6 +2,7 @@ import airbnb.Service.CategoryService; import airbnb.Service.CityService; +import airbnb.Service.ImageService; import airbnb.dto.MainPageResponse; import airbnb.wrapper.MainPageWrapper; import org.springframework.web.bind.annotation.GetMapping; @@ -12,15 +13,18 @@ public class HomeController { private final CityService cityService; private final CategoryService categoryService; + private final ImageService imageService; - public HomeController(CityService cityService, CategoryService categoryService) { + public HomeController(CityService cityService, CategoryService categoryService, ImageService imageService) { this.cityService = cityService; this.categoryService = categoryService; + this.imageService = imageService; } @GetMapping - public MainPageWrapper readCities() { - MainPageResponse mainPageResponse = new MainPageResponse(cityService.createAllToCityResponseList(), categoryService.createAllToCategoryResponseList()); + public MainPageWrapper home() { + MainPageResponse mainPageResponse = MainPageResponse.of(imageService.findHiroImage(), cityService.createAllToCityResponseList(), + categoryService.createAllToCategoryResponseList()); return new MainPageWrapper(mainPageResponse); } } From a1c411c0634f147eefc4e64b0fd5a868483d59e2 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 21 May 2021 17:05:16 +0900 Subject: [PATCH 075/117] =?UTF-8?q?style:=20=F0=9F=8E=A8=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=ED=8F=AC=EB=A9=A7=ED=8C=85=20=EC=88=98=EC=A0=95(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/Service/CategoryService.java | 1 - BE/src/main/java/airbnb/dto/CategoryResponse.java | 3 --- 2 files changed, 4 deletions(-) diff --git a/BE/src/main/java/airbnb/Service/CategoryService.java b/BE/src/main/java/airbnb/Service/CategoryService.java index ffe748386..e1df52cb2 100644 --- a/BE/src/main/java/airbnb/Service/CategoryService.java +++ b/BE/src/main/java/airbnb/Service/CategoryService.java @@ -30,7 +30,6 @@ public List createAllToCategoryResponseList() { CategoryResponse categoryResponse = CategoryResponse.of(category, category.findMainImageUrl()); responsesList.add(categoryResponse); } - return responsesList; } } diff --git a/BE/src/main/java/airbnb/dto/CategoryResponse.java b/BE/src/main/java/airbnb/dto/CategoryResponse.java index aa530a314..898dd2c92 100644 --- a/BE/src/main/java/airbnb/dto/CategoryResponse.java +++ b/BE/src/main/java/airbnb/dto/CategoryResponse.java @@ -29,13 +29,11 @@ public Builder(Long id, String name) { this.name = name; } - public Builder image(String image) { this.image = image; return this; } - public CategoryResponse build() { return new CategoryResponse(this); } @@ -57,5 +55,4 @@ public static CategoryResponse of(Category category, String imageUrl) { return new CategoryResponse.Builder(category.getId(), category.getName()) .image(imageUrl).build(); } - } From de1a3acd8ad001da1d6aa6515c9ec10fc052678d Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 10:38:09 +0900 Subject: [PATCH 076/117] =?UTF-8?q?style:=20=F0=9F=8E=A8Jsonignore=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dto/CategoryResponse.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BE/src/main/java/airbnb/dto/CategoryResponse.java b/BE/src/main/java/airbnb/dto/CategoryResponse.java index 898dd2c92..fd39e2c81 100644 --- a/BE/src/main/java/airbnb/dto/CategoryResponse.java +++ b/BE/src/main/java/airbnb/dto/CategoryResponse.java @@ -1,10 +1,12 @@ package airbnb.dto; import airbnb.domain.Category; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; public class CategoryResponse { + @JsonIgnore private final Long id; @JsonProperty(value = "Category") From 29adca892dfacafddf48cc9125414017d39e2691 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 10:47:51 +0900 Subject: [PATCH 077/117] =?UTF-8?q?feat:=20=E2=9C=A8Location=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1(#20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 위도 경도를 객체로 묶기 위해 Location 클래스 생성 --- BE/src/main/java/airbnb/domain/Location.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 BE/src/main/java/airbnb/domain/Location.java diff --git a/BE/src/main/java/airbnb/domain/Location.java b/BE/src/main/java/airbnb/domain/Location.java new file mode 100644 index 000000000..9eb5a84ef --- /dev/null +++ b/BE/src/main/java/airbnb/domain/Location.java @@ -0,0 +1,20 @@ +package airbnb.domain; + +public class Location { + + private int latitude; + private int longitude; + + public Location(int latitude, int longitude) { + this.latitude = latitude; + this.longitude = longitude; + } + + public int getLatitude() { + return latitude; + } + + public int getLongitude() { + return longitude; + } +} From d22f318f666cf1e10b6398c19c8fb069aff98f5e Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 11:11:30 +0900 Subject: [PATCH 078/117] =?UTF-8?q?feat:=20=E2=9C=A8=EC=9C=84=EB=8F=84=20?= =?UTF-8?q?=EA=B2=BD=EB=8F=84=20=EA=B3=84=EC=82=B0=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=83=9D=EC=84=B1(#20)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 어떤 위치의 위도 경도가 주어졌을때 나와 그 위치 사이의 소요시간을 계산 --- BE/src/main/java/airbnb/domain/Location.java | 30 ++++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/BE/src/main/java/airbnb/domain/Location.java b/BE/src/main/java/airbnb/domain/Location.java index 9eb5a84ef..22bd90a03 100644 --- a/BE/src/main/java/airbnb/domain/Location.java +++ b/BE/src/main/java/airbnb/domain/Location.java @@ -2,19 +2,39 @@ public class Location { - private int latitude; - private int longitude; + private double latitude; + private double longitude; + private static final double STRAIGHT_ANGLE = 180.0; - public Location(int latitude, int longitude) { + public Location(double latitude, double longitude) { this.latitude = latitude; this.longitude = longitude; } - public int getLatitude() { + public double getLatitude() { return latitude; } - public int getLongitude() { + public double getLongitude() { return longitude; } + + public long calculatorTravelTime(Location location) { + double theta = this.longitude - location.longitude; + double distance = Math.sin(deg2rad(this.latitude)) * Math.sin(deg2rad(location.latitude)) + + Math.cos(deg2rad(this.latitude)) * Math.cos(deg2rad(location.latitude)) * Math.cos(deg2rad(theta)); + return Math.round(convertToKilometer(distance)); + } + + private double deg2rad(double degree) { + return (degree * Math.PI / STRAIGHT_ANGLE); + } + + private double rad2deg(double radian) { + return (radian * STRAIGHT_ANGLE / Math.PI); + } + + private double convertToKilometer(double distance) { + return (rad2deg(Math.acos(distance)) * 60 * 1.1515 * 1.609344); + } } From 0fd316e25e02a3fe194a03d7b1ff0dd9e37d06c3 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 11:25:18 +0900 Subject: [PATCH 079/117] =?UTF-8?q?chore:=20=F0=9F=94=A7=EC=9C=84=EB=8F=84?= =?UTF-8?q?=20=EA=B2=BD=EB=8F=84=20=EA=B3=84=EC=82=B0=EC=9D=84=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EC=88=98=EC=A0=95(#15)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/airbnb/Service/CityService.java | 5 ++-- BE/src/main/java/airbnb/dao/CityDao.java | 2 +- BE/src/main/java/airbnb/domain/City.java | 11 ++++++++- BE/src/main/java/airbnb/dto/CityResponse.java | 24 +++++++++++-------- .../main/java/airbnb/mapper/CityMapper.java | 3 ++- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/BE/src/main/java/airbnb/Service/CityService.java b/BE/src/main/java/airbnb/Service/CityService.java index 5fe07ccce..ce4e024a3 100644 --- a/BE/src/main/java/airbnb/Service/CityService.java +++ b/BE/src/main/java/airbnb/Service/CityService.java @@ -2,6 +2,7 @@ import airbnb.dao.CityDao; import airbnb.domain.City; +import airbnb.domain.Location; import airbnb.dto.CityResponse; import org.springframework.stereotype.Service; @@ -22,12 +23,12 @@ public List findAll() { } public List createAllToCityResponseList() { - + Location codeSquadLocation = new Location(37.491016774047345, 127.03339554026415); List responseList = new ArrayList<>(); List cities = findAll(); for (City city : cities) { - CityResponse cityResponse = CityResponse.of(city, city.findMainImageUrl()); + CityResponse cityResponse = CityResponse.of(city, city.findMainImageUrl(),codeSquadLocation); responseList.add(cityResponse); } return responseList; diff --git a/BE/src/main/java/airbnb/dao/CityDao.java b/BE/src/main/java/airbnb/dao/CityDao.java index 88aa23dbd..15e1c3124 100644 --- a/BE/src/main/java/airbnb/dao/CityDao.java +++ b/BE/src/main/java/airbnb/dao/CityDao.java @@ -20,7 +20,7 @@ public CityDao(JdbcTemplate jdbcTemplate, ImageDao imageDao) { } public List findAll() { - String sql = "SELECT id, name FROM city"; + String sql = "SELECT id, name, latitude, longitude FROM city"; List cities = jdbcTemplate.query(sql, cityMapper); cities.forEach(city -> city.setImages(imageDao.findByCityId(city.getId()))); return cities; diff --git a/BE/src/main/java/airbnb/domain/City.java b/BE/src/main/java/airbnb/domain/City.java index 90d728805..429e9d44a 100644 --- a/BE/src/main/java/airbnb/domain/City.java +++ b/BE/src/main/java/airbnb/domain/City.java @@ -1,6 +1,7 @@ package airbnb.domain; import org.springframework.data.annotation.Id; +import org.springframework.data.relational.core.mapping.Embedded; import java.util.List; @@ -11,9 +12,13 @@ public class City { private String name; private List images; - public City(Long id, String name) { + @Embedded.Nullable + private Location location; + + public City(Long id, String name, Location location) { this.id = id; this.name = name; + this.location = location; } public Long getId() { @@ -28,6 +33,10 @@ public List getImages() { return images; } + public Location getLocation() { + return location; + } + public void addImage(Image image) { images.add(image); } diff --git a/BE/src/main/java/airbnb/dto/CityResponse.java b/BE/src/main/java/airbnb/dto/CityResponse.java index f0b78018e..cd9dab5d2 100644 --- a/BE/src/main/java/airbnb/dto/CityResponse.java +++ b/BE/src/main/java/airbnb/dto/CityResponse.java @@ -1,19 +1,23 @@ package airbnb.dto; import airbnb.domain.City; +import airbnb.domain.Location; +import com.fasterxml.jackson.annotation.JsonProperty; public class CityResponse { private final Long id; private final String name; private final String image; - private final int distance; + + @JsonProperty(value = "distance") + private final long travelTime; private CityResponse(Builder builder) { this.id = builder.id; this.name = builder.name; this.image = builder.image; - this.distance = builder.distance; + this.travelTime = builder.travelTime; } public static class Builder { @@ -22,7 +26,7 @@ public static class Builder { private final String name; private String image; - private int distance = 10; + private long travelTime; public Builder(Long id, String name) { this.id = id; @@ -34,8 +38,8 @@ public Builder image(String image) { return this; } - public Builder distance(int distance) { - this.distance = distance; + public Builder travelTime(long travelTime) { + this.travelTime = travelTime; return this; } @@ -56,12 +60,12 @@ public String getImage() { return image; } - public int getDistance() { - return distance; + public long getTravelTime() { + return travelTime; } - public static CityResponse of(City city, String imageUrl) { - return new CityResponse.Builder(city.getId(), city.getName()) - .image(imageUrl).build(); + public static CityResponse of(City city, String imageUrl, Location location) { + return new Builder(city.getId(), city.getName()) + .image(imageUrl).travelTime(location.calculatorTravelTime(city.getLocation())).build(); } } diff --git a/BE/src/main/java/airbnb/mapper/CityMapper.java b/BE/src/main/java/airbnb/mapper/CityMapper.java index 58b694240..a340815a9 100644 --- a/BE/src/main/java/airbnb/mapper/CityMapper.java +++ b/BE/src/main/java/airbnb/mapper/CityMapper.java @@ -1,6 +1,7 @@ package airbnb.mapper; import airbnb.domain.City; +import airbnb.domain.Location; import org.springframework.jdbc.core.RowMapper; import java.sql.ResultSet; @@ -11,6 +12,6 @@ public class CityMapper implements RowMapper { @Override public City mapRow(ResultSet rs, int rowNum) throws SQLException { - return new City(rs.getLong("id"), rs.getString("name")); + return new City(rs.getLong("id"), rs.getString("name"), new Location(rs.getDouble("latitude"), rs.getDouble("longitude"))); } } From b13c65c2cf5f9231adccf6ad0b5fd10773bab350 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 11:46:34 +0900 Subject: [PATCH 080/117] =?UTF-8?q?feat:=20=E2=9C=A8RoomSearchRequest=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 숙소 검색을 할때 클라이언트가 요청 할 Dto 생성 --- BE/src/main/java/airbnb/dto/RoomSearchRequest.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 BE/src/main/java/airbnb/dto/RoomSearchRequest.java diff --git a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java new file mode 100644 index 000000000..bb0cdbff8 --- /dev/null +++ b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java @@ -0,0 +1,5 @@ +package airbnb.dto; + +public class RoomSearchRequest { + +} From 19d156eb0fdd20a25f5916a03cec7651e0ef8363 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 11:51:56 +0900 Subject: [PATCH 081/117] =?UTF-8?q?feat:=20=E2=9C=A8RoomSearchRequest=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 숙소 검색을 할때 클라이언트가 요청 할 Dto 생성 --- .../java/airbnb/dto/RoomSearchRequest.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java index bb0cdbff8..249a96ee5 100644 --- a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java +++ b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java @@ -1,5 +1,52 @@ package airbnb.dto; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.time.LocalDateTime; + public class RoomSearchRequest { + @JsonProperty(value = "city") + private final Long cityId; + + @JsonProperty(value = "people") + private final int maxPersonCount; + + private final int maxPrice; + private final int minPrice; + private final LocalDateTime checkIn; + private final LocalDateTime checkOut; + + public RoomSearchRequest(Long cityId, int maxPersonCount, int maxPrice, int minPrice, LocalDateTime checkIn, LocalDateTime checkOut) { + this.cityId = cityId; + this.maxPersonCount = maxPersonCount; + this.maxPrice = maxPrice; + this.minPrice = minPrice; + this.checkIn = checkIn; + this.checkOut = checkOut; + } + + public Long getCityId() { + return cityId; + } + + public int getMaxPersonCount() { + return maxPersonCount; + } + + public int getMaxPrice() { + return maxPrice; + } + + public int getMinPrice() { + return minPrice; + } + + public LocalDateTime getCheckIn() { + return checkIn; + } + + public LocalDateTime getCheckOut() { + return checkOut; + } } From b14dca70383b7d49bae0e2768903c90d6b3ab625 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 12:34:16 +0900 Subject: [PATCH 082/117] =?UTF-8?q?feat:=20=E2=9C=A8RoomSearchRequest=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 숙소 검색을 할때 클라이언트가 요청 할 Dto 생성 --- .../java/airbnb/dto/RoomSearchRequest.java | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java index 249a96ee5..d13116a16 100644 --- a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java +++ b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java @@ -1,8 +1,10 @@ package airbnb.dto; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; +import java.time.LocalDate; public class RoomSearchRequest { @@ -12,18 +14,23 @@ public class RoomSearchRequest { @JsonProperty(value = "people") private final int maxPersonCount; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private final LocalDate checkIn; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + private final LocalDate checkOut; + private final int maxPrice; private final int minPrice; - private final LocalDateTime checkIn; - private final LocalDateTime checkOut; - public RoomSearchRequest(Long cityId, int maxPersonCount, int maxPrice, int minPrice, LocalDateTime checkIn, LocalDateTime checkOut) { + + public RoomSearchRequest(Long cityId, int maxPersonCount, LocalDate checkIn, LocalDate checkOut, int maxPrice, int minPrice) { this.cityId = cityId; this.maxPersonCount = maxPersonCount; - this.maxPrice = maxPrice; - this.minPrice = minPrice; this.checkIn = checkIn; this.checkOut = checkOut; + this.maxPrice = maxPrice; + this.minPrice = minPrice; } public Long getCityId() { @@ -34,19 +41,19 @@ public int getMaxPersonCount() { return maxPersonCount; } - public int getMaxPrice() { - return maxPrice; + public LocalDate getCheckIn() { + return checkIn; } - public int getMinPrice() { - return minPrice; + public LocalDate getCheckOut() { + return checkOut; } - public LocalDateTime getCheckIn() { - return checkIn; + public int getMaxPrice() { + return maxPrice; } - public LocalDateTime getCheckOut() { - return checkOut; + public int getMinPrice() { + return minPrice; } } From d3f3d312db60a6ead4bb72f7f9828b51b7888726 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 17:03:46 +0900 Subject: [PATCH 083/117] =?UTF-8?q?feat:=20=E2=9C=A8RoomSearchRequest=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 숙소 검색을 할때 클라이언트가 요청 할 Dto 생성 --- BE/src/main/java/airbnb/dto/RoomSearchRequest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java index d13116a16..f890a58e7 100644 --- a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java +++ b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java @@ -1,6 +1,5 @@ package airbnb.dto; -import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import org.springframework.format.annotation.DateTimeFormat; @@ -23,7 +22,6 @@ public class RoomSearchRequest { private final int maxPrice; private final int minPrice; - public RoomSearchRequest(Long cityId, int maxPersonCount, LocalDate checkIn, LocalDate checkOut, int maxPrice, int minPrice) { this.cityId = cityId; this.maxPersonCount = maxPersonCount; From 6d266c7fe9598cd23edd8ba959e50fe939bf0a56 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 17:15:30 +0900 Subject: [PATCH 084/117] =?UTF-8?q?feat:=20=E2=9C=A8RoomsResponse=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 숙소 검색을 할때 클라이언트에게 응답할 Dto 생성 --- BE/src/main/java/airbnb/dto/RoomsResponse.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 BE/src/main/java/airbnb/dto/RoomsResponse.java diff --git a/BE/src/main/java/airbnb/dto/RoomsResponse.java b/BE/src/main/java/airbnb/dto/RoomsResponse.java new file mode 100644 index 000000000..7ed62c0b2 --- /dev/null +++ b/BE/src/main/java/airbnb/dto/RoomsResponse.java @@ -0,0 +1,18 @@ +package airbnb.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import javax.xml.soap.Detail; + +public class RoomsResponse { + + private final Long roomId; + private final int price; + private final String title; + private final String description; + private final Host host; + private final ImageResponse images; + + @JsonProperty(value = "detail") + private final RoomDetaileResponse roomDetaileResponse; +} From e7547fdd420c3484bb90b81b3f6ca4dff1f5ed38 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 17:15:47 +0900 Subject: [PATCH 085/117] =?UTF-8?q?feat:=20=E2=9C=A8RoomsResponseWrapper?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 숙소 검색을 할때 클라이언트에게 응답할 Dto를 감싸줄 Wrapper클래스 생성 --- BE/src/main/java/airbnb/wrapper/RoomsResponseWrapper.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 BE/src/main/java/airbnb/wrapper/RoomsResponseWrapper.java diff --git a/BE/src/main/java/airbnb/wrapper/RoomsResponseWrapper.java b/BE/src/main/java/airbnb/wrapper/RoomsResponseWrapper.java new file mode 100644 index 000000000..4fc323cb2 --- /dev/null +++ b/BE/src/main/java/airbnb/wrapper/RoomsResponseWrapper.java @@ -0,0 +1,5 @@ +package airbnb.wrapper; + +public class RoomsResponseWrapper { + +} From aadac51c0f01f9084a531b9db3d8b9d6bce2b479 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 17:51:16 +0900 Subject: [PATCH 086/117] =?UTF-8?q?chore:=20=F0=9F=94=A7Hero=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/Service/ImageService.java | 4 ++-- .../java/airbnb/controller/HomeController.java | 2 +- BE/src/main/java/airbnb/domain/ImageType.java | 2 +- BE/src/main/java/airbnb/dto/MainPageResponse.java | 14 +++++++------- BE/src/main/resources/data.sql | 4 ++-- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/BE/src/main/java/airbnb/Service/ImageService.java b/BE/src/main/java/airbnb/Service/ImageService.java index 8a8e3b4c6..f5af04f69 100644 --- a/BE/src/main/java/airbnb/Service/ImageService.java +++ b/BE/src/main/java/airbnb/Service/ImageService.java @@ -14,7 +14,7 @@ public ImageService(ImageDao imageDao) { this.imageDao = imageDao; } - public Image findHiroImage() { - return imageDao.findByType(ImageType.HIRO.name()).get(0); + public Image findHeroImage() { + return imageDao.findByType(ImageType.HERO.name()).get(0); } } diff --git a/BE/src/main/java/airbnb/controller/HomeController.java b/BE/src/main/java/airbnb/controller/HomeController.java index 9f85879b0..80e0983d0 100644 --- a/BE/src/main/java/airbnb/controller/HomeController.java +++ b/BE/src/main/java/airbnb/controller/HomeController.java @@ -23,7 +23,7 @@ public HomeController(CityService cityService, CategoryService categoryService, @GetMapping public MainPageWrapper home() { - MainPageResponse mainPageResponse = MainPageResponse.of(imageService.findHiroImage(), cityService.createAllToCityResponseList(), + MainPageResponse mainPageResponse = MainPageResponse.of(imageService.findHeroImage(), cityService.createAllToCityResponseList(), categoryService.createAllToCategoryResponseList()); return new MainPageWrapper(mainPageResponse); } diff --git a/BE/src/main/java/airbnb/domain/ImageType.java b/BE/src/main/java/airbnb/domain/ImageType.java index 77f6735d1..05b81bd78 100644 --- a/BE/src/main/java/airbnb/domain/ImageType.java +++ b/BE/src/main/java/airbnb/domain/ImageType.java @@ -1,7 +1,7 @@ package airbnb.domain; public enum ImageType { - HIRO, + HERO, MAIN, DETAIL } diff --git a/BE/src/main/java/airbnb/dto/MainPageResponse.java b/BE/src/main/java/airbnb/dto/MainPageResponse.java index 5f6ba9b12..bfac5f614 100644 --- a/BE/src/main/java/airbnb/dto/MainPageResponse.java +++ b/BE/src/main/java/airbnb/dto/MainPageResponse.java @@ -6,18 +6,18 @@ public class MainPageResponse { - private final String hiroImage; + private final String heroImage; private final List cities; private final List categories; - private MainPageResponse(String hiroImage, List cities, List categories) { - this.hiroImage = hiroImage; + private MainPageResponse(String heroImage, List cities, List categories) { + this.heroImage = heroImage; this.cities = cities; this.categories = categories; } - public String getHiroImage() { - return hiroImage; + public String getHeroImage() { + return heroImage; } public List getCities() { @@ -28,7 +28,7 @@ public List getCategories() { return categories; } - public static MainPageResponse of(Image hiroImage, List cities, List categories) { - return new MainPageResponse(hiroImage.getUrl(), cities, categories); + public static MainPageResponse of(Image heroImage, List cities, List categories) { + return new MainPageResponse(heroImage.getUrl(), cities, categories); } } diff --git a/BE/src/main/resources/data.sql b/BE/src/main/resources/data.sql index e06b8fa3e..92eee11cd 100644 --- a/BE/src/main/resources/data.sql +++ b/BE/src/main/resources/data.sql @@ -2,13 +2,13 @@ INSERT INTO city(name) values ('서울'),('경기도'),('강원도'),('충청도'),('경상남도'),('경상북도'),('전라남도'),('전라북도'); INSERT INTO image_type(type) -values ('HIRO'),('MAIN'),('DETAIL'); +values ('HERO'),('MAIN'),('DETAIL'); INSERT INTO category(name) values ('자연생활을 만끽 할 수 있는 숙소'),('독특한 공간'),('집 전체'),('반려 동물과 함께 할 수 있는 공간'); INSERT INTO image(url,image_type) -values ('https://a0.muscache.com/im/pictures/ddc7f01f-3fb3-483c-87e6-701dad52c930.jpg?im_w=1920', 'HIRO'); +values ('https://a0.muscache.com/im/pictures/ddc7f01f-3fb3-483c-87e6-701dad52c930.jpg?im_w=1920', 'HERO'); INSERT INTO image(url,image_type,city_id) values ('https://a0.muscache.com/im/pictures/71e23854-a3c7-491c-b715-6e86233a293f.jpg?im_q=medq&im_w=240','MAIN',1), From fcdd8f0169b5c39e3313d25f6e3d5e8f96a5f3a1 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Mon, 24 May 2021 17:52:39 +0900 Subject: [PATCH 087/117] =?UTF-8?q?wip:=20=E2=9A=99Room=20domain=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - detail,tax가 객체로 묶여있음 --- .../airbnb/controller/RoomController.java | 18 +++++++ BE/src/main/java/airbnb/domain/Room.java | 47 +++++++++++++++++++ .../main/java/airbnb/domain/RoomDetail.java | 10 ++++ BE/src/main/java/airbnb/domain/Tax.java | 8 ++++ .../main/java/airbnb/dto/RoomsResponse.java | 31 ++++++------ 5 files changed, 100 insertions(+), 14 deletions(-) create mode 100644 BE/src/main/java/airbnb/controller/RoomController.java create mode 100644 BE/src/main/java/airbnb/domain/Room.java create mode 100644 BE/src/main/java/airbnb/domain/RoomDetail.java create mode 100644 BE/src/main/java/airbnb/domain/Tax.java diff --git a/BE/src/main/java/airbnb/controller/RoomController.java b/BE/src/main/java/airbnb/controller/RoomController.java new file mode 100644 index 000000000..5a5dfb10b --- /dev/null +++ b/BE/src/main/java/airbnb/controller/RoomController.java @@ -0,0 +1,18 @@ +package airbnb.controller; + +import airbnb.dto.RoomSearchRequest; +import airbnb.wrapper.RoomsResponseWrapper; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +//@RestController +//@RequestMapping("/rooms") +//public class RoomController { +// +// @PostMapping +// public RoomsResponseWrapper searchRooms (@RequestBody RoomSearchRequest roomSearchRequest){ +// return RoomsResponseWrapper; +// } +//} diff --git a/BE/src/main/java/airbnb/domain/Room.java b/BE/src/main/java/airbnb/domain/Room.java new file mode 100644 index 000000000..34fd83a42 --- /dev/null +++ b/BE/src/main/java/airbnb/domain/Room.java @@ -0,0 +1,47 @@ +package airbnb.domain; + +import org.springframework.data.annotation.Id; + +public class Room { + + @Id + private Long id; + private int price; + private String title; + private String description; + private RoomDetail roomDetail; + private Tax tax; + + public Room(Long id, int price, String title, String description, RoomDetail roomDetail, Tax tax) { + this.id = id; + this.price = price; + this.title = title; + this.description = description; + this.roomDetail = roomDetail; + this.tax = tax; + } + + public Long getId() { + return id; + } + + public int getPrice() { + return price; + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public RoomDetail getRoomDetail() { + return roomDetail; + } + + public Tax getTax() { + return tax; + } +} diff --git a/BE/src/main/java/airbnb/domain/RoomDetail.java b/BE/src/main/java/airbnb/domain/RoomDetail.java new file mode 100644 index 000000000..e5efb01fc --- /dev/null +++ b/BE/src/main/java/airbnb/domain/RoomDetail.java @@ -0,0 +1,10 @@ +package airbnb.domain; + +public class RoomDetail { + private boolean oneRoom; + private int bedCount; + private int bathCount; + private boolean hairDryer; + private boolean airConditioner; + private boolean wiFi; +} diff --git a/BE/src/main/java/airbnb/domain/Tax.java b/BE/src/main/java/airbnb/domain/Tax.java new file mode 100644 index 000000000..0c49d67b0 --- /dev/null +++ b/BE/src/main/java/airbnb/domain/Tax.java @@ -0,0 +1,8 @@ +package airbnb.domain; + +public class Tax { + + private int cleanTax; + private int serviceTax; + private int accommodationTax; +} diff --git a/BE/src/main/java/airbnb/dto/RoomsResponse.java b/BE/src/main/java/airbnb/dto/RoomsResponse.java index 7ed62c0b2..51a9bb44a 100644 --- a/BE/src/main/java/airbnb/dto/RoomsResponse.java +++ b/BE/src/main/java/airbnb/dto/RoomsResponse.java @@ -2,17 +2,20 @@ import com.fasterxml.jackson.annotation.JsonProperty; -import javax.xml.soap.Detail; - -public class RoomsResponse { - - private final Long roomId; - private final int price; - private final String title; - private final String description; - private final Host host; - private final ImageResponse images; - - @JsonProperty(value = "detail") - private final RoomDetaileResponse roomDetaileResponse; -} +//public class RoomsResponse { +// +// private final Long roomId; +// private final int price; +// private final String title; +// private final String description; +// private final Host host; +// private final ImageResponse images; +// private final int grade; +// private final int reviewCount; +// private final int cleanTax; +// private final int serviceTax; +// private final int accomdationTax; +// +// @JsonProperty(value = "detail") +// private final RoomDetaileResponse roomDetaileResponse; +//} From 314a283f4dc8e3522d5fa81c6852d0f013bb811c Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 25 May 2021 11:55:12 +0900 Subject: [PATCH 088/117] =?UTF-8?q?feat:=E2=9C=A8RoomResponse=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 숙소 정보가 담긴 dto --- .../main/java/airbnb/dto/RoomsResponse.java | 114 +++++++++++++++--- 1 file changed, 97 insertions(+), 17 deletions(-) diff --git a/BE/src/main/java/airbnb/dto/RoomsResponse.java b/BE/src/main/java/airbnb/dto/RoomsResponse.java index 51a9bb44a..821632c62 100644 --- a/BE/src/main/java/airbnb/dto/RoomsResponse.java +++ b/BE/src/main/java/airbnb/dto/RoomsResponse.java @@ -1,21 +1,101 @@ package airbnb.dto; +import airbnb.domain.RoomDetail; +import airbnb.domain.Tax; import com.fasterxml.jackson.annotation.JsonProperty; -//public class RoomsResponse { -// -// private final Long roomId; -// private final int price; -// private final String title; -// private final String description; -// private final Host host; -// private final ImageResponse images; -// private final int grade; -// private final int reviewCount; -// private final int cleanTax; -// private final int serviceTax; -// private final int accomdationTax; -// -// @JsonProperty(value = "detail") -// private final RoomDetaileResponse roomDetaileResponse; -//} +public class RoomsResponse { + + private final Long roomId; + private final int price; + private final String title; + private final String description; + private final Host host; + private final ImageResponse images; + private final int grade; + private final int reviewCount; + private final Tax tax; + + @JsonProperty(value = "detail") + private final RoomDetail roomDetail; + + private RoomsResponse(Builder builder) { + this.roomId = builder.roomId; + this.price = builder.price; + this.title = builder.title; + this.description = builder.description; + this.host = builder.host; + this.images = builder.images; + this.grade = builder.grade; + this.reviewCount = builder.reviewCount; + this.tax = builder.tax; + this.roomDetail = builder.roomDetail; + } + + public static class Builder { + private Long roomId; + private int price; + private String title; + private String description; + private ImageResponse images; + private int grade; + private int reviewCount; + private Tax tax; + private Host host; + private RoomDetail roomDetail; + + public Builder roomId(Long roomId) { + this.roomId = roomId; + return this; + } + + public Builder price(int price) { + this.price = price; + return this; + } + + public Builder title(String title) { + this.title = title; + return this; + } + + public Builder description(String description) { + this.description = description; + return this; + } + + public Builder images(ImageResponse images) { + this.images = images; + return this; + } + + public Builder grade(int grade) { + this.grade = grade; + return this; + } + + public Builder reviewCount(int reviewCount) { + this.reviewCount = reviewCount; + return this; + } + + public Builder tax(Tax tax) { + this.tax = tax; + return this; + } + + public Builder host(Host host) { + this.host = host; + return this; + } + + public Builder roomDetail(RoomDetail roomDetail) { + this.roomDetail = roomDetail; + return this; + } + + public RoomsResponse build() { + return new RoomsResponse(this); + } + } +} From e7a56d9539eef21c9f6d02e10836e57c25caf8d2 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 25 May 2021 11:57:43 +0900 Subject: [PATCH 089/117] =?UTF-8?q?feat:=E2=9C=A8RoomResponse=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 숙소 정보가 담긴 dto --- .../airbnb/dto/{RoomsResponse.java => RoomResponse.java} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename BE/src/main/java/airbnb/dto/{RoomsResponse.java => RoomResponse.java} (93%) diff --git a/BE/src/main/java/airbnb/dto/RoomsResponse.java b/BE/src/main/java/airbnb/dto/RoomResponse.java similarity index 93% rename from BE/src/main/java/airbnb/dto/RoomsResponse.java rename to BE/src/main/java/airbnb/dto/RoomResponse.java index 821632c62..41cc22a85 100644 --- a/BE/src/main/java/airbnb/dto/RoomsResponse.java +++ b/BE/src/main/java/airbnb/dto/RoomResponse.java @@ -4,7 +4,7 @@ import airbnb.domain.Tax; import com.fasterxml.jackson.annotation.JsonProperty; -public class RoomsResponse { +public class RoomResponse { private final Long roomId; private final int price; @@ -19,7 +19,7 @@ public class RoomsResponse { @JsonProperty(value = "detail") private final RoomDetail roomDetail; - private RoomsResponse(Builder builder) { + private RoomResponse(Builder builder) { this.roomId = builder.roomId; this.price = builder.price; this.title = builder.title; @@ -94,8 +94,8 @@ public Builder roomDetail(RoomDetail roomDetail) { return this; } - public RoomsResponse build() { - return new RoomsResponse(this); + public RoomResponse build() { + return new RoomResponse(this); } } } From c46ecdf73ba9ec70b1133fb2cf20af888e4e01dd Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 25 May 2021 11:58:59 +0900 Subject: [PATCH 090/117] =?UTF-8?q?feat:=E2=9C=A8RoomResponseWrapper=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 숙소 정보가 담긴 RoomResponse를 감싸는 Wrapper 생성 --- .../airbnb/wrapper/RoomResponseWrapper.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 BE/src/main/java/airbnb/wrapper/RoomResponseWrapper.java diff --git a/BE/src/main/java/airbnb/wrapper/RoomResponseWrapper.java b/BE/src/main/java/airbnb/wrapper/RoomResponseWrapper.java new file mode 100644 index 000000000..3c5e1485c --- /dev/null +++ b/BE/src/main/java/airbnb/wrapper/RoomResponseWrapper.java @@ -0,0 +1,18 @@ +package airbnb.wrapper; + +import airbnb.dto.RoomResponse; + +import java.util.List; + +public class RoomResponseWrapper { + + private List rooms; + + public RoomResponseWrapper(List rooms) { + this.rooms = rooms; + } + + public List getRooms() { + return rooms; + } +} From bdbf3590f74c990e8995e95863ee0416c353c721 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Tue, 25 May 2021 14:40:51 +0900 Subject: [PATCH 091/117] =?UTF-8?q?chore:=20=EC=88=99=EC=86=8C=20=EA=B2=80?= =?UTF-8?q?=EC=83=88=20api=20=EC=A7=84=ED=96=89(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/controller/RoomController.java | 7 ------- .../main/java/airbnb/dto/ImageResponse.java | 21 +++++++++++++++++++ .../airbnb/wrapper/RoomsResponseWrapper.java | 5 ----- 3 files changed, 21 insertions(+), 12 deletions(-) create mode 100644 BE/src/main/java/airbnb/dto/ImageResponse.java delete mode 100644 BE/src/main/java/airbnb/wrapper/RoomsResponseWrapper.java diff --git a/BE/src/main/java/airbnb/controller/RoomController.java b/BE/src/main/java/airbnb/controller/RoomController.java index 5a5dfb10b..a484159f7 100644 --- a/BE/src/main/java/airbnb/controller/RoomController.java +++ b/BE/src/main/java/airbnb/controller/RoomController.java @@ -1,12 +1,5 @@ package airbnb.controller; -import airbnb.dto.RoomSearchRequest; -import airbnb.wrapper.RoomsResponseWrapper; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - //@RestController //@RequestMapping("/rooms") //public class RoomController { diff --git a/BE/src/main/java/airbnb/dto/ImageResponse.java b/BE/src/main/java/airbnb/dto/ImageResponse.java new file mode 100644 index 000000000..fc0a0a85b --- /dev/null +++ b/BE/src/main/java/airbnb/dto/ImageResponse.java @@ -0,0 +1,21 @@ +package airbnb.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; + +public class ImageResponse { + + @JsonProperty(value = "mainImage") + private String mainImageUrl; + + @JsonProperty(value = "detailImage") + private List detailImageUrls; + + public ImageResponse(String mainImageUrl, List detailImageUrls) { + this.mainImageUrl = mainImageUrl; + this.detailImageUrls = detailImageUrls; + } + + +} diff --git a/BE/src/main/java/airbnb/wrapper/RoomsResponseWrapper.java b/BE/src/main/java/airbnb/wrapper/RoomsResponseWrapper.java deleted file mode 100644 index 4fc323cb2..000000000 --- a/BE/src/main/java/airbnb/wrapper/RoomsResponseWrapper.java +++ /dev/null @@ -1,5 +0,0 @@ -package airbnb.wrapper; - -public class RoomsResponseWrapper { - -} From f9ca665e9193741cbd17c23eaddb79ecf2151d8a Mon Sep 17 00:00:00 2001 From: 95degree <95dgree@naver.com> Date: Tue, 25 May 2021 15:27:42 +0900 Subject: [PATCH 092/117] =?UTF-8?q?feat=20:=20=E2=9C=A8RoomMapper=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/airbnb/mapper/RoomMapper.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 BE/src/main/java/airbnb/mapper/RoomMapper.java diff --git a/BE/src/main/java/airbnb/mapper/RoomMapper.java b/BE/src/main/java/airbnb/mapper/RoomMapper.java new file mode 100644 index 000000000..9591f85a6 --- /dev/null +++ b/BE/src/main/java/airbnb/mapper/RoomMapper.java @@ -0,0 +1,26 @@ +package airbnb.mapper; + +import airbnb.domain.*; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class RoomMapper implements RowMapper { + @Override + public Room mapRow(ResultSet rs, int rowNum) throws SQLException { + return new Room.Builder(rs.getLong("id")).price(rs.getInt("price")) + .title(rs.getString("title")).description(rs.getString("description")) + .roomDetail(createRoomDetail(rs)).tax(createTax(rs)).build(); + } + + private RoomDetail createRoomDetail(ResultSet rs) throws SQLException { + return new RoomDetail.Builder().oneRoom(rs.getBoolean("oneRoom")).bedCount(rs.getInt("bed")).bathCount(rs.getInt("bath")) + .hairDryer(rs.getBoolean("hair_dryer")).airConditioner(rs.getBoolean("air_conditioner")) + .wiFi(rs.getBoolean("wiFi")).build(); + } + + private Tax createTax(ResultSet rs) throws SQLException { + return new Tax(rs.getInt("clean_tax"), rs.getInt("service_tax"), rs.getInt("accommodation_tax")); + } +} From 6f7bc859f40d19dd33271ce5c742435c3f2970a2 Mon Sep 17 00:00:00 2001 From: 95degree <95dgree@naver.com> Date: Tue, 25 May 2021 15:27:55 +0900 Subject: [PATCH 093/117] =?UTF-8?q?feat=20:=20=E2=9C=A8RoomDetail=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/airbnb/domain/RoomDetail.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/BE/src/main/java/airbnb/domain/RoomDetail.java b/BE/src/main/java/airbnb/domain/RoomDetail.java index e5efb01fc..c47c65cb5 100644 --- a/BE/src/main/java/airbnb/domain/RoomDetail.java +++ b/BE/src/main/java/airbnb/domain/RoomDetail.java @@ -7,4 +7,59 @@ public class RoomDetail { private boolean hairDryer; private boolean airConditioner; private boolean wiFi; + + + public RoomDetail(Builder builder) { + this.oneRoom = builder.oneRoom; + this.bedCount = builder.bedCount; + this.bathCount = builder.bathCount; + this.hairDryer = builder.hairDryer; + this.airConditioner = builder.airConditioner; + this.wiFi = builder.wiFi; + } + + public static class Builder { + private boolean oneRoom; + private int bedCount; + private int bathCount; + private boolean hairDryer; + private boolean airConditioner; + private boolean wiFi; + + + public Builder oneRoom(boolean oneRoom) { + this.oneRoom = oneRoom; + return this; + } + + public Builder bedCount(int bedCount) { + this.bedCount = bedCount; + return this; + } + + public Builder bathCount(int bathCount) { + this.bathCount = bathCount; + return this; + } + + public Builder hairDryer(boolean hairDryer) { + this.hairDryer = hairDryer; + return this; + } + + public Builder airConditioner(boolean airConditioner) { + this.airConditioner = airConditioner; + return this; + } + + public Builder wiFi(boolean wiFi) { + this.wiFi = wiFi; + return this; + } + + public RoomDetail build() { + return new RoomDetail(this); + } + + } } From a75fd29f260413a0dbf48e652195b3fadcdb22f7 Mon Sep 17 00:00:00 2001 From: 95degree <95dgree@naver.com> Date: Tue, 25 May 2021 15:28:05 +0900 Subject: [PATCH 094/117] =?UTF-8?q?feat=20:=20=E2=9C=A8Tax=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/domain/Tax.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/BE/src/main/java/airbnb/domain/Tax.java b/BE/src/main/java/airbnb/domain/Tax.java index 0c49d67b0..d0f1609ba 100644 --- a/BE/src/main/java/airbnb/domain/Tax.java +++ b/BE/src/main/java/airbnb/domain/Tax.java @@ -1,8 +1,25 @@ package airbnb.domain; public class Tax { - private int cleanTax; private int serviceTax; private int accommodationTax; + + public Tax(int cleanTax, int serviceTax, int accommodationTax) { + this.cleanTax = cleanTax; + this.serviceTax = serviceTax; + this.accommodationTax = accommodationTax; + } + + public int getCleanTax() { + return cleanTax; + } + + public int getServiceTax() { + return serviceTax; + } + + public int getAccommodationTax() { + return accommodationTax; + } } From 9f256d149105d8cefc88047f1504ea20597bd663 Mon Sep 17 00:00:00 2001 From: 95degree <95dgree@naver.com> Date: Tue, 25 May 2021 15:28:21 +0900 Subject: [PATCH 095/117] =?UTF-8?q?feat=20:=20=E2=9C=A8RoomDao=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dao/RoomDao.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 BE/src/main/java/airbnb/dao/RoomDao.java diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java new file mode 100644 index 000000000..b8bee9f43 --- /dev/null +++ b/BE/src/main/java/airbnb/dao/RoomDao.java @@ -0,0 +1,17 @@ +package airbnb.dao; + +import airbnb.mapper.ImageMapper; +import airbnb.mapper.RoomMapper; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class RoomDao { + + private NamedParameterJdbcTemplate jdbcTemplate; + private final RoomMapper roomMapper = new RoomMapper(); + + public RoomDao(NamedParameterJdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } +} From 6f01cf74a4a5e8b1e5b4bca746fe437bdae53037 Mon Sep 17 00:00:00 2001 From: 95degree <95dgree@naver.com> Date: Tue, 25 May 2021 15:28:33 +0900 Subject: [PATCH 096/117] =?UTF-8?q?feat=20:=20=E2=9C=A8Room=20=EB=B9=8C?= =?UTF-8?q?=EB=8D=94=20=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/domain/Room.java | 58 +++++++++++++++++++++--- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/BE/src/main/java/airbnb/domain/Room.java b/BE/src/main/java/airbnb/domain/Room.java index 34fd83a42..232ba9abb 100644 --- a/BE/src/main/java/airbnb/domain/Room.java +++ b/BE/src/main/java/airbnb/domain/Room.java @@ -12,13 +12,57 @@ public class Room { private RoomDetail roomDetail; private Tax tax; - public Room(Long id, int price, String title, String description, RoomDetail roomDetail, Tax tax) { - this.id = id; - this.price = price; - this.title = title; - this.description = description; - this.roomDetail = roomDetail; - this.tax = tax; + private Room(Builder builder) { + this.id = builder.id; + this.price = builder.price; + this.title = builder.title; + this.description = builder.description; + this.roomDetail = builder.roomDetail; + this.tax = builder.tax; + } + + public static class Builder { + + private final Long id; + + private int price; + private String title; + private String description; + private RoomDetail roomDetail; + private Tax tax; + + public Builder(Long id) { + this.id = id; + } + + public Builder price(int price) { + this.price = price; + return this; + } + + public Builder title(String title) { + this.title = title; + return this; + } + + public Builder description(String description) { + this.description = description; + return this; + } + + public Builder roomDetail(RoomDetail roomDetail) { + this.roomDetail = roomDetail; + return this; + } + + public Builder tax(Tax tax) { + this.tax = tax; + return this; + } + + public Room build(){ + return new Room(this); + } } public Long getId() { From ef0fa89b4c2c9e3e7db67d44f3f2000f5e3859a2 Mon Sep 17 00:00:00 2001 From: 95degree <95dgree@naver.com> Date: Tue, 25 May 2021 15:37:58 +0900 Subject: [PATCH 097/117] =?UTF-8?q?feat=20:=20=E2=9C=A8findByRoomId=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RoomId로 방과 관련된 이미지 List를 가져온다. --- BE/src/main/java/airbnb/dao/ImageDao.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/BE/src/main/java/airbnb/dao/ImageDao.java b/BE/src/main/java/airbnb/dao/ImageDao.java index d3346f5e5..d0c9c271e 100644 --- a/BE/src/main/java/airbnb/dao/ImageDao.java +++ b/BE/src/main/java/airbnb/dao/ImageDao.java @@ -41,4 +41,12 @@ public List findByType(String imageType) { parameter.addValue("imageType", imageType); return jdbcTemplate.query(sql, parameter, imageMapper); } + + public List findByRoomId(Long roomId) { + String sql = "SELECT id, url, room_id, city_id, category_id, image_type FROM image " + + "WHERE room_id = roomId"; + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("roomId", roomId); + return jdbcTemplate.query(sql, parameter, imageMapper); + } } From 18c9c6c2a33f9ab552a54913e9d5857a84d70033 Mon Sep 17 00:00:00 2001 From: 95degree <95dgree@naver.com> Date: Tue, 25 May 2021 15:50:14 +0900 Subject: [PATCH 098/117] =?UTF-8?q?feat=20:=20=E2=9C=A8findAll=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 저장된 모든 숙소의 정보를 가져오기 위해 findAll 메소드 생성 --- BE/src/main/java/airbnb/dao/ImageDao.java | 2 +- BE/src/main/java/airbnb/dao/RoomDao.java | 17 +++++++++++++++-- BE/src/main/java/airbnb/domain/Room.java | 9 ++++++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/BE/src/main/java/airbnb/dao/ImageDao.java b/BE/src/main/java/airbnb/dao/ImageDao.java index d0c9c271e..5cefeb1dc 100644 --- a/BE/src/main/java/airbnb/dao/ImageDao.java +++ b/BE/src/main/java/airbnb/dao/ImageDao.java @@ -11,7 +11,7 @@ @Repository public class ImageDao { - private NamedParameterJdbcTemplate jdbcTemplate; + private final NamedParameterJdbcTemplate jdbcTemplate; private final ImageMapper imageMapper = new ImageMapper(); public ImageDao(NamedParameterJdbcTemplate jdbcTemplate) { diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java index b8bee9f43..629bc419d 100644 --- a/BE/src/main/java/airbnb/dao/RoomDao.java +++ b/BE/src/main/java/airbnb/dao/RoomDao.java @@ -1,17 +1,30 @@ package airbnb.dao; +import airbnb.domain.City; +import airbnb.domain.Room; import airbnb.mapper.ImageMapper; import airbnb.mapper.RoomMapper; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public class RoomDao { - private NamedParameterJdbcTemplate jdbcTemplate; + private final NamedParameterJdbcTemplate jdbcTemplate; private final RoomMapper roomMapper = new RoomMapper(); + private final ImageDao imageDao; - public RoomDao(NamedParameterJdbcTemplate jdbcTemplate) { + public RoomDao(NamedParameterJdbcTemplate jdbcTemplate, ImageDao imageDao) { this.jdbcTemplate = jdbcTemplate; + this.imageDao = imageDao; + } + + public List findAll(){ + String sql = "SELECT id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clea_tax, service_tax, accommodation_tax FROM city"; + List rooms = jdbcTemplate.query(sql, roomMapper); + rooms.forEach(room -> room.setImages(imageDao.findByRoomId(room.getId()))); + return rooms; } } diff --git a/BE/src/main/java/airbnb/domain/Room.java b/BE/src/main/java/airbnb/domain/Room.java index 232ba9abb..a260cfde0 100644 --- a/BE/src/main/java/airbnb/domain/Room.java +++ b/BE/src/main/java/airbnb/domain/Room.java @@ -2,6 +2,8 @@ import org.springframework.data.annotation.Id; +import java.util.List; + public class Room { @Id @@ -11,6 +13,7 @@ public class Room { private String description; private RoomDetail roomDetail; private Tax tax; + private List images; private Room(Builder builder) { this.id = builder.id; @@ -60,7 +63,7 @@ public Builder tax(Tax tax) { return this; } - public Room build(){ + public Room build() { return new Room(this); } } @@ -88,4 +91,8 @@ public RoomDetail getRoomDetail() { public Tax getTax() { return tax; } + + public void setImages(List images) { + this.images = images; + } } From daf899200c7de32a59babed451fceea282630bcb Mon Sep 17 00:00:00 2001 From: 95degree <95dgree@naver.com> Date: Tue, 25 May 2021 15:51:10 +0900 Subject: [PATCH 099/117] =?UTF-8?q?chore=20:=20=F0=9F=94=A7wiFi=20->=20wif?= =?UTF-8?q?i=EB=A1=9C=20=EB=B3=80=EA=B2=BD(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - db의 컬러명과 같아야 하기 때문에 wifi로 변경 --- BE/src/main/java/airbnb/mapper/RoomMapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BE/src/main/java/airbnb/mapper/RoomMapper.java b/BE/src/main/java/airbnb/mapper/RoomMapper.java index 9591f85a6..eee335359 100644 --- a/BE/src/main/java/airbnb/mapper/RoomMapper.java +++ b/BE/src/main/java/airbnb/mapper/RoomMapper.java @@ -17,7 +17,7 @@ public Room mapRow(ResultSet rs, int rowNum) throws SQLException { private RoomDetail createRoomDetail(ResultSet rs) throws SQLException { return new RoomDetail.Builder().oneRoom(rs.getBoolean("oneRoom")).bedCount(rs.getInt("bed")).bathCount(rs.getInt("bath")) .hairDryer(rs.getBoolean("hair_dryer")).airConditioner(rs.getBoolean("air_conditioner")) - .wiFi(rs.getBoolean("wiFi")).build(); + .wiFi(rs.getBoolean("wifi")).build(); } private Tax createTax(ResultSet rs) throws SQLException { From 7784c499207d570e5dd8a59ded3c1a15c046f508 Mon Sep 17 00:00:00 2001 From: 95degree <95dgree@naver.com> Date: Tue, 25 May 2021 15:53:12 +0900 Subject: [PATCH 100/117] =?UTF-8?q?feat:=20=E2=9C=A8RoomService(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Room과 관련된 비지니스 로직을 처리하기 위해 RoomService 생성 --- BE/src/main/java/airbnb/Service/RoomService.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 BE/src/main/java/airbnb/Service/RoomService.java diff --git a/BE/src/main/java/airbnb/Service/RoomService.java b/BE/src/main/java/airbnb/Service/RoomService.java new file mode 100644 index 000000000..fec82ea8b --- /dev/null +++ b/BE/src/main/java/airbnb/Service/RoomService.java @@ -0,0 +1,13 @@ +package airbnb.Service; + +import airbnb.dao.RoomDao; +import org.springframework.stereotype.Service; + +@Service +public class RoomService { + private final RoomDao roomDao; + + public RoomService(RoomDao roomDao) { + this.roomDao = roomDao; + } +} From d1cc8f6866a3689a934314ec467fab29a3493fc6 Mon Sep 17 00:00:00 2001 From: 95degree <95dgree@naver.com> Date: Tue, 25 May 2021 17:34:45 +0900 Subject: [PATCH 101/117] =?UTF-8?q?wip:=20=E2=9A=99=EA=B0=80=EA=B2=A9?= =?UTF-8?q?=EB=8C=80=EB=B3=84=20=EB=B6=84=EB=A5=98=ED=95=B4=EC=84=9C=20?= =?UTF-8?q?=EB=B3=B4=EB=82=B4=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EB=A7=8C?= =?UTF-8?q?=EB=93=A4=EA=B8=B0(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/airbnb/Service/RoomService.java | 13 ++++++++ .../airbnb/controller/RoomController.java | 33 ++++++++++++++----- BE/src/main/java/airbnb/dao/RoomDao.java | 11 +++++++ .../java/airbnb/wrapper/PricesWrapper.java | 14 ++++++++ 4 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 BE/src/main/java/airbnb/wrapper/PricesWrapper.java diff --git a/BE/src/main/java/airbnb/Service/RoomService.java b/BE/src/main/java/airbnb/Service/RoomService.java index fec82ea8b..d3a8271df 100644 --- a/BE/src/main/java/airbnb/Service/RoomService.java +++ b/BE/src/main/java/airbnb/Service/RoomService.java @@ -3,11 +3,24 @@ import airbnb.dao.RoomDao; import org.springframework.stereotype.Service; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + @Service public class RoomService { + private final RoomDao roomDao; public RoomService(RoomDao roomDao) { this.roomDao = roomDao; } + + public Map findAllRoomPrice(){ + List prices = roomDao.findAllPrice(); + for(Integer price : prices){ + + } + return + } } diff --git a/BE/src/main/java/airbnb/controller/RoomController.java b/BE/src/main/java/airbnb/controller/RoomController.java index a484159f7..f4e76c702 100644 --- a/BE/src/main/java/airbnb/controller/RoomController.java +++ b/BE/src/main/java/airbnb/controller/RoomController.java @@ -1,11 +1,26 @@ package airbnb.controller; -//@RestController -//@RequestMapping("/rooms") -//public class RoomController { -// -// @PostMapping -// public RoomsResponseWrapper searchRooms (@RequestBody RoomSearchRequest roomSearchRequest){ -// return RoomsResponseWrapper; -// } -//} +import airbnb.Service.RoomService; +import airbnb.wrapper.PricesWrapper; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/rooms") +public class RoomController { + + private final RoomService roomService; + + public RoomController(RoomService roomService) { + this.roomService = roomService; + } + + @GetMapping("/price") + public PricesWrapper readAllRoomPrices(){ + return new PricesWrapper(roomService.findAllRoomPrice()); + } + + @PostMapping("/price") + public PricesWrapper readPrices(@RequestBody PriceRequest priceRequest){ + return new PricesWrapper(roomService.findSearchRoomsPrices(priceRequest)); + } +} diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java index 629bc419d..840baacf8 100644 --- a/BE/src/main/java/airbnb/dao/RoomDao.java +++ b/BE/src/main/java/airbnb/dao/RoomDao.java @@ -7,7 +7,10 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; +import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; +import java.util.Map; @Repository public class RoomDao { @@ -27,4 +30,12 @@ public List findAll(){ rooms.forEach(room -> room.setImages(imageDao.findByRoomId(room.getId()))); return rooms; } + + public List findAllPrice(){ + List prices = new ArrayList<>(); + String sql = "SELECT price FROM room ORDER BY price"; + List rooms = jdbcTemplate.query(sql, roomMapper); + rooms.forEach(room -> prices.add(room.getPrice())); + return prices; + } } diff --git a/BE/src/main/java/airbnb/wrapper/PricesWrapper.java b/BE/src/main/java/airbnb/wrapper/PricesWrapper.java new file mode 100644 index 000000000..4110896fe --- /dev/null +++ b/BE/src/main/java/airbnb/wrapper/PricesWrapper.java @@ -0,0 +1,14 @@ +package airbnb.wrapper; + +public class PricesWrapper { + + private PriceResponse prices; + + public PricesWrapper(PriceResponse prices) { + this.prices = prices; + } + + public PriceResponse getPrices() { + return prices; + } +} From 645d059630fa34ef0da4a8fbabdcbad9c031a410 Mon Sep 17 00:00:00 2001 From: 95degree <95dgree@naver.com> Date: Tue, 25 May 2021 17:35:00 +0900 Subject: [PATCH 102/117] =?UTF-8?q?wip:=20=E2=9A=99=EA=B0=80=EA=B2=A9?= =?UTF-8?q?=EB=8C=80=EB=B3=84=20=EB=B6=84=EB=A5=98=ED=95=B4=EC=84=9C=20?= =?UTF-8?q?=EB=B3=B4=EB=82=B4=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EB=A7=8C?= =?UTF-8?q?=EB=93=A4=EA=B8=B0(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dto/Host.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 BE/src/main/java/airbnb/dto/Host.java diff --git a/BE/src/main/java/airbnb/dto/Host.java b/BE/src/main/java/airbnb/dto/Host.java new file mode 100644 index 000000000..57fde20d2 --- /dev/null +++ b/BE/src/main/java/airbnb/dto/Host.java @@ -0,0 +1,4 @@ +package airbnb.dto; + +public class Host { +} From 0f1c5e4f51e71ed45d228026afe82e72b9b15727 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Wed, 26 May 2021 10:57:26 +0900 Subject: [PATCH 103/117] =?UTF-8?q?chore:=20=F0=9F=94=A7for=20each=20?= =?UTF-8?q?=EB=AC=B8=20=EC=8A=A4=ED=8A=B8=EB=A6=BC=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 일일이 add로 넣어줄때 생길수 있는 사이드 이펙트 방지를 위해 stream으로 변경 --- BE/src/main/java/airbnb/Service/CategoryService.java | 11 +++-------- BE/src/main/java/airbnb/Service/CityService.java | 10 +++------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/BE/src/main/java/airbnb/Service/CategoryService.java b/BE/src/main/java/airbnb/Service/CategoryService.java index e1df52cb2..c4fb8c189 100644 --- a/BE/src/main/java/airbnb/Service/CategoryService.java +++ b/BE/src/main/java/airbnb/Service/CategoryService.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Service public class CategoryService { @@ -22,14 +23,8 @@ public List findAll() { } public List createAllToCategoryResponseList() { - - List responsesList = new ArrayList<>(); List categories = findAll(); - - for (Category category : categories) { - CategoryResponse categoryResponse = CategoryResponse.of(category, category.findMainImageUrl()); - responsesList.add(categoryResponse); - } - return responsesList; + return categories.stream().map(category -> CategoryResponse.of(category, category.findMainImageUrl())) + .collect(Collectors.toList()); } } diff --git a/BE/src/main/java/airbnb/Service/CityService.java b/BE/src/main/java/airbnb/Service/CityService.java index ce4e024a3..db6be17e3 100644 --- a/BE/src/main/java/airbnb/Service/CityService.java +++ b/BE/src/main/java/airbnb/Service/CityService.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Service public class CityService { @@ -24,13 +25,8 @@ public List findAll() { public List createAllToCityResponseList() { Location codeSquadLocation = new Location(37.491016774047345, 127.03339554026415); - List responseList = new ArrayList<>(); List cities = findAll(); - - for (City city : cities) { - CityResponse cityResponse = CityResponse.of(city, city.findMainImageUrl(),codeSquadLocation); - responseList.add(cityResponse); - } - return responseList; + return cities.stream().map(city -> CityResponse.of(city, city.findMainImageUrl(), codeSquadLocation)) + .collect(Collectors.toList()); } } From 05dc4d754512a817d76e18f34b5c92dcc9e764c0 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Wed, 26 May 2021 11:57:33 +0900 Subject: [PATCH 104/117] =?UTF-8?q?chore:=20=F0=9F=94=A7=EB=AA=A8=EB=93=A0?= =?UTF-8?q?=20=EC=88=99=EC=86=8C=EC=9D=98=20=EA=B0=80=EA=B2=A9=20GET=20API?= =?UTF-8?q?=20(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - findAll()로 모든 숙소를 가져와 Price를 오름차순으로 정렬해서 보여준다. --- .../main/java/airbnb/Service/RoomService.java | 8 ++--- .../airbnb/controller/RoomController.java | 8 ++--- BE/src/main/java/airbnb/dao/RoomDao.java | 9 +++--- BE/src/main/java/airbnb/domain/Tax.java | 4 +++ .../main/java/airbnb/mapper/RoomMapper.java | 6 +--- .../java/airbnb/wrapper/PricesWrapper.java | 8 +++-- BE/src/main/resources/data.sql | 32 +++++++++++++++++++ BE/src/main/resources/shcema.sql | 2 -- 8 files changed, 52 insertions(+), 25 deletions(-) diff --git a/BE/src/main/java/airbnb/Service/RoomService.java b/BE/src/main/java/airbnb/Service/RoomService.java index d3a8271df..43bd39297 100644 --- a/BE/src/main/java/airbnb/Service/RoomService.java +++ b/BE/src/main/java/airbnb/Service/RoomService.java @@ -16,11 +16,7 @@ public RoomService(RoomDao roomDao) { this.roomDao = roomDao; } - public Map findAllRoomPrice(){ - List prices = roomDao.findAllPrice(); - for(Integer price : prices){ - - } - return + public List findAllRoomPrice(){ + return roomDao.findAllPrice(); } } diff --git a/BE/src/main/java/airbnb/controller/RoomController.java b/BE/src/main/java/airbnb/controller/RoomController.java index f4e76c702..034227654 100644 --- a/BE/src/main/java/airbnb/controller/RoomController.java +++ b/BE/src/main/java/airbnb/controller/RoomController.java @@ -19,8 +19,8 @@ public PricesWrapper readAllRoomPrices(){ return new PricesWrapper(roomService.findAllRoomPrice()); } - @PostMapping("/price") - public PricesWrapper readPrices(@RequestBody PriceRequest priceRequest){ - return new PricesWrapper(roomService.findSearchRoomsPrices(priceRequest)); - } +// @PostMapping("/price") +// public PricesWrapper readPrices(@RequestBody PriceRequest priceRequest){ +// return new PricesWrapper(roomService.findSearchRoomsPrices(priceRequest)); +// } } diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java index 840baacf8..f7d45d073 100644 --- a/BE/src/main/java/airbnb/dao/RoomDao.java +++ b/BE/src/main/java/airbnb/dao/RoomDao.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Repository public class RoomDao { @@ -25,17 +26,15 @@ public RoomDao(NamedParameterJdbcTemplate jdbcTemplate, ImageDao imageDao) { } public List findAll(){ - String sql = "SELECT id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clea_tax, service_tax, accommodation_tax FROM city"; + String sql = "SELECT id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room"; List rooms = jdbcTemplate.query(sql, roomMapper); rooms.forEach(room -> room.setImages(imageDao.findByRoomId(room.getId()))); return rooms; } public List findAllPrice(){ - List prices = new ArrayList<>(); - String sql = "SELECT price FROM room ORDER BY price"; + String sql = "SELECT id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room ORDER BY price"; List rooms = jdbcTemplate.query(sql, roomMapper); - rooms.forEach(room -> prices.add(room.getPrice())); - return prices; + return rooms.stream().map(Room::getPrice).collect(Collectors.toList()); } } diff --git a/BE/src/main/java/airbnb/domain/Tax.java b/BE/src/main/java/airbnb/domain/Tax.java index d0f1609ba..a69a6b4cd 100644 --- a/BE/src/main/java/airbnb/domain/Tax.java +++ b/BE/src/main/java/airbnb/domain/Tax.java @@ -22,4 +22,8 @@ public int getServiceTax() { public int getAccommodationTax() { return accommodationTax; } + + public static Tax of (int cleanTax, int price){ + return new Tax (cleanTax, (int)Math.round(price*0.15), (int)Math.round(price*0.015)); + } } diff --git a/BE/src/main/java/airbnb/mapper/RoomMapper.java b/BE/src/main/java/airbnb/mapper/RoomMapper.java index eee335359..886f66068 100644 --- a/BE/src/main/java/airbnb/mapper/RoomMapper.java +++ b/BE/src/main/java/airbnb/mapper/RoomMapper.java @@ -11,7 +11,7 @@ public class RoomMapper implements RowMapper { public Room mapRow(ResultSet rs, int rowNum) throws SQLException { return new Room.Builder(rs.getLong("id")).price(rs.getInt("price")) .title(rs.getString("title")).description(rs.getString("description")) - .roomDetail(createRoomDetail(rs)).tax(createTax(rs)).build(); + .roomDetail(createRoomDetail(rs)).tax(Tax.of(rs.getInt("clean_tax"),rs.getInt("price"))).build(); } private RoomDetail createRoomDetail(ResultSet rs) throws SQLException { @@ -19,8 +19,4 @@ private RoomDetail createRoomDetail(ResultSet rs) throws SQLException { .hairDryer(rs.getBoolean("hair_dryer")).airConditioner(rs.getBoolean("air_conditioner")) .wiFi(rs.getBoolean("wifi")).build(); } - - private Tax createTax(ResultSet rs) throws SQLException { - return new Tax(rs.getInt("clean_tax"), rs.getInt("service_tax"), rs.getInt("accommodation_tax")); - } } diff --git a/BE/src/main/java/airbnb/wrapper/PricesWrapper.java b/BE/src/main/java/airbnb/wrapper/PricesWrapper.java index 4110896fe..e7d15c11c 100644 --- a/BE/src/main/java/airbnb/wrapper/PricesWrapper.java +++ b/BE/src/main/java/airbnb/wrapper/PricesWrapper.java @@ -1,14 +1,16 @@ package airbnb.wrapper; +import java.util.List; + public class PricesWrapper { - private PriceResponse prices; + private List prices; - public PricesWrapper(PriceResponse prices) { + public PricesWrapper(List prices) { this.prices = prices; } - public PriceResponse getPrices() { + public List getPrices() { return prices; } } diff --git a/BE/src/main/resources/data.sql b/BE/src/main/resources/data.sql index 92eee11cd..7789e8f05 100644 --- a/BE/src/main/resources/data.sql +++ b/BE/src/main/resources/data.sql @@ -25,3 +25,35 @@ values ('https://a0.muscache.com/im/pictures/36f53e61-db8d-403c-9122-5b761c0e426 ('https://a0.muscache.com/im/pictures/2f13349d-879d-43c6-83e3-8e5679291d53.jpg?im_w=480','MAIN',2), ('https://a0.muscache.com/im/pictures/7d82ca14-56e5-4465-8218-dcfa7d69b6ac.jpg?im_w=480','MAIN',3), ('https://a0.muscache.com/im/pictures/10a638e1-6aff-4313-8033-1275cec83987.jpg?im_w=480','MAIN',4); + +INSERT INTO room(price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax, city_id, category_id) +values (150000, '이태원에 아늑한 숙소 Y 하우스', '이태원역에서 도보로 4분거리에 위치하고 있고 대로변에서 상당히 가까운 지역에 위치하여 여성분들도 안전하게 머무시며 이태원을 만끽하실 수 있으세요.' + , 2, false, 2, 1, true, true, true, 25000, 1, 1), + (200000, '강남역 1번 출구 바로 옆 편리하고 깔끔한 숙소', '- 전철까지 도보 30초 +- 침구로 매번 깨끗이 교체 +- 18층으로 좋은 전망 +- 세탁기 + 건조기 +- 지하창고에 짐 보관 무료 +- 주차는 1시간에 1000원으로 꼭 미리 문의 주셔야합니다' , 3, false, 3, 1, true, true, true, 22000, 1, 1), + (300000, '1호선 제기동 역에서 부터 도보로 30초거리에 위치' , '1. 1호선 제기동 역에서 부터 도보로 30초거리에 위치하고 있어 접근성이 훌륭합니다. +2. 모든 가구와 인테리어가 새것이라 매우 청결합니다. +3. 퀸사이즈 침대가 설치되어 있어 매우 편한 수면을 취할 수 있습니다. +4. 스마트 티비가 있습니다. 다양한 채널의 TV는 물론 본인 계정의 유튜브, 넷플릭스 계정을 연결하여 시청 할 수 있습니다. +5. 고급형 접이식 식탁이 있어서 공간을 유용하게 사용 할 수 있습니다. +6. 최신형 공기청정기가 있어 쾌적한 공기를 유지합니다. +7. 게스트분들의 피드백으로 전자레인지가 추가 되었습니다.', 3, false, 3, 1, true, true, true, 23000, 1, 2), + (250000, '뷰가 너무 좋은 숙소', '본 숙소는 친구, 지인들과의 모임장소나 회포를 풀고 생일파티를 하는 등 밤 늦게까지 술를 마시는 장소로는 적합하지 않습니다. 만약 그런 이유로 민원이 발생할경우 바로 퇴실조치 하겠습니다.', + 4, false, 3, 2, true, true, true, 18000, 1, 3), + (300000, '자가격리만 전문으로 하는 숙소입니다 :-)', '호텔에서 쓰는 40수 프리미엄 침구류로 이불, 배게 쾌적한 환경을 자랑합니다. +빔프로젝터(넷플릭스&왓챠 등), WIFI 가능 +식사를 위한 인덕션, 후라이팬, 냄비, 조리도구, 접시 등 모든 취사에 필요한 도구들이 준비되어 있습니다.' , 2, true, 2, 1, true, true, true, 20100, 1, 2), + (150000, '스마트 숙소관리 프리모(Premo)를 사용할 수 있는 AI 숙소', '-비대면 언택트 스마트 도어락 사용 +-일회용 비밀번호 사용으로 안전합니다. +▶응암역(6호선) 도보 7분 내외 +▶신축 / 엘레베이터 +▶이마트 도보 2분' , 3, false, 2, 1, true, true, true, 23000, 1, 3), + (150000, '당산역 1분거리에 있는 고층아파트', '무료주차(입.출차 1회제공) +빌트인가구와 퀸침대 55인치 tv +sk인터넷,tv, 와이파이제공 +선유도와 여의도한강공원산책가능', 2, true, 2, 1, true, true, true, 20000, 1, 1), + (400000, '어반스테이 더 남산', '말이 필요없다 일단 와라!!!', 4, false, 4, 2, true, true, true, 30000, 1, 4); diff --git a/BE/src/main/resources/shcema.sql b/BE/src/main/resources/shcema.sql index 0ecf12baf..d12531108 100644 --- a/BE/src/main/resources/shcema.sql +++ b/BE/src/main/resources/shcema.sql @@ -31,8 +31,6 @@ create table room( air_conditioner tinyint(1) not null default 0, wifi tinyint(1) not null default 0, clean_tax int , - service_tax int , - accommodation_tax int, city_id int not null, category_id int not null, From 429d2b14e2077d85e237fc288fa5a08c2bb5e7e1 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Wed, 26 May 2021 12:00:36 +0900 Subject: [PATCH 105/117] =?UTF-8?q?chore:=20=F0=9F=94=A7=EC=84=9C=EB=B2=84?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=A0=95=EB=A0=AC=EC=9D=84=20=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD=20(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - db에서 정렬된 상태를 받아오는 것이 아니라 서버에서 정렬을 하도록 로직을 변경 --- BE/src/main/java/airbnb/dao/RoomDao.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java index f7d45d073..756fd1b52 100644 --- a/BE/src/main/java/airbnb/dao/RoomDao.java +++ b/BE/src/main/java/airbnb/dao/RoomDao.java @@ -9,6 +9,7 @@ import java.time.LocalDate; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -33,8 +34,8 @@ public List findAll(){ } public List findAllPrice(){ - String sql = "SELECT id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room ORDER BY price"; + String sql = "SELECT id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room "; List rooms = jdbcTemplate.query(sql, roomMapper); - return rooms.stream().map(Room::getPrice).collect(Collectors.toList()); + return rooms.stream().map(Room::getPrice).sorted().collect(Collectors.toList()); } } From f9eb0ddd6a85cfe8601802ce063c1aadea829f83 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Wed, 26 May 2021 12:31:14 +0900 Subject: [PATCH 106/117] =?UTF-8?q?feat:=20=E2=9C=A8=20=EC=88=99=EC=86=8C?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=B3=B4=EB=82=B4=EC=A3=BC?= =?UTF-8?q?=EB=8A=94=20API=20=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/airbnb/Service/RoomService.java | 5 ++++ .../airbnb/controller/RoomController.java | 8 +++++++ BE/src/main/java/airbnb/dao/ImageDao.java | 2 +- .../main/java/airbnb/domain/RoomDetail.java | 23 +++++++++++++++++++ BE/src/main/resources/data.sql | 10 ++++++++ BE/src/main/resources/shcema.sql | 2 +- 6 files changed, 48 insertions(+), 2 deletions(-) diff --git a/BE/src/main/java/airbnb/Service/RoomService.java b/BE/src/main/java/airbnb/Service/RoomService.java index 43bd39297..4c7dd9d2c 100644 --- a/BE/src/main/java/airbnb/Service/RoomService.java +++ b/BE/src/main/java/airbnb/Service/RoomService.java @@ -1,6 +1,7 @@ package airbnb.Service; import airbnb.dao.RoomDao; +import airbnb.domain.Room; import org.springframework.stereotype.Service; import java.util.HashMap; @@ -19,4 +20,8 @@ public RoomService(RoomDao roomDao) { public List findAllRoomPrice(){ return roomDao.findAllPrice(); } + + public List findAll(){ + return roomDao.findAll(); + } } diff --git a/BE/src/main/java/airbnb/controller/RoomController.java b/BE/src/main/java/airbnb/controller/RoomController.java index 034227654..14ee15307 100644 --- a/BE/src/main/java/airbnb/controller/RoomController.java +++ b/BE/src/main/java/airbnb/controller/RoomController.java @@ -1,9 +1,12 @@ package airbnb.controller; import airbnb.Service.RoomService; +import airbnb.domain.Room; import airbnb.wrapper.PricesWrapper; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("/rooms") public class RoomController { @@ -23,4 +26,9 @@ public PricesWrapper readAllRoomPrices(){ // public PricesWrapper readPrices(@RequestBody PriceRequest priceRequest){ // return new PricesWrapper(roomService.findSearchRoomsPrices(priceRequest)); // } + + @GetMapping("/test") + public List test(){ + return roomService.findAll(); + } } diff --git a/BE/src/main/java/airbnb/dao/ImageDao.java b/BE/src/main/java/airbnb/dao/ImageDao.java index 5cefeb1dc..91f6ce55d 100644 --- a/BE/src/main/java/airbnb/dao/ImageDao.java +++ b/BE/src/main/java/airbnb/dao/ImageDao.java @@ -44,7 +44,7 @@ public List findByType(String imageType) { public List findByRoomId(Long roomId) { String sql = "SELECT id, url, room_id, city_id, category_id, image_type FROM image " + - "WHERE room_id = roomId"; + "WHERE room_id = :roomId"; MapSqlParameterSource parameter = new MapSqlParameterSource(); parameter.addValue("roomId", roomId); return jdbcTemplate.query(sql, parameter, imageMapper); diff --git a/BE/src/main/java/airbnb/domain/RoomDetail.java b/BE/src/main/java/airbnb/domain/RoomDetail.java index c47c65cb5..ff63992a0 100644 --- a/BE/src/main/java/airbnb/domain/RoomDetail.java +++ b/BE/src/main/java/airbnb/domain/RoomDetail.java @@ -60,6 +60,29 @@ public Builder wiFi(boolean wiFi) { public RoomDetail build() { return new RoomDetail(this); } + } + + public boolean isOneRoom() { + return oneRoom; + } + + public int getBedCount() { + return bedCount; + } + + public int getBathCount() { + return bathCount; + } + + public boolean isHairDryer() { + return hairDryer; + } + + public boolean isAirConditioner() { + return airConditioner; + } + public boolean isWiFi() { + return wiFi; } } diff --git a/BE/src/main/resources/data.sql b/BE/src/main/resources/data.sql index 7789e8f05..79742515f 100644 --- a/BE/src/main/resources/data.sql +++ b/BE/src/main/resources/data.sql @@ -26,6 +26,16 @@ values ('https://a0.muscache.com/im/pictures/36f53e61-db8d-403c-9122-5b761c0e426 ('https://a0.muscache.com/im/pictures/7d82ca14-56e5-4465-8218-dcfa7d69b6ac.jpg?im_w=480','MAIN',3), ('https://a0.muscache.com/im/pictures/10a638e1-6aff-4313-8033-1275cec83987.jpg?im_w=480','MAIN',4); +INSERT INTO image(url,image_type,room_id) +values ('https://a0.muscache.com/im/pictures/c45d08e5-f560-44f0-83fc-83290ccd1670.jpg?im_w=1200', 'MAIN', 1), + ('https://a0.muscache.com/im/pictures/83ea7cb5-a925-4fc8-835f-da8df7f24bec.jpg?im_w=1200', 'MAIN', 2), + ('https://a0.muscache.com/im/pictures/miso/Hosting-44159716/original/04dc2ade-cd11-4599-a7fb-a6f4b6176f4e.jpeg?im_w=1200', 'MAIN', 3), + ('https://a0.muscache.com/im/pictures/42c6cd5c-512c-4f39-9e9c-9ed274f2f0e5.jpg?im_w=1200', 'MAIN', 4), + ('https://a0.muscache.com/im/pictures/miso/Hosting-44090615/original/c2904e87-4014-4d26-a977-b789248c77ce.jpeg?im_w=1200', 'MAIN', 5), + ('https://a0.muscache.com/im/pictures/miso/Hosting-47435529/original/82c508c8-e0b5-4da2-805f-8772ad9bfe9d.jpeg?im_w=1200', 'MAIN', 6), + ('https://a0.muscache.com/im/pictures/a63a845b-c16e-4a0f-b0ca-a124a677b3d2.jpg?im_w=1200', 'MAIN', 7), + ('https://a0.muscache.com/im/pictures/miso/Hosting-47897490/original/b0238603-d063-4f5c-9e10-c835132669e4.jpeg?im_w=1200', 'MAIN', 8); + INSERT INTO room(price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax, city_id, category_id) values (150000, '이태원에 아늑한 숙소 Y 하우스', '이태원역에서 도보로 4분거리에 위치하고 있고 대로변에서 상당히 가까운 지역에 위치하여 여성분들도 안전하게 머무시며 이태원을 만끽하실 수 있으세요.' , 2, false, 2, 1, true, true, true, 25000, 1, 1), diff --git a/BE/src/main/resources/shcema.sql b/BE/src/main/resources/shcema.sql index d12531108..141fcead6 100644 --- a/BE/src/main/resources/shcema.sql +++ b/BE/src/main/resources/shcema.sql @@ -42,7 +42,7 @@ create table room( drop table image; create table image( id int not null auto_increment, - url varchar(100) not null, + url varchar(300) not null, room_id int, category_id int, city_id int, From eb9a85ba403015791f4ea3bfc6783626fca8caa2 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Wed, 26 May 2021 16:17:15 +0900 Subject: [PATCH 107/117] =?UTF-8?q?feat:=20=E2=9C=A8=20=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A5=B4=EA=B3=BC=20=EB=8F=84=EC=8B=9C=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EB=A5=BC=20=EB=84=98=EA=B2=A8=EC=A4=84=20PriceRequest=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 도시 Id와 스케쥴을 클라이언트에서 받기 위해 Dto생성 --- BE/src/main/java/airbnb/domain/Room.java | 4 ++++ BE/src/main/java/airbnb/dto/PriceRequest.java | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 BE/src/main/java/airbnb/dto/PriceRequest.java diff --git a/BE/src/main/java/airbnb/domain/Room.java b/BE/src/main/java/airbnb/domain/Room.java index a260cfde0..df7ed7c57 100644 --- a/BE/src/main/java/airbnb/domain/Room.java +++ b/BE/src/main/java/airbnb/domain/Room.java @@ -92,6 +92,10 @@ public Tax getTax() { return tax; } + public List getImages() { + return images; + } + public void setImages(List images) { this.images = images; } diff --git a/BE/src/main/java/airbnb/dto/PriceRequest.java b/BE/src/main/java/airbnb/dto/PriceRequest.java new file mode 100644 index 000000000..89d9f76b0 --- /dev/null +++ b/BE/src/main/java/airbnb/dto/PriceRequest.java @@ -0,0 +1,4 @@ +package airbnb.dto; + +public class PriceRequest { +} From ce980f819698878fae2be0396430b345dbbd52cd Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Wed, 26 May 2021 16:40:01 +0900 Subject: [PATCH 108/117] =?UTF-8?q?feat:=20=E2=9C=A8=20=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A5=B4=EA=B3=BC=20=EB=8F=84=EC=8B=9C=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EB=A5=BC=20=EB=84=98=EA=B2=A8=EC=A4=84=20PriceRequest=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 도시 Id와 스케쥴을 클라이언트에서 받기 위해 Dto생성 --- .../airbnb/controller/RoomController.java | 12 ++++++ BE/src/main/java/airbnb/domain/City.java | 2 - BE/src/main/java/airbnb/domain/Cost.java | 23 ++++++++++ BE/src/main/java/airbnb/domain/Schedule.java | 22 ++++++++++ .../main/java/airbnb/dto/ImageResponse.java | 2 - BE/src/main/java/airbnb/dto/PriceRequest.java | 18 ++++++++ .../java/airbnb/dto/RoomSearchRequest.java | 43 ++++++------------- BE/src/main/resources/data.sql | 2 +- BE/src/main/resources/shcema.sql | 2 +- 9 files changed, 90 insertions(+), 36 deletions(-) create mode 100644 BE/src/main/java/airbnb/domain/Cost.java create mode 100644 BE/src/main/java/airbnb/domain/Schedule.java diff --git a/BE/src/main/java/airbnb/controller/RoomController.java b/BE/src/main/java/airbnb/controller/RoomController.java index 14ee15307..4e576f964 100644 --- a/BE/src/main/java/airbnb/controller/RoomController.java +++ b/BE/src/main/java/airbnb/controller/RoomController.java @@ -2,6 +2,8 @@ import airbnb.Service.RoomService; import airbnb.domain.Room; +import airbnb.dto.PriceRequest; +import airbnb.dto.RoomSearchRequest; import airbnb.wrapper.PricesWrapper; import org.springframework.web.bind.annotation.*; @@ -31,4 +33,14 @@ public PricesWrapper readAllRoomPrices(){ public List test(){ return roomService.findAll(); } + + @PostMapping("/price") + public PriceRequest postTest(@RequestBody PriceRequest priceRequest){ + return priceRequest; + } + + @PostMapping + public RoomSearchRequest searchRequest(@RequestBody RoomSearchRequest roomSearchRequest){ + return roomSearchRequest; + } } diff --git a/BE/src/main/java/airbnb/domain/City.java b/BE/src/main/java/airbnb/domain/City.java index 429e9d44a..ec03d9bfe 100644 --- a/BE/src/main/java/airbnb/domain/City.java +++ b/BE/src/main/java/airbnb/domain/City.java @@ -11,8 +11,6 @@ public class City { private Long id; private String name; private List images; - - @Embedded.Nullable private Location location; public City(Long id, String name, Location location) { diff --git a/BE/src/main/java/airbnb/domain/Cost.java b/BE/src/main/java/airbnb/domain/Cost.java new file mode 100644 index 000000000..e1bef389c --- /dev/null +++ b/BE/src/main/java/airbnb/domain/Cost.java @@ -0,0 +1,23 @@ +package airbnb.domain; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Cost { + @JsonProperty(value = "max") + private int maxCost; + @JsonProperty(value ="min") + private int minCost; + + public Cost(int maxPrice, int minPrice) { + this.maxCost = maxPrice; + this.minCost = minPrice; + } + + public int getMaxCost() { + return maxCost; + } + + public int getMinCost() { + return minCost; + } +} diff --git a/BE/src/main/java/airbnb/domain/Schedule.java b/BE/src/main/java/airbnb/domain/Schedule.java new file mode 100644 index 000000000..d5648f521 --- /dev/null +++ b/BE/src/main/java/airbnb/domain/Schedule.java @@ -0,0 +1,22 @@ +package airbnb.domain; + +import java.time.LocalDate; + +public class Schedule { + + private final LocalDate checkIn; + private final LocalDate checkOut; + + public Schedule(LocalDate checkIn, LocalDate checkOut) { + this.checkIn = checkIn; + this.checkOut = checkOut; + } + + public LocalDate getCheckIn() { + return checkIn; + } + + public LocalDate getCheckOut() { + return checkOut; + } +} diff --git a/BE/src/main/java/airbnb/dto/ImageResponse.java b/BE/src/main/java/airbnb/dto/ImageResponse.java index fc0a0a85b..2c5402879 100644 --- a/BE/src/main/java/airbnb/dto/ImageResponse.java +++ b/BE/src/main/java/airbnb/dto/ImageResponse.java @@ -16,6 +16,4 @@ public ImageResponse(String mainImageUrl, List detailImageUrls) { this.mainImageUrl = mainImageUrl; this.detailImageUrls = detailImageUrls; } - - } diff --git a/BE/src/main/java/airbnb/dto/PriceRequest.java b/BE/src/main/java/airbnb/dto/PriceRequest.java index 89d9f76b0..21bb79dd6 100644 --- a/BE/src/main/java/airbnb/dto/PriceRequest.java +++ b/BE/src/main/java/airbnb/dto/PriceRequest.java @@ -1,4 +1,22 @@ package airbnb.dto; +import airbnb.domain.Schedule; + public class PriceRequest { + + private final Long cityId; + private final Schedule schedule; + + public PriceRequest(Long cityId, Schedule schedule) { + this.cityId = cityId; + this.schedule = schedule; + } + + public Long getCityId() { + return cityId; + } + + public Schedule getSchedule() { + return schedule; + } } diff --git a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java index f890a58e7..a6412c417 100644 --- a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java +++ b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java @@ -1,34 +1,25 @@ package airbnb.dto; +import airbnb.domain.Cost; +import airbnb.domain.Schedule; import com.fasterxml.jackson.annotation.JsonProperty; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDate; public class RoomSearchRequest { - @JsonProperty(value = "city") private final Long cityId; + private final Schedule schedule; + + @JsonProperty(value = "price") + private final Cost cost; @JsonProperty(value = "people") private final int maxPersonCount; - @DateTimeFormat(pattern = "yyyy-MM-dd") - private final LocalDate checkIn; - - @DateTimeFormat(pattern = "yyyy-MM-dd") - private final LocalDate checkOut; - - private final int maxPrice; - private final int minPrice; - - public RoomSearchRequest(Long cityId, int maxPersonCount, LocalDate checkIn, LocalDate checkOut, int maxPrice, int minPrice) { + public RoomSearchRequest(Long cityId, int maxPersonCount, Schedule schedule, Cost cost) { this.cityId = cityId; this.maxPersonCount = maxPersonCount; - this.checkIn = checkIn; - this.checkOut = checkOut; - this.maxPrice = maxPrice; - this.minPrice = minPrice; + this.schedule = schedule; + this.cost = cost; } public Long getCityId() { @@ -39,19 +30,11 @@ public int getMaxPersonCount() { return maxPersonCount; } - public LocalDate getCheckIn() { - return checkIn; - } - - public LocalDate getCheckOut() { - return checkOut; - } - - public int getMaxPrice() { - return maxPrice; + public Schedule getSchedule() { + return schedule; } - public int getMinPrice() { - return minPrice; + public Cost getPrice() { + return cost; } } diff --git a/BE/src/main/resources/data.sql b/BE/src/main/resources/data.sql index 79742515f..729040d85 100644 --- a/BE/src/main/resources/data.sql +++ b/BE/src/main/resources/data.sql @@ -36,7 +36,7 @@ values ('https://a0.muscache.com/im/pictures/c45d08e5-f560-44f0-83fc-83290ccd167 ('https://a0.muscache.com/im/pictures/a63a845b-c16e-4a0f-b0ca-a124a677b3d2.jpg?im_w=1200', 'MAIN', 7), ('https://a0.muscache.com/im/pictures/miso/Hosting-47897490/original/b0238603-d063-4f5c-9e10-c835132669e4.jpeg?im_w=1200', 'MAIN', 8); -INSERT INTO room(price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax, city_id, category_id) +INSERT INTO room(cost, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax, city_id, category_id) values (150000, '이태원에 아늑한 숙소 Y 하우스', '이태원역에서 도보로 4분거리에 위치하고 있고 대로변에서 상당히 가까운 지역에 위치하여 여성분들도 안전하게 머무시며 이태원을 만끽하실 수 있으세요.' , 2, false, 2, 1, true, true, true, 25000, 1, 1), (200000, '강남역 1번 출구 바로 옆 편리하고 깔끔한 숙소', '- 전철까지 도보 30초 diff --git a/BE/src/main/resources/shcema.sql b/BE/src/main/resources/shcema.sql index 141fcead6..065b24e17 100644 --- a/BE/src/main/resources/shcema.sql +++ b/BE/src/main/resources/shcema.sql @@ -20,7 +20,7 @@ create table category( drop tabel room; create table room( id int not null auto_increment, - price int not null, + cost int not null, title varchar (45) not null, description varchar (300), people int not null, From 84a0ccd31e98edcf50b3f153f0791f6304d034ef Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Wed, 26 May 2021 18:00:29 +0900 Subject: [PATCH 109/117] =?UTF-8?q?wip:=20=EC=8A=A4=EC=BC=80=EC=A5=B4?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EA=B0=80=EB=8A=A5=ED=95=9C=20?= =?UTF-8?q?=EC=88=99=EC=86=8C=20=EC=A1=B0=ED=9A=8CAPI(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/airbnb/Service/RoomService.java | 15 ++++++++++--- .../airbnb/controller/RoomController.java | 4 ++-- BE/src/main/java/airbnb/dao/RoomDao.java | 22 ++++++++++++++----- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/BE/src/main/java/airbnb/Service/RoomService.java b/BE/src/main/java/airbnb/Service/RoomService.java index 4c7dd9d2c..58222315f 100644 --- a/BE/src/main/java/airbnb/Service/RoomService.java +++ b/BE/src/main/java/airbnb/Service/RoomService.java @@ -2,11 +2,14 @@ import airbnb.dao.RoomDao; import airbnb.domain.Room; +import airbnb.dto.PriceRequest; +import airbnb.dto.RoomSearchRequest; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Service public class RoomService { @@ -17,11 +20,17 @@ public RoomService(RoomDao roomDao) { this.roomDao = roomDao; } - public List findAllRoomPrice(){ - return roomDao.findAllPrice(); + public List findAllRoomPrice() { + List rooms = findAll(); + return rooms.stream().map(Room::getPrice).sorted().collect(Collectors.toList()); } - public List findAll(){ + public List findAll() { return roomDao.findAll(); } + + public List findSearchRoomPrice(PriceRequest priceRequest){ + List rooms = roomDao.findByCityIdAndSchedule(priceRequest.getCityId(),priceRequest.getSchedule()); + return rooms.stream().map(Room::getPrice).sorted().collect(Collectors.toList()); + } } diff --git a/BE/src/main/java/airbnb/controller/RoomController.java b/BE/src/main/java/airbnb/controller/RoomController.java index 4e576f964..604d6a421 100644 --- a/BE/src/main/java/airbnb/controller/RoomController.java +++ b/BE/src/main/java/airbnb/controller/RoomController.java @@ -35,8 +35,8 @@ public List test(){ } @PostMapping("/price") - public PriceRequest postTest(@RequestBody PriceRequest priceRequest){ - return priceRequest; + public PricesWrapper postTest(@RequestBody PriceRequest priceRequest){ + return new PricesWrapper(roomService.findSearchRoomPrice(priceRequest)); } @PostMapping diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java index 756fd1b52..b743b2b81 100644 --- a/BE/src/main/java/airbnb/dao/RoomDao.java +++ b/BE/src/main/java/airbnb/dao/RoomDao.java @@ -2,8 +2,10 @@ import airbnb.domain.City; import airbnb.domain.Room; +import airbnb.domain.Schedule; import airbnb.mapper.ImageMapper; import airbnb.mapper.RoomMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; @@ -26,16 +28,26 @@ public RoomDao(NamedParameterJdbcTemplate jdbcTemplate, ImageDao imageDao) { this.imageDao = imageDao; } - public List findAll(){ + public List findAll() { String sql = "SELECT id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room"; List rooms = jdbcTemplate.query(sql, roomMapper); rooms.forEach(room -> room.setImages(imageDao.findByRoomId(room.getId()))); return rooms; } - public List findAllPrice(){ - String sql = "SELECT id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room "; - List rooms = jdbcTemplate.query(sql, roomMapper); - return rooms.stream().map(Room::getPrice).sorted().collect(Collectors.toList()); + public List findByCityIdAndSchedule(Long cityId, Schedule schedule) { + String sql = "SELECT id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room " + + "WHERE city_id = :cityId AND (check_in >= :checkOut OR check_out <= :checkIn)"; + LocalDate chekIn = schedule.getCheckIn(); + LocalDate chekOut = schedule.getCheckOut(); + + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("cityId", cityId); + parameter.addValue("checkIn", chekIn); + parameter.addValue("checkOut", chekOut); + + List rooms = jdbcTemplate.query(sql, parameter, roomMapper); + rooms.forEach(room -> room.setImages(imageDao.findByRoomId(room.getId()))); + return rooms; } } From 27a0c669459b3fd1ddc1dd8096b5ce0aec22ec34 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 27 May 2021 14:48:50 +0900 Subject: [PATCH 110/117] =?UTF-8?q?feat:=20=E2=9C=A8=EC=8A=A4=EC=BC=80?= =?UTF-8?q?=EC=A5=B4=EC=97=90=20=EB=94=B0=EB=9D=BC=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=9C=20=EC=88=99=EC=86=8C=20=EC=A1=B0=ED=9A=8C=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/airbnb/dao/RoomDao.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java index b743b2b81..c02550c86 100644 --- a/BE/src/main/java/airbnb/dao/RoomDao.java +++ b/BE/src/main/java/airbnb/dao/RoomDao.java @@ -36,8 +36,8 @@ public List findAll() { } public List findByCityIdAndSchedule(Long cityId, Schedule schedule) { - String sql = "SELECT id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room " + - "WHERE city_id = :cityId AND (check_in >= :checkOut OR check_out <= :checkIn)"; + String sql = "SELECT a.id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room AS a left join reservation AS b ON a.id = b.room_id " + + "WHERE b.id IS NULL OR ((b.check_in NOT BETWEEN :checkIn AND :checkOut) AND (b.check_out NOT BETWEEN :checkIn AND :checkOut))"; LocalDate chekIn = schedule.getCheckIn(); LocalDate chekOut = schedule.getCheckOut(); From 0b544cda779e93fbac19d26f6dec618c595e2c5d Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 27 May 2021 15:03:51 +0900 Subject: [PATCH 111/117] =?UTF-8?q?feat:=20=E2=9C=A8=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EC=97=90=20=EA=B2=80=EC=83=89=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?=EC=88=99=EC=86=8C=20=EC=A1=B0=ED=9A=8C=20API=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가격 범위 - 최대 인원 - 도시 - 체크인 체크아웃 --- BE/src/main/java/airbnb/dao/RoomDao.java | 29 ++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java index c02550c86..800b6613b 100644 --- a/BE/src/main/java/airbnb/dao/RoomDao.java +++ b/BE/src/main/java/airbnb/dao/RoomDao.java @@ -1,6 +1,7 @@ package airbnb.dao; import airbnb.domain.City; +import airbnb.domain.Cost; import airbnb.domain.Room; import airbnb.domain.Schedule; import airbnb.mapper.ImageMapper; @@ -20,8 +21,9 @@ public class RoomDao { private final NamedParameterJdbcTemplate jdbcTemplate; - private final RoomMapper roomMapper = new RoomMapper(); private final ImageDao imageDao; + private final RoomMapper roomMapper = new RoomMapper(); + private final MapSqlParameterSource parameter = new MapSqlParameterSource(); public RoomDao(NamedParameterJdbcTemplate jdbcTemplate, ImageDao imageDao) { this.jdbcTemplate = jdbcTemplate; @@ -41,10 +43,33 @@ public List findByCityIdAndSchedule(Long cityId, Schedule schedule) { LocalDate chekIn = schedule.getCheckIn(); LocalDate chekOut = schedule.getCheckOut(); - MapSqlParameterSource parameter = new MapSqlParameterSource(); + + parameter.addValue("cityId", cityId); + parameter.addValue("checkIn", chekIn); + parameter.addValue("checkOut", chekOut); + + List rooms = jdbcTemplate.query(sql, parameter, roomMapper); + rooms.forEach(room -> room.setImages(imageDao.findByRoomId(room.getId()))); + return rooms; + } + + public List findSearchRooms(Long cityId, Schedule schedule, Cost cost, int maxPeopleCount){ + String sql = "SELECT a.id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room AS a left join reservation AS b ON a.id = b.room_id " + + "WHERE (b.id IS NULL OR ((b.check_in NOT BETWEEN :checkIn AND :checkOut) AND (b.check_out NOT BETWEEN :checkIn AND :checkOut))) " + + "AND (a.price between :minCost AND :maxCost) " + + "AND (a.people >= :maxPeopleCount"; + + LocalDate chekIn = schedule.getCheckIn(); + LocalDate chekOut = schedule.getCheckOut(); + int minCost = cost.getMinCost(); + int maxCost = cost.getMaxCost(); + parameter.addValue("cityId", cityId); parameter.addValue("checkIn", chekIn); parameter.addValue("checkOut", chekOut); + parameter.addValue("minCost", minCost); + parameter.addValue("maxCost", maxCost); + parameter.addValue("maxPeopleCount", maxPeopleCount); List rooms = jdbcTemplate.query(sql, parameter, roomMapper); rooms.forEach(room -> room.setImages(imageDao.findByRoomId(room.getId()))); From de64080a820a43cd807272c1a5557d5130cb83cd Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 27 May 2021 15:57:58 +0900 Subject: [PATCH 112/117] =?UTF-8?q?feat:=20=E2=9C=A8=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EC=97=90=20=EA=B2=80=EC=83=89=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?=EC=88=99=EC=86=8C=20=EC=A1=B0=ED=9A=8C=20API=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가격 범위 - 최대 인원 - 도시 - 체크인 체크아웃 --- .../main/java/airbnb/Service/RoomService.java | 13 +++-- .../airbnb/controller/RoomController.java | 19 ++----- BE/src/main/java/airbnb/dao/ImageDao.java | 2 +- BE/src/main/java/airbnb/dao/RoomDao.java | 9 +-- BE/src/main/java/airbnb/domain/Cost.java | 2 +- BE/src/main/java/airbnb/domain/Room.java | 12 ++++ BE/src/main/java/airbnb/domain/Tax.java | 4 +- .../main/java/airbnb/dto/ImageResponse.java | 9 ++- BE/src/main/java/airbnb/dto/RoomResponse.java | 57 +++++++++++++++++++ .../java/airbnb/dto/RoomSearchRequest.java | 2 +- .../main/java/airbnb/mapper/RoomMapper.java | 4 +- 11 files changed, 103 insertions(+), 30 deletions(-) diff --git a/BE/src/main/java/airbnb/Service/RoomService.java b/BE/src/main/java/airbnb/Service/RoomService.java index 58222315f..d18d3365e 100644 --- a/BE/src/main/java/airbnb/Service/RoomService.java +++ b/BE/src/main/java/airbnb/Service/RoomService.java @@ -3,12 +3,11 @@ import airbnb.dao.RoomDao; import airbnb.domain.Room; import airbnb.dto.PriceRequest; +import airbnb.dto.RoomResponse; import airbnb.dto.RoomSearchRequest; import org.springframework.stereotype.Service; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; @Service @@ -29,8 +28,14 @@ public List findAll() { return roomDao.findAll(); } - public List findSearchRoomPrice(PriceRequest priceRequest){ - List rooms = roomDao.findByCityIdAndSchedule(priceRequest.getCityId(),priceRequest.getSchedule()); + public List findSearchRoomPrice(PriceRequest priceRequest) { + List rooms = roomDao.findByCityIdAndSchedule(priceRequest.getCityId(), priceRequest.getSchedule()); return rooms.stream().map(Room::getPrice).sorted().collect(Collectors.toList()); } + + public List SearchRoomToRoomResponseList(RoomSearchRequest roomSearchRequest) { + List rooms = roomDao.findSearchRooms(roomSearchRequest.getCityId(), roomSearchRequest.getSchedule(), + roomSearchRequest.getCost(), roomSearchRequest.getMaxPersonCount()); + return rooms.stream().map(RoomResponse::of).collect(Collectors.toList()); + } } diff --git a/BE/src/main/java/airbnb/controller/RoomController.java b/BE/src/main/java/airbnb/controller/RoomController.java index 604d6a421..2342be331 100644 --- a/BE/src/main/java/airbnb/controller/RoomController.java +++ b/BE/src/main/java/airbnb/controller/RoomController.java @@ -5,6 +5,7 @@ import airbnb.dto.PriceRequest; import airbnb.dto.RoomSearchRequest; import airbnb.wrapper.PricesWrapper; +import airbnb.wrapper.RoomResponseWrapper; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -20,27 +21,17 @@ public RoomController(RoomService roomService) { } @GetMapping("/price") - public PricesWrapper readAllRoomPrices(){ + public PricesWrapper readAllRoomPrices() { return new PricesWrapper(roomService.findAllRoomPrice()); } -// @PostMapping("/price") -// public PricesWrapper readPrices(@RequestBody PriceRequest priceRequest){ -// return new PricesWrapper(roomService.findSearchRoomsPrices(priceRequest)); -// } - - @GetMapping("/test") - public List test(){ - return roomService.findAll(); - } - @PostMapping("/price") - public PricesWrapper postTest(@RequestBody PriceRequest priceRequest){ + public PricesWrapper readSearchRoomPrices(@RequestBody PriceRequest priceRequest) { return new PricesWrapper(roomService.findSearchRoomPrice(priceRequest)); } @PostMapping - public RoomSearchRequest searchRequest(@RequestBody RoomSearchRequest roomSearchRequest){ - return roomSearchRequest; + public RoomResponseWrapper searchRooms(@RequestBody RoomSearchRequest roomSearchRequest) { + return new RoomResponseWrapper(roomService.SearchRoomToRoomResponseList(roomSearchRequest)); } } diff --git a/BE/src/main/java/airbnb/dao/ImageDao.java b/BE/src/main/java/airbnb/dao/ImageDao.java index 91f6ce55d..aa666d481 100644 --- a/BE/src/main/java/airbnb/dao/ImageDao.java +++ b/BE/src/main/java/airbnb/dao/ImageDao.java @@ -44,7 +44,7 @@ public List findByType(String imageType) { public List findByRoomId(Long roomId) { String sql = "SELECT id, url, room_id, city_id, category_id, image_type FROM image " + - "WHERE room_id = :roomId"; + "WHERE room_id = :roomId ORDER BY FIELD(image_type, 'MAIN', 'DETAIL')"; MapSqlParameterSource parameter = new MapSqlParameterSource(); parameter.addValue("roomId", roomId); return jdbcTemplate.query(sql, parameter, imageMapper); diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java index 800b6613b..9691d172b 100644 --- a/BE/src/main/java/airbnb/dao/RoomDao.java +++ b/BE/src/main/java/airbnb/dao/RoomDao.java @@ -39,11 +39,11 @@ public List findAll() { public List findByCityIdAndSchedule(Long cityId, Schedule schedule) { String sql = "SELECT a.id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room AS a left join reservation AS b ON a.id = b.room_id " + - "WHERE b.id IS NULL OR ((b.check_in NOT BETWEEN :checkIn AND :checkOut) AND (b.check_out NOT BETWEEN :checkIn AND :checkOut))"; + "WHERE (b.id IS NULL OR ((b.check_in NOT BETWEEN :checkIn AND :checkOut) AND (b.check_out NOT BETWEEN :checkIn AND :checkOut)))" + + "AND (a.city_id = :cityId)"; LocalDate chekIn = schedule.getCheckIn(); LocalDate chekOut = schedule.getCheckOut(); - parameter.addValue("cityId", cityId); parameter.addValue("checkIn", chekIn); parameter.addValue("checkOut", chekOut); @@ -53,11 +53,12 @@ public List findByCityIdAndSchedule(Long cityId, Schedule schedule) { return rooms; } - public List findSearchRooms(Long cityId, Schedule schedule, Cost cost, int maxPeopleCount){ + public List findSearchRooms(Long cityId, Schedule schedule, Cost cost, int maxPeopleCount) { String sql = "SELECT a.id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room AS a left join reservation AS b ON a.id = b.room_id " + "WHERE (b.id IS NULL OR ((b.check_in NOT BETWEEN :checkIn AND :checkOut) AND (b.check_out NOT BETWEEN :checkIn AND :checkOut))) " + "AND (a.price between :minCost AND :maxCost) " + - "AND (a.people >= :maxPeopleCount"; + "AND (a.people <= :maxPeopleCount) " + + "AND (a.city_id = :cityId)"; LocalDate chekIn = schedule.getCheckIn(); LocalDate chekOut = schedule.getCheckOut(); diff --git a/BE/src/main/java/airbnb/domain/Cost.java b/BE/src/main/java/airbnb/domain/Cost.java index e1bef389c..5c749caac 100644 --- a/BE/src/main/java/airbnb/domain/Cost.java +++ b/BE/src/main/java/airbnb/domain/Cost.java @@ -5,7 +5,7 @@ public class Cost { @JsonProperty(value = "max") private int maxCost; - @JsonProperty(value ="min") + @JsonProperty(value = "min") private int minCost; public Cost(int maxPrice, int minPrice) { diff --git a/BE/src/main/java/airbnb/domain/Room.java b/BE/src/main/java/airbnb/domain/Room.java index df7ed7c57..02e2d43cf 100644 --- a/BE/src/main/java/airbnb/domain/Room.java +++ b/BE/src/main/java/airbnb/domain/Room.java @@ -14,6 +14,7 @@ public class Room { private RoomDetail roomDetail; private Tax tax; private List images; + private int maxPeopleCount; private Room(Builder builder) { this.id = builder.id; @@ -22,6 +23,7 @@ private Room(Builder builder) { this.description = builder.description; this.roomDetail = builder.roomDetail; this.tax = builder.tax; + this.maxPeopleCount = builder.maxPeopleCount; } public static class Builder { @@ -33,6 +35,7 @@ public static class Builder { private String description; private RoomDetail roomDetail; private Tax tax; + private int maxPeopleCount; public Builder(Long id) { this.id = id; @@ -63,6 +66,11 @@ public Builder tax(Tax tax) { return this; } + public Builder maxPeopleCount(int maxPeopleCount) { + this.maxPeopleCount = maxPeopleCount; + return this; + } + public Room build() { return new Room(this); } @@ -96,6 +104,10 @@ public List getImages() { return images; } + public int getMaxPeopleCount() { + return maxPeopleCount; + } + public void setImages(List images) { this.images = images; } diff --git a/BE/src/main/java/airbnb/domain/Tax.java b/BE/src/main/java/airbnb/domain/Tax.java index a69a6b4cd..1a9d84b9e 100644 --- a/BE/src/main/java/airbnb/domain/Tax.java +++ b/BE/src/main/java/airbnb/domain/Tax.java @@ -23,7 +23,7 @@ public int getAccommodationTax() { return accommodationTax; } - public static Tax of (int cleanTax, int price){ - return new Tax (cleanTax, (int)Math.round(price*0.15), (int)Math.round(price*0.015)); + public static Tax of(int cleanTax, int price) { + return new Tax(cleanTax, (int) Math.round(price * 0.15), (int) Math.round(price * 0.015)); } } diff --git a/BE/src/main/java/airbnb/dto/ImageResponse.java b/BE/src/main/java/airbnb/dto/ImageResponse.java index 2c5402879..c18f517e2 100644 --- a/BE/src/main/java/airbnb/dto/ImageResponse.java +++ b/BE/src/main/java/airbnb/dto/ImageResponse.java @@ -1,8 +1,10 @@ package airbnb.dto; +import airbnb.domain.Image; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; +import java.util.stream.Collectors; public class ImageResponse { @@ -12,8 +14,13 @@ public class ImageResponse { @JsonProperty(value = "detailImage") private List detailImageUrls; - public ImageResponse(String mainImageUrl, List detailImageUrls) { + private ImageResponse(String mainImageUrl, List detailImageUrls) { this.mainImageUrl = mainImageUrl; this.detailImageUrls = detailImageUrls; } + + public static ImageResponse of(List images) { + List imageUrls = images.stream().map(Image::getUrl).collect(Collectors.toList()); + return new ImageResponse(imageUrls.get(0), imageUrls); + } } diff --git a/BE/src/main/java/airbnb/dto/RoomResponse.java b/BE/src/main/java/airbnb/dto/RoomResponse.java index 41cc22a85..b0ab88a7f 100644 --- a/BE/src/main/java/airbnb/dto/RoomResponse.java +++ b/BE/src/main/java/airbnb/dto/RoomResponse.java @@ -1,5 +1,6 @@ package airbnb.dto; +import airbnb.domain.Room; import airbnb.domain.RoomDetail; import airbnb.domain.Tax; import com.fasterxml.jackson.annotation.JsonProperty; @@ -16,6 +17,9 @@ public class RoomResponse { private final int reviewCount; private final Tax tax; + @JsonProperty(value = "people") + private final int maxPeopleCount; + @JsonProperty(value = "detail") private final RoomDetail roomDetail; @@ -30,6 +34,7 @@ private RoomResponse(Builder builder) { this.reviewCount = builder.reviewCount; this.tax = builder.tax; this.roomDetail = builder.roomDetail; + this.maxPeopleCount = builder.maxPeopleCount; } public static class Builder { @@ -43,6 +48,7 @@ public static class Builder { private Tax tax; private Host host; private RoomDetail roomDetail; + private int maxPeopleCount; public Builder roomId(Long roomId) { this.roomId = roomId; @@ -94,8 +100,59 @@ public Builder roomDetail(RoomDetail roomDetail) { return this; } + public Builder maxPeopleCount(int maxPeopleCount) { + this.maxPeopleCount = maxPeopleCount; + return this; + } + public RoomResponse build() { return new RoomResponse(this); } } + + public Long getRoomId() { + return roomId; + } + + public int getPrice() { + return price; + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public Host getHost() { + return host; + } + + public ImageResponse getImages() { + return images; + } + + public int getGrade() { + return grade; + } + + public int getReviewCount() { + return reviewCount; + } + + public Tax getTax() { + return tax; + } + + public RoomDetail getRoomDetail() { + return roomDetail; + } + + public static RoomResponse of(Room room) { + return new Builder().roomId(room.getId()).price(room.getPrice()).title(room.getTitle()) + .description(room.getDescription()).maxPeopleCount(room.getMaxPeopleCount()).tax(room.getTax()) + .roomDetail(room.getRoomDetail()).images(ImageResponse.of(room.getImages())).build(); + } } diff --git a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java index a6412c417..b5b0de0a2 100644 --- a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java +++ b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java @@ -34,7 +34,7 @@ public Schedule getSchedule() { return schedule; } - public Cost getPrice() { + public Cost getCost() { return cost; } } diff --git a/BE/src/main/java/airbnb/mapper/RoomMapper.java b/BE/src/main/java/airbnb/mapper/RoomMapper.java index 886f66068..56c1cbe93 100644 --- a/BE/src/main/java/airbnb/mapper/RoomMapper.java +++ b/BE/src/main/java/airbnb/mapper/RoomMapper.java @@ -10,8 +10,8 @@ public class RoomMapper implements RowMapper { @Override public Room mapRow(ResultSet rs, int rowNum) throws SQLException { return new Room.Builder(rs.getLong("id")).price(rs.getInt("price")) - .title(rs.getString("title")).description(rs.getString("description")) - .roomDetail(createRoomDetail(rs)).tax(Tax.of(rs.getInt("clean_tax"),rs.getInt("price"))).build(); + .title(rs.getString("title")).description(rs.getString("description")).maxPeopleCount(rs.getInt("people")) + .roomDetail(createRoomDetail(rs)).tax(Tax.of(rs.getInt("clean_tax"), rs.getInt("price"))).build(); } private RoomDetail createRoomDetail(ResultSet rs) throws SQLException { From badc1fe921002709c82246c2edb94107773e4042 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 27 May 2021 16:16:32 +0900 Subject: [PATCH 113/117] =?UTF-8?q?feat:=20=E2=9C=A8DETAIL=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=82=BD=EC=9E=85(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/data.sql | 52 ++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/BE/src/main/resources/data.sql b/BE/src/main/resources/data.sql index 729040d85..a804296c6 100644 --- a/BE/src/main/resources/data.sql +++ b/BE/src/main/resources/data.sql @@ -36,34 +36,70 @@ values ('https://a0.muscache.com/im/pictures/c45d08e5-f560-44f0-83fc-83290ccd167 ('https://a0.muscache.com/im/pictures/a63a845b-c16e-4a0f-b0ca-a124a677b3d2.jpg?im_w=1200', 'MAIN', 7), ('https://a0.muscache.com/im/pictures/miso/Hosting-47897490/original/b0238603-d063-4f5c-9e10-c835132669e4.jpeg?im_w=1200', 'MAIN', 8); +INSERT INTO image(url,image_type, room_id) +values ('https://a0.muscache.com/im/pictures/41ee09fc-eddb-49c5-a3b4-ae2caacaf759.jpg?im_w=720', 'DETAIL', 1), + ('https://a0.muscache.com/im/pictures/e3258341-b4f3-4988-b958-bec903936a0b.jpg?im_w=720', 'DETAIL', 1), + ('https://a0.muscache.com/im/pictures/adca4292-084c-45a2-a9c5-1e4679ba81fe.jpg?im_w=720', 'DETAIL', 1), + ('https://a0.muscache.com/im/pictures/a13322a6-c136-4df0-9a10-348dd91a926c.jpg?im_w=720', 'DETAIL', 1), + ('https://a0.muscache.com/im/pictures/ecf38b8f-9986-4a66-99de-4273e12942f7.jpg?im_w=720', 'DETAIL', 2), + ('https://a0.muscache.com/im/pictures/b7aea036-c13b-4cbd-9472-24832c3360d9.jpg?im_w=720', 'DETAIL', 2), + ('https://a0.muscache.com/im/pictures/4210eef3-ae67-488b-bc8d-d55f8fe690dc.jpg?im_w=720', 'DETAIL', 2), + ('https://a0.muscache.com/im/pictures/de1c13f8-554b-4abb-9fa6-98299a10f67c.jpg?im_w=720', 'DETAIL', 2), + ('https://a0.muscache.com/im/pictures/miso/Hosting-44159716/original/c6c1a442-b449-495a-8ee9-f1779f36b5b4.jpeg?im_w=720', 'DETAIL', 3), + ('https://a0.muscache.com/im/pictures/miso/Hosting-44159716/original/66bd535a-ba05-43e7-adbe-6953bbc13da5.jpeg?im_w=720', 'DETAIL', 3), + ('https://a0.muscache.com/im/pictures/miso/Hosting-44159716/original/d1857908-90c8-48fd-9e68-a743187664ed.jpeg?im_w=720', 'DETAIL', 3), + ('https://a0.muscache.com/im/pictures/39b76268-042e-4a89-aa3b-89abe9865c58.jpg?im_w=720', 'DETAIL', 3), + ('https://a0.muscache.com/im/pictures/063465ea-3f1f-4b83-b0b4-75952fc4c424.jpg?im_w=720', 'DETAIL', 4), + ('https://a0.muscache.com/im/pictures/dddaa2fd-78a9-4105-92cd-bfefebe65d5f.jpg?im_w=720', 'DETAIL', 4), + ('https://a0.muscache.com/im/pictures/c1c9e49b-2e5a-47e5-bda8-95390cfde907.jpg?im_w=720', 'DETAIL', 4), + ('https://a0.muscache.com/im/pictures/800c7310-bf61-4fac-a248-06cdc7081629.jpg?im_w=720', 'DETAIL', 4), + ('https://a0.muscache.com/im/pictures/miso/Hosting-44090615/original/c5f66ab8-24fe-479d-8b67-a512176ddbef.jpeg?im_w=720', 'DETAIL', 5), + ('https://a0.muscache.com/im/pictures/miso/Hosting-44090615/original/149e034a-2716-4bb2-8561-a7ccede18571.jpeg?im_w=720', 'DETAIL', 5), + ('https://a0.muscache.com/im/pictures/02b368b7-63b0-4748-847f-bf5a81c08dd5.jpg?im_w=720', 'DETAIL', 5), + ('https://a0.muscache.com/im/pictures/58b752dd-8143-4636-83ce-09ebe235683f.jpg?im_w=720', 'DETAIL', 5), + ('https://a0.muscache.com/im/pictures/miso/Hosting-47435529/original/08d1c75c-4a6b-423e-a908-a624419f4cf6.jpeg?im_w=720', 'DETAIL', 6), + ('https://a0.muscache.com/im/pictures/miso/Hosting-47435529/original/7c29ac12-fd28-4b6a-a40d-bf193a418c57.jpeg?im_w=720', 'DETAIL', 6), + ('https://a0.muscache.com/im/pictures/miso/Hosting-47435529/original/a15d42b5-c8c9-47a1-aee6-627fcb64bb9f.jpeg?im_w=720', 'DETAIL', 6), + ('https://a0.muscache.com/im/pictures/miso/Hosting-47435529/original/2fe6bde7-9e85-4fb2-bbc6-e1cd780b5679.jpeg?im_w=720', 'DETAIL', 6), + ('https://a0.muscache.com/im/pictures/44ae81dc-e8a9-4623-bccd-97af889a8b16.jpg?im_w=720', 'DETAIL', 7), + ('https://a0.muscache.com/im/pictures/61b3e6ed-a29f-44a0-8edb-f6985bf2aa62.jpg?im_w=720', 'DETAIL', 7), + ('https://a0.muscache.com/im/pictures/92bc9188-4c09-40dc-9984-b38a6f1fa70a.jpg?im_w=720', 'DETAIL', 7), + ('https://a0.muscache.com/im/pictures/50e7a497-3675-4e66-b487-db58f4e5d6c3.jpg?im_w=720', 'DETAIL', 7), + ('https://a0.muscache.com/im/pictures/miso/Hosting-47897490/original/56311d70-1328-4f37-bd10-15ef43f576c2.jpeg?im_w=720', 'DETAIL', 8), + ('https://a0.muscache.com/im/pictures/3be5bd86-f7fe-46d8-80ba-d138cf920df5.jpg?im_w=720', 'DETAIL', 8), + ('https://a0.muscache.com/im/pictures/ef4e5dfc-4da9-4101-ae90-5ad2aaab3c77.jpg?im_w=720', 'DETAIL', 8), + ('https://a0.muscache.com/im/pictures/1a5e31a5-7b1e-4276-9751-8f1a308dd324.jpg?im_w=720', 'DETAIL', 8); + + + INSERT INTO room(cost, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax, city_id, category_id) -values (150000, '이태원에 아늑한 숙소 Y 하우스', '이태원역에서 도보로 4분거리에 위치하고 있고 대로변에서 상당히 가까운 지역에 위치하여 여성분들도 안전하게 머무시며 이태원을 만끽하실 수 있으세요.' +values (153200, '이태원에 아늑한 숙소 Y 하우스', '이태원역에서 도보로 4분거리에 위치하고 있고 대로변에서 상당히 가까운 지역에 위치하여 여성분들도 안전하게 머무시며 이태원을 만끽하실 수 있으세요.' , 2, false, 2, 1, true, true, true, 25000, 1, 1), - (200000, '강남역 1번 출구 바로 옆 편리하고 깔끔한 숙소', '- 전철까지 도보 30초 + (223000, '강남역 1번 출구 바로 옆 편리하고 깔끔한 숙소', '- 전철까지 도보 30초 - 침구로 매번 깨끗이 교체 - 18층으로 좋은 전망 - 세탁기 + 건조기 - 지하창고에 짐 보관 무료 - 주차는 1시간에 1000원으로 꼭 미리 문의 주셔야합니다' , 3, false, 3, 1, true, true, true, 22000, 1, 1), - (300000, '1호선 제기동 역에서 부터 도보로 30초거리에 위치' , '1. 1호선 제기동 역에서 부터 도보로 30초거리에 위치하고 있어 접근성이 훌륭합니다. + (345300, '1호선 제기동 역에서 부터 도보로 30초거리에 위치' , '1. 1호선 제기동 역에서 부터 도보로 30초거리에 위치하고 있어 접근성이 훌륭합니다. 2. 모든 가구와 인테리어가 새것이라 매우 청결합니다. 3. 퀸사이즈 침대가 설치되어 있어 매우 편한 수면을 취할 수 있습니다. 4. 스마트 티비가 있습니다. 다양한 채널의 TV는 물론 본인 계정의 유튜브, 넷플릭스 계정을 연결하여 시청 할 수 있습니다. 5. 고급형 접이식 식탁이 있어서 공간을 유용하게 사용 할 수 있습니다. 6. 최신형 공기청정기가 있어 쾌적한 공기를 유지합니다. 7. 게스트분들의 피드백으로 전자레인지가 추가 되었습니다.', 3, false, 3, 1, true, true, true, 23000, 1, 2), - (250000, '뷰가 너무 좋은 숙소', '본 숙소는 친구, 지인들과의 모임장소나 회포를 풀고 생일파티를 하는 등 밤 늦게까지 술를 마시는 장소로는 적합하지 않습니다. 만약 그런 이유로 민원이 발생할경우 바로 퇴실조치 하겠습니다.', + (53400, '뷰가 너무 좋은 숙소', '본 숙소는 친구, 지인들과의 모임장소나 회포를 풀고 생일파티를 하는 등 밤 늦게까지 술를 마시는 장소로는 적합하지 않습니다. 만약 그런 이유로 민원이 발생할경우 바로 퇴실조치 하겠습니다.', 4, false, 3, 2, true, true, true, 18000, 1, 3), - (300000, '자가격리만 전문으로 하는 숙소입니다 :-)', '호텔에서 쓰는 40수 프리미엄 침구류로 이불, 배게 쾌적한 환경을 자랑합니다. + (72500, '자가격리만 전문으로 하는 숙소입니다 :-)', '호텔에서 쓰는 40수 프리미엄 침구류로 이불, 배게 쾌적한 환경을 자랑합니다. 빔프로젝터(넷플릭스&왓챠 등), WIFI 가능 식사를 위한 인덕션, 후라이팬, 냄비, 조리도구, 접시 등 모든 취사에 필요한 도구들이 준비되어 있습니다.' , 2, true, 2, 1, true, true, true, 20100, 1, 2), - (150000, '스마트 숙소관리 프리모(Premo)를 사용할 수 있는 AI 숙소', '-비대면 언택트 스마트 도어락 사용 + (85100, '스마트 숙소관리 프리모(Premo)를 사용할 수 있는 AI 숙소', '-비대면 언택트 스마트 도어락 사용 -일회용 비밀번호 사용으로 안전합니다. ▶응암역(6호선) 도보 7분 내외 ▶신축 / 엘레베이터 ▶이마트 도보 2분' , 3, false, 2, 1, true, true, true, 23000, 1, 3), - (150000, '당산역 1분거리에 있는 고층아파트', '무료주차(입.출차 1회제공) + (153000, '당산역 1분거리에 있는 고층아파트', '무료주차(입.출차 1회제공) 빌트인가구와 퀸침대 55인치 tv sk인터넷,tv, 와이파이제공 선유도와 여의도한강공원산책가능', 2, true, 2, 1, true, true, true, 20000, 1, 1), - (400000, '어반스테이 더 남산', '말이 필요없다 일단 와라!!!', 4, false, 4, 2, true, true, true, 30000, 1, 4); + (418000, '어반스테이 더 남산', '말이 필요없다 일단 와라!!!', 4, false, 4, 2, true, true, true, 30000, 1, 4); From 12e6e5543b2025a93e52e33ec87561077858717b Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 27 May 2021 16:21:39 +0900 Subject: [PATCH 114/117] =?UTF-8?q?feat:=20=E2=9C=A8=EC=98=88=EC=95=BD=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=82=BD=EC=9E=85(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/data.sql | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/BE/src/main/resources/data.sql b/BE/src/main/resources/data.sql index a804296c6..a4e3d4fa8 100644 --- a/BE/src/main/resources/data.sql +++ b/BE/src/main/resources/data.sql @@ -103,3 +103,8 @@ values (153200, '이태원에 아늑한 숙소 Y 하우스', '이태원역에서 sk인터넷,tv, 와이파이제공 선유도와 여의도한강공원산책가능', 2, true, 2, 1, true, true, true, 20000, 1, 1), (418000, '어반스테이 더 남산', '말이 필요없다 일단 와라!!!', 4, false, 4, 2, true, true, true, 30000, 1, 4); + +INSERT INTO reservation(room_id, check_in, check_out) +values (1, '2021-05-27', '2021-05-28'), + (2, '2021-06-02', '2021-06-07'), + (5, '2021-05-30', '2021-06-10'); From 34de3daa14c176781a841af635df5b3f9e6eb46e Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 27 May 2021 16:24:17 +0900 Subject: [PATCH 115/117] =?UTF-8?q?feat:=20=E2=9C=A8CORS=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GET , POST만 접근 가능 --- BE/src/main/java/airbnb/config/WebConfig.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 BE/src/main/java/airbnb/config/WebConfig.java diff --git a/BE/src/main/java/airbnb/config/WebConfig.java b/BE/src/main/java/airbnb/config/WebConfig.java new file mode 100644 index 000000000..f715726a0 --- /dev/null +++ b/BE/src/main/java/airbnb/config/WebConfig.java @@ -0,0 +1,16 @@ +package airbnb.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("GET", "POST"); + } +} + From e50717f74bf2adb83b33447402c86c7bc5f28d78 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Thu, 27 May 2021 16:36:42 +0900 Subject: [PATCH 116/117] =?UTF-8?q?chore:=20=F0=9F=94=A7=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EB=AA=85=20=EB=B3=80=EA=B2=BD(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 최대 인원이 아닌 예약 인원을 받으므로 maxPeopleCount에서 resrvationPeopleCount으로 변경 --- BE/src/main/java/airbnb/Service/RoomService.java | 2 +- BE/src/main/java/airbnb/dao/RoomDao.java | 6 +++--- BE/src/main/java/airbnb/dto/RoomSearchRequest.java | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/BE/src/main/java/airbnb/Service/RoomService.java b/BE/src/main/java/airbnb/Service/RoomService.java index d18d3365e..f59f032db 100644 --- a/BE/src/main/java/airbnb/Service/RoomService.java +++ b/BE/src/main/java/airbnb/Service/RoomService.java @@ -35,7 +35,7 @@ public List findSearchRoomPrice(PriceRequest priceRequest) { public List SearchRoomToRoomResponseList(RoomSearchRequest roomSearchRequest) { List rooms = roomDao.findSearchRooms(roomSearchRequest.getCityId(), roomSearchRequest.getSchedule(), - roomSearchRequest.getCost(), roomSearchRequest.getMaxPersonCount()); + roomSearchRequest.getCost(), roomSearchRequest.getReservationPeopleCount()); return rooms.stream().map(RoomResponse::of).collect(Collectors.toList()); } } diff --git a/BE/src/main/java/airbnb/dao/RoomDao.java b/BE/src/main/java/airbnb/dao/RoomDao.java index 9691d172b..99857079f 100644 --- a/BE/src/main/java/airbnb/dao/RoomDao.java +++ b/BE/src/main/java/airbnb/dao/RoomDao.java @@ -53,11 +53,11 @@ public List findByCityIdAndSchedule(Long cityId, Schedule schedule) { return rooms; } - public List findSearchRooms(Long cityId, Schedule schedule, Cost cost, int maxPeopleCount) { + public List findSearchRooms(Long cityId, Schedule schedule, Cost cost, int reservationPeopleCount) { String sql = "SELECT a.id, price, title, description, people, oneroom, bed, bath, hair_dryer, air_conditioner, wifi, clean_tax FROM room AS a left join reservation AS b ON a.id = b.room_id " + "WHERE (b.id IS NULL OR ((b.check_in NOT BETWEEN :checkIn AND :checkOut) AND (b.check_out NOT BETWEEN :checkIn AND :checkOut))) " + "AND (a.price between :minCost AND :maxCost) " + - "AND (a.people <= :maxPeopleCount) " + + "AND (a.people >= :reservationPeopleCount) " + "AND (a.city_id = :cityId)"; LocalDate chekIn = schedule.getCheckIn(); @@ -70,7 +70,7 @@ public List findSearchRooms(Long cityId, Schedule schedule, Cost cost, int parameter.addValue("checkOut", chekOut); parameter.addValue("minCost", minCost); parameter.addValue("maxCost", maxCost); - parameter.addValue("maxPeopleCount", maxPeopleCount); + parameter.addValue("reservationPeopleCount", reservationPeopleCount); List rooms = jdbcTemplate.query(sql, parameter, roomMapper); rooms.forEach(room -> room.setImages(imageDao.findByRoomId(room.getId()))); diff --git a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java index b5b0de0a2..2aaa3d4b8 100644 --- a/BE/src/main/java/airbnb/dto/RoomSearchRequest.java +++ b/BE/src/main/java/airbnb/dto/RoomSearchRequest.java @@ -13,11 +13,11 @@ public class RoomSearchRequest { private final Cost cost; @JsonProperty(value = "people") - private final int maxPersonCount; + private final int reservationPeopleCount; - public RoomSearchRequest(Long cityId, int maxPersonCount, Schedule schedule, Cost cost) { + public RoomSearchRequest(Long cityId, int reservationPeopleCount, Schedule schedule, Cost cost) { this.cityId = cityId; - this.maxPersonCount = maxPersonCount; + this.reservationPeopleCount = reservationPeopleCount; this.schedule = schedule; this.cost = cost; } @@ -26,8 +26,8 @@ public Long getCityId() { return cityId; } - public int getMaxPersonCount() { - return maxPersonCount; + public int getReservationPeopleCount() { + return reservationPeopleCount; } public Schedule getSchedule() { From 7374be7d2d973edb5268e739134958cae44ad525 Mon Sep 17 00:00:00 2001 From: 95degree <95degree@naver.com> Date: Fri, 28 May 2021 11:10:02 +0900 Subject: [PATCH 117/117] =?UTF-8?q?chore:=20=F0=9F=94=A7=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20url=20=EB=B0=9B?= =?UTF-8?q?=EC=95=84=EC=98=A4=EB=8A=94=20=EB=B6=80=EB=B6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD(#21)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 스트림 findFirst로 메인 이미지 url을 찾아오도록 로직을 변경 --- BE/src/main/java/airbnb/dto/ImageResponse.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/BE/src/main/java/airbnb/dto/ImageResponse.java b/BE/src/main/java/airbnb/dto/ImageResponse.java index c18f517e2..86ba12578 100644 --- a/BE/src/main/java/airbnb/dto/ImageResponse.java +++ b/BE/src/main/java/airbnb/dto/ImageResponse.java @@ -1,6 +1,7 @@ package airbnb.dto; import airbnb.domain.Image; +import airbnb.domain.ImageType; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; @@ -20,7 +21,9 @@ private ImageResponse(String mainImageUrl, List detailImageUrls) { } public static ImageResponse of(List images) { + String mainImageUrl = images.stream().filter(image -> ImageType.MAIN.equals(image.getImageType())).findFirst() + .orElseThrow(NullPointerException::new).getUrl(); List imageUrls = images.stream().map(Image::getUrl).collect(Collectors.toList()); - return new ImageResponse(imageUrls.get(0), imageUrls); + return new ImageResponse(mainImageUrl, imageUrls); } }