From 4979428dfcf3d005328fa7180ef1b918664ac5ee Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Mon, 17 May 2021 16:36:16 +0900 Subject: [PATCH 01/99] chore: init setting --- BE/.gitignore | 26 +++ BE/build.gradle | 27 +++ 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 | 2 + .../codesquad/airbnb/AirbnbApplication.java | 11 ++ 8 files changed, 345 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 100755 BE/gradlew create mode 100644 BE/gradlew.bat create mode 100644 BE/settings.gradle create mode 100644 BE/src/main/java/com/codesquad/airbnb/AirbnbApplication.java diff --git a/BE/.gitignore b/BE/.gitignore new file mode 100644 index 000000000..7ae016edd --- /dev/null +++ b/BE/.gitignore @@ -0,0 +1,26 @@ +.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/ \ No newline at end of file diff --git a/BE/build.gradle b/BE/build.gradle new file mode 100644 index 000000000..95aa72654 --- /dev/null +++ b/BE/build.gradle @@ -0,0 +1,27 @@ +plugins { + id 'org.springframework.boot' version '2.4.5' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'java' + id 'org.jetbrains.kotlin.jvm' version '1.4.32' +} + +group 'com.codesquad.airbnb' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '1.8' + +repositories { + mavenCentral() +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' + implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-web' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + runtimeOnly 'mysql:mysql-connector-java' +} + +test { + useJUnitPlatform() +} \ No newline at end of file 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..be52383ef --- /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.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/BE/gradlew b/BE/gradlew new file mode 100755 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..ac1b06f93 --- /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..db2f97e84 --- /dev/null +++ b/BE/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'BE' + diff --git a/BE/src/main/java/com/codesquad/airbnb/AirbnbApplication.java b/BE/src/main/java/com/codesquad/airbnb/AirbnbApplication.java new file mode 100644 index 000000000..25da7325e --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/AirbnbApplication.java @@ -0,0 +1,11 @@ +package com.codesquad.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); + } +} From a750048f25634d811108decf8c88a498fe2991c7 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 21 May 2021 12:19:44 +0900 Subject: [PATCH 02/99] feat: default domain setting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기본적으로 사용할 도메인 class들을 생성하였다. --- .../com/codesquad/airbnb/domain/Host.java | 29 ++++++++ .../com/codesquad/airbnb/domain/Location.java | 22 +++++++ .../com/codesquad/airbnb/domain/Property.java | 27 ++++++++ .../airbnb/domain/PropertyDetail.java | 66 +++++++++++++++++++ .../codesquad/airbnb/domain/Reservation.java | 6 ++ .../com/codesquad/airbnb/domain/User.java | 29 ++++++++ .../com/codesquad/airbnb/domain/WishList.java | 4 ++ 7 files changed, 183 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/Host.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/Location.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/Property.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/User.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/WishList.java diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Host.java b/BE/src/main/java/com/codesquad/airbnb/domain/Host.java new file mode 100644 index 000000000..a47e83359 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Host.java @@ -0,0 +1,29 @@ +package com.codesquad.airbnb.domain; + +import org.springframework.data.annotation.Id; + +public class Host { + + @Id + private Long id; + + private String name; + private String email; + + public Host(String name, String email) { + this.name = name; + this.email = email; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Location.java b/BE/src/main/java/com/codesquad/airbnb/domain/Location.java new file mode 100644 index 000000000..98729d168 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Location.java @@ -0,0 +1,22 @@ +package com.codesquad.airbnb.domain; + +import org.springframework.data.annotation.Id; + +public class Location { + + @Id + private Long id; + + private String name; + + public Location(String name) { + this.name = name; + } + public Long getId() { + return id; + } + + public String getName() { + return name; + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Property.java b/BE/src/main/java/com/codesquad/airbnb/domain/Property.java new file mode 100644 index 000000000..083c74cc2 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Property.java @@ -0,0 +1,27 @@ +package com.codesquad.airbnb.domain; + +import org.springframework.data.annotation.Id; + +public class Property { + + @Id + private Long id; + + private String name; + private int price; + + public Property() { + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public int getPrice() { + return price; + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java b/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java new file mode 100644 index 000000000..1ea525db9 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java @@ -0,0 +1,66 @@ +package com.codesquad.airbnb.domain; + +import org.springframework.data.annotation.Id; + +import java.time.LocalDate; + +public class PropertyDetail { + + @Id + private Long property_id; + + private String description; + private String maxOccupancy; + private int cleaningFee; + private LocalDate occupiedDate; + private int bedCount; + private int bathCount; + private String roomType; + private int reviewCount; + private double latitude; + private double longitude; + + public Long getProperty_id() { + return property_id; + } + + public String getDescription() { + return description; + } + + public String getMaxOccupancy() { + return maxOccupancy; + } + + public int getCleaningFee() { + return cleaningFee; + } + + public LocalDate getOccupiedDate() { + return occupiedDate; + } + + public int getBedCount() { + return bedCount; + } + + public int getBathCount() { + return bathCount; + } + + public String getRoomType() { + return roomType; + } + + public int getReviewCount() { + return reviewCount; + } + + public double getLatitude() { + return latitude; + } + + public double getLongitude() { + return longitude; + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java b/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java new file mode 100644 index 000000000..007653090 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java @@ -0,0 +1,6 @@ +package com.codesquad.airbnb.domain; + +public class Reservation { + + +} diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/User.java b/BE/src/main/java/com/codesquad/airbnb/domain/User.java new file mode 100644 index 000000000..39874f284 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/domain/User.java @@ -0,0 +1,29 @@ +package com.codesquad.airbnb.domain; + +public class User { + + private Long id; + + private String name; + + private String email; + + public User() {} + + public User(String name, String email) { + this.name = name; + this.email = email; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java b/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java new file mode 100644 index 000000000..13632c98a --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java @@ -0,0 +1,4 @@ +package com.codesquad.airbnb.domain; + +public class WishList { +} From 761605ee441a14eb300526b334fe0c92f24be240 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 21 May 2021 12:20:38 +0900 Subject: [PATCH 03/99] chore: init DB setting --- BE/src/main/resources/application.properties | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 BE/src/main/resources/application.properties diff --git a/BE/src/main/resources/application.properties b/BE/src/main/resources/application.properties new file mode 100644 index 000000000..20a92f671 --- /dev/null +++ b/BE/src/main/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3306/airbnb?characterEncoding=UTF-8 +spring.datasource.username=root +spring.datasource.password=codesquad1 + +logging.level.com.codesquad.airbnb.*=debug +logging.level.org.springframework.jdbc.*=trace \ No newline at end of file From 59499ed973426dc703e77053502d161a43c8b5bf Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 21 May 2021 12:22:45 +0900 Subject: [PATCH 04/99] chore: schema setting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DB에 테이블과 database를 생성하는 schema를 생성하였다. --- BE/src/main/resources/schema.sql | 75 ++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 BE/src/main/resources/schema.sql diff --git a/BE/src/main/resources/schema.sql b/BE/src/main/resources/schema.sql new file mode 100644 index 000000000..c3ca98c85 --- /dev/null +++ b/BE/src/main/resources/schema.sql @@ -0,0 +1,75 @@ +create database airbnb; +use airbnb; + +create table location +( + id BIGINT primary key auto_increment, + name varchar(45), + image varchar(255) +); + +create table property +( + id bigint primary key auto_increment, + name varchar(45), + price int, + location_id BIGINT, + foreign key (location_id) references location (id) +); + +drop table property_detail; +create table property_detail +( + property_id bigint, + description varchar(255), + max_occupancy int, + cleaning_fee int, + occupied_date date, + bed_count int, + bath_count int, + room_type varchar(45), + review_count int, + latitude double, + longitude double, + foreign key (property_id) references property (id) +); + +drop table image; +create table image +( + id BIGINT Primary Key auto_increment, + image_url varchar(1000), + name varchar(45), + property_id bigint, + foreign key (property_id) references property(id) +); + +create table user +( + id BIGINT primary key auto_increment, + name varchar(45), + email varchar(255) +); + +create table reservation +( + check_in_date datetime, + check_out_date datetime, + total_price int, + guest_count varchar(45), + user_id bigint, + property_id bigint, + foreign key (user_id) references user (id), + foreign key (property_id) references property (id) +); + +create table wish_list +( + bookmark boolean, + user_id bigint, + property_id bigint, + foreign key (user_id) references user (id), + foreign key (property_id) references property (id) +); + +drop table wish_list, reservation, user, property_detail, image, property, location; \ No newline at end of file From 59abef2df69c2c1453bca11984987f29b0391d7b Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 21 May 2021 12:24:09 +0900 Subject: [PATCH 05/99] chore: init data setting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DB에 기본 데이터 생성을 위한 insert query 생성 --- BE/src/main/resources/insert.sql | 192 +++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 BE/src/main/resources/insert.sql diff --git a/BE/src/main/resources/insert.sql b/BE/src/main/resources/insert.sql new file mode 100644 index 000000000..f2d1c70ca --- /dev/null +++ b/BE/src/main/resources/insert.sql @@ -0,0 +1,192 @@ +use airbnb; + +INSERT into location (name, image) +values ('서울', 'https://user-images.githubusercontent.com/59776016/118949618-61150d00-b994-11eb-8a8a-4a66f037444d.png'), + ('인천', 'https://user-images.githubusercontent.com/59776016/118949720-7d18ae80-b994-11eb-91ed-6950b6745259.png'), + ('대구', 'https://user-images.githubusercontent.com/59776016/118949734-7f7b0880-b994-11eb-8ec7-9c11a7a87c5e.png'), + ('광주', 'https://user-images.githubusercontent.com/59776016/118949756-830e8f80-b994-11eb-8e6a-273f6d875d22.png'), + ('제주', 'https://user-images.githubusercontent.com/59776016/118949756-830e8f80-b994-11eb-8e6a-273f6d875d22.png'); + +INSERT into property (name, price, location_id) +values ('☆Netflix☆Hongdae_Sangsu sta.20sec 갬성돋는 나만의 공간♡', 300000, 1), + ('#2 Hongik Univ Stn 5mins Cozy & Quiet house', 60000, 1), + ('대학로 Min''s House!!401', 70000, 1), + ('# 아담하지만 넓게 쓸수있는 공간입니다.', 80000, 1), + ('S4 Clean & cozy room right next to Gangnam Station', 50000, 1), + ('# 힐링되는 여의도 야경 한눈에!, 타임스퀘어 도보10분', 55000, 1), + ('[Songdo Central House] Romantic City View', 340000, 2), + ('Airport 15min Seoul 40min Bins House', 250000, 2), + ('[Guesthouse Equu] Main Equu', 110000, 2), + ('특.가 셀프체크인 동성로 고층시티뷰', 550000, 3), + ('[JJun''S House #2] 행복가득 하우스 동대구역 3분거리', 72000, 3), + ('#범어역1분#명품가구', 16000, 3), + ('Oasis House ♥︎ 신규오픈/ 복층 / 고층시티뷰 / 상무지구핫플', 30000, 4), + ('켈리 하우스, *유스퀘어 버스터미널 인근(near bus terminal)', 44000, 4), + ('미니미HOUSE 2🌿광주 🌿주차장무료/넷플릭스/매일침구교체💚', 12000, 4), + ('studio noi 스튜디오노이.협재해수욕장 10분거리 감성적인 독채', 88000, 5), + ('"월정야大" 월정해변 근처 조용한 마을 돌집', 770000, 5), + ('제주도, 제주시, 애월별땅,cozy 곽지해수욕장,애월한담산책로, 공항에서30분, 독채펜션', 390000, 5); + +insert into image(image_url, name, property_id) +VALUES ('https://user-images.githubusercontent.com/69128652/118953932-3cbb2f80-b998-11eb-8faf-09cd0f9eac63.png', + 'pr#1-1',1), + ('https://user-images.githubusercontent.com/69128652/118953978-49d81e80-b998-11eb-9b92-1b8141659f27.png', + 'pr#1-2',1), + ('https://user-images.githubusercontent.com/69128652/118954012-4e9cd280-b998-11eb-8c0f-a3ec41aac5d3.png', + 'pr#1-3',1), + ('https://user-images.githubusercontent.com/69128652/118954055-59effe00-b998-11eb-992c-6d1b39863226.png', + 'pr#2-1',2), + ('https://user-images.githubusercontent.com/69128652/118954164-755b0900-b998-11eb-82bc-8dd0459da68b.png', + 'pr#2-2',2), + ('https://user-images.githubusercontent.com/69128652/118954174-7855f980-b998-11eb-9d07-47d5918b18e0.png', + 'pr#2-3',2), + ('https://user-images.githubusercontent.com/69128652/118954255-8e63ba00-b998-11eb-9927-8ddf3d983842.png', + 'pr#3-1',3), + ('https://user-images.githubusercontent.com/69128652/118954272-90c61400-b998-11eb-9ceb-005efa4d016f.png', + 'pr#3-2',3), + ('https://user-images.githubusercontent.com/69128652/118954287-93286e00-b998-11eb-8df0-25ec18f10002.png', + 'pr#3-3',3), + ('https://user-images.githubusercontent.com/69128652/119064380-353a6b80-ba16-11eb-9492-e6743e9f041f.png', + 'pr#4-1',4), + ('https://user-images.githubusercontent.com/69128652/119064387-37042f00-ba16-11eb-9d2a-7dfc82d8ceee.png', + 'pr#4-2',4), + ('https://user-images.githubusercontent.com/69128652/119064401-3a97b600-ba16-11eb-8bb4-caa90641cccd.png', + 'pr#4-3',4), + ('https://user-images.githubusercontent.com/69128652/119064415-3f5c6a00-ba16-11eb-85c4-bd7ee65d775e.png', + 'pr#5-1',5), + ('https://user-images.githubusercontent.com/69128652/119064421-41bec400-ba16-11eb-9c19-4aec50bb9f46.png', + 'pr#5-2',5), + ('https://user-images.githubusercontent.com/69128652/119064426-44211e00-ba16-11eb-9b70-3a7af1614031.png', + 'pr#5-3',5), + ('https://user-images.githubusercontent.com/69128652/119064436-48e5d200-ba16-11eb-9063-4c73d940a38e.png', + 'pr#6-1',6), + ('https://user-images.githubusercontent.com/69128652/119064441-4aaf9580-ba16-11eb-980f-ddbb1b679363.png', + 'pr#6-2',6), + ('https://user-images.githubusercontent.com/69128652/119064443-4c795900-ba16-11eb-8082-ef2a0ed15bd9.png', + 'pr#6-3',6), + + ('https://user-images.githubusercontent.com/69128652/119064496-703c9f00-ba16-11eb-9971-f39caa42c6b7.png', + 'pr#7-1',7), + ('https://user-images.githubusercontent.com/69128652/119064490-6dda4500-ba16-11eb-9ecc-822abdf78fbd.png', + 'pr#7-2',7), + ('https://user-images.githubusercontent.com/69128652/119064498-729ef900-ba16-11eb-9aae-aed2a5773cd8.png', + 'pr#7-3',7), + ('https://user-images.githubusercontent.com/69128652/119064509-76328000-ba16-11eb-8e39-b562e19f97a5.png', + 'pr#8-1',8), + ('https://user-images.githubusercontent.com/69128652/119064517-77fc4380-ba16-11eb-9fed-e2a07869c524.png', + 'pr#8-2',8), + ('https://user-images.githubusercontent.com/69128652/119064520-7a5e9d80-ba16-11eb-9ece-97c4eaf442d4.png', + 'pr#8-3',8), + ('https://user-images.githubusercontent.com/69128652/119064535-7fbbe800-ba16-11eb-908d-707f23c5dbff.png', + 'pr#9-1',9), + ('https://user-images.githubusercontent.com/69128652/119064539-8185ab80-ba16-11eb-85be-a9090a085a9e.png', + 'pr#9-2',9), + ('https://user-images.githubusercontent.com/69128652/119064543-834f6f00-ba16-11eb-9477-766ef68db139.png', + 'pr#9-3',9), + + ('https://user-images.githubusercontent.com/69128652/119064604-a712b500-ba16-11eb-9224-43274b7cbfbb.png', + 'pr#10-1',10), + ('https://user-images.githubusercontent.com/69128652/119064616-ad089600-ba16-11eb-9f9c-bae19b63d7ea.png', + 'pr#10-2',10), + ('https://user-images.githubusercontent.com/69128652/119064621-b1cd4a00-ba16-11eb-9889-b73f525f12b6.png', + 'pr#10-3',10), + ('https://user-images.githubusercontent.com/69128652/119064627-b5f96780-ba16-11eb-8dd5-ae1965c98449.png', + 'pr#11-1',11), + ('https://user-images.githubusercontent.com/69128652/119064631-b8f45800-ba16-11eb-880b-3160ae43ba07.png', + 'pr#11-2',11), + ('https://user-images.githubusercontent.com/69128652/119064638-bc87df00-ba16-11eb-98ea-6ad53b0a1fce.png', + 'pr#11-3',11), + ('https://user-images.githubusercontent.com/69128652/119064649-c1e52980-ba16-11eb-95a7-e8e73f708548.png', + 'pr#12-1',12), + ('https://user-images.githubusercontent.com/69128652/119064643-bf82cf80-ba16-11eb-907e-729d4cbdae0f.png', + 'pr#12-2',12), + ('https://user-images.githubusercontent.com/69128652/119064657-c4478380-ba16-11eb-9224-16e9c1cadc64.png', + 'pr#12-3',12), + + ('https://user-images.githubusercontent.com/69128652/119067012-17700500-ba1c-11eb-99a7-405e084aa296.png', + 'pr#13-1',13), + ('https://user-images.githubusercontent.com/69128652/119067023-1ccd4f80-ba1c-11eb-8595-98aa407f8608.png', + 'pr#13-2',13), + ('https://user-images.githubusercontent.com/69128652/119067016-1a6af580-ba1c-11eb-9e15-6be5891fcb85.png', + 'pr#13-3',13), + ('https://user-images.githubusercontent.com/69128652/119067031-222a9a00-ba1c-11eb-806c-83c65ac0d36f.png', + 'pr#14-1',14), + ('https://user-images.githubusercontent.com/69128652/119067037-248cf400-ba1c-11eb-9238-02392cdda17c.png', + 'pr#14-2',14), + ('https://user-images.githubusercontent.com/69128652/119067044-28207b00-ba1c-11eb-8127-693a8d388581.png', + 'pr#14-3',14), + ('https://user-images.githubusercontent.com/69128652/119067050-2c4c9880-ba1c-11eb-8b5c-d9b264dc10d3.png', + 'pr#15-1',15), + ('https://user-images.githubusercontent.com/69128652/119067052-2eaef280-ba1c-11eb-9960-82fe87662dbc.png', + 'pr#15-2',15), + ('https://user-images.githubusercontent.com/69128652/119067096-45554980-ba1c-11eb-90ef-81abd09fac63.png', + 'pr#15-3',15), + + ('https://user-images.githubusercontent.com/69128652/119067149-6322ae80-ba1c-11eb-9180-d66f7a03076e.png', + 'pr#16-1',16), + ('https://user-images.githubusercontent.com/69128652/119067153-64ec7200-ba1c-11eb-86cc-2b6533578961.png', + 'pr#16-2',16), + ('https://user-images.githubusercontent.com/69128652/119067158-674ecc00-ba1c-11eb-8308-7ae1318e3ee6.png', + 'pr#16-3',16), + ('https://user-images.githubusercontent.com/69128652/119067173-72096100-ba1c-11eb-9aed-d448f986702b.png', + 'pr#17-1',17), + ('https://user-images.githubusercontent.com/69128652/119067178-746bbb00-ba1c-11eb-9ff4-054081edaa86.png', + 'pr#17-2',17), + ('https://user-images.githubusercontent.com/69128652/119067182-759ce800-ba1c-11eb-85f1-a390efa439a8.png', + 'pr#17-3',17), + ('https://user-images.githubusercontent.com/69128652/119067196-7cc3f600-ba1c-11eb-83b8-b48ec20102b9.png', + 'pr#18-1',18), + ('https://user-images.githubusercontent.com/69128652/119067200-7f265000-ba1c-11eb-911c-1d2f4c4e56e4.png', + 'pr#18-2',18), + ('https://user-images.githubusercontent.com/69128652/119067203-80f01380-ba1c-11eb-9cb2-4c6bbad92727.png', + 'pr#18-3',18); + +insert into property_detail(property_id, description, max_occupancy, + cleaning_fee, occupied_date, bed_count, bath_count, + room_type, review_count, latitude, longitude) +VALUES (1, '집 내부 전체를 리모델링한 분위기있는 공간입니다. 복잡한 홍대에서 조금만 걸으면 아기자기한 느낌의 상수동이에요. 6호선 상수역은 바로 앞이라 어디든 이용이 편리합니다', + 6, 6400, null, 4, 2, 'entire house', 42, 37.5468631, 126.922349), +(2, 'Hello! We are locted in 5 minutes walking distance from Hongik Univ station Exit 4. If you are a solo or a couple traveler I believe our house is perfect for you. +The house is clean and cozy, located in a safe and quiet residential area.', + 3, 7800, null, 1, 1, 'private room', 2, 37.555742, 126.931276), + (3, '- 대중교통으로 대한민국의 모든 Hot Place를 "한번에" (명동, 인사동, 강남, 광화문, 동대문 등등). +- 안전한 숙소 (숙소 1분 내 경찰서 위치). +- 도심속 조용한 숙소. +- 입실 전 / 후 캐리어 보관 서비스 제공.', + 2, 4300, null, 1, 1, 'entire house', 19, 37.579678, 127.005000), + (4, '교통의 요지 선릉역에 위치한 신축건물', + 4, 8900, null, 2, 1, 'private room', 104, 37.506602, 127.050994), + (5, 'Room is right next to Gangnam station exit no.1', + 6, 6400, null, 4, 2, 'entire house', 9, 37.496451, 127.030199), + (6, '여의도와 한강이 한눈에 보이는 전망입니다. 야경이 매우 아름답고 굉장히 꺠끗한 숙소 입니다.', + 4, 12400, null, 2, 2, 'entire house', 251, 37.516869, 126.914027), + + (7, '고층에서 송도 센트럴파크와 송도 시내 전망을 바라볼 수 있습니다.', + 3, 7830, null, 3, 2, 'entire house', 234, 37.385845, 126.635701), + (8, 'Bin''s House is a modern Mediterranean-style art building featuring fine views and works of art in Midan City, Yeongjongdo Island.', + 6, 3249, null, 2, 1, 'entire house', 656, 37.515898, 126.531973), + (9, 'Main Equu는 [게스트하우스에쿠]가 대표할수있는 가장 전망과 시설이 좋은 방입니다', + 8, 6890, null, 1, 1, 'entire house', 22, 37.539679, 126.643872), + + (10, '깨끗하고 안락한 ''엄마의꿈''에서 편안하고 행복한 시간 보내세요', + 2, 19850, null, 1, 1, 'entire house', 7, 35.869576, 128.602858), + (11, 'JJun''S House #2입니다 >저희 숙소는 KTX동대구역, 동대구환승버스터미널,대구 1호선 도시철도, 신세계백화점에서 도보로 3분거리에 있는 저희 숙소의 특징은 아늑하고 편안한 공간를 즐길 수 있으며, 최대 2명까지 숙박이 가능합니다.', + 2, 4580, null, 1, 1, 'entire house', 12, 35.882075, 128.626833), + (12, '저희 cosy하우스를 눈여겨봐주셔서 감사합니다.. 철저한 침구교체, 방역작업 및 청소는 기본이며 퀄리티 높은 가구과 가전에서 5성급 호텔 이상의 안락함과 편안함을 느껴보시길 바랍니다..', + 2, 2340, null, 1, 1, 'entire house', 0, 35.859388, 128.625969), + + (13, '♥︎ 2021년 5월 신규 오픈 ♥︎ 소중한 사람과 행복한 시간을 보내고 싶다면 …? 오아시스 하우스는 특별한 사람에게 좋은 추억을 선물하는 공간이 되고 싶습니다.', + 4, 29960, null, 2, 2, 'entire house', 12, 35.158648, 126.849985), + (14, '제 숙소는 광주버스터미널에서 도보로 3분거리, 길건너에는 신세계백화점과 이마트, CGV, 터미널 식당가', + 3, 36690, null, 1, 1, 'entire house', 87, 35.160874, 126.884962), + (15, '운천저수지 공원 뷰 (2021년 뷰는 지하철 공사가 일부 진행 중입니다:)', + 2, 23348, null, 1, 12, 'private room', 567, 35.147699, 126.854781), + + (16, '제주만의 분위기가 물씬 나는 작고 조용한 저지예술인 마을에 위치한 숙소입니다. 감성적인 분위기 속에서 편안하고 즐겁게 쉬어갈 수 있습니다.', + 4, 1273, null, 2, 2, 'entire house', 432, 33.342413, 126.256858), + (17, '제주도 동쪽 조용한 행원리 마을 안쪽에 위치한 "월정夜" 입니다. 돌담으로 둘러싸인 제주도의 예스러운 돌집과 따스한 햇빛이 비치는 마당이 있는 ''월정야''는 창문으로 보이는 한적하고 제주스런 시골 풍경과 함께 편안하게 머무르실 수 있는 숙소입니다.', + 6, 5600, null, 4, 2, 'entire house', 67, 33.551302, 126.807569), + (18, '제주 애월읍 곽지해수욕장(과물해수욕장) 근처에 있는 독채 렌탈 하우스입니다.', + 5, 54000, null, 2, 3, 'entire house', 34, 33.447873, 126.307671); + + From 6edd3dc9dda75004503c794ed29526d8e9a63848 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 21 May 2021 14:28:26 +0900 Subject: [PATCH 06/99] chore: add property_category MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit main 화면에서 보여 줄 CollectionAnywhere에 관련된 table 작성 --- BE/src/main/resources/schema.sql | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/BE/src/main/resources/schema.sql b/BE/src/main/resources/schema.sql index c3ca98c85..ee7fffa6e 100644 --- a/BE/src/main/resources/schema.sql +++ b/BE/src/main/resources/schema.sql @@ -11,7 +11,7 @@ create table location create table property ( id bigint primary key auto_increment, - name varchar(45), + name varchar(255), price int, location_id BIGINT, foreign key (location_id) references location (id) @@ -72,4 +72,12 @@ create table wish_list foreign key (property_id) references property (id) ); -drop table wish_list, reservation, user, property_detail, image, property, location; \ No newline at end of file +drop table property_category; +create table property_category +( + id bigint primary key auto_increment, + name varchar(45), + image_url varchar(1000) +); + +drop table wish_list, reservation, user, property_detail, image, property, location; From 27c0ed8edb0119b4bd9c75381ad238a2ad1c9034 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 21 May 2021 14:29:44 +0900 Subject: [PATCH 07/99] =?UTF-8?q?chore:=20property=5Fcategory=20insert?= =?UTF-8?q?=EB=AC=B8=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DB에 CollectionAnywhere에 관한 데이터 생성을 위한 insert query 생성 --- BE/src/main/resources/insert.sql | 128 ++++++++++++++++--------------- 1 file changed, 68 insertions(+), 60 deletions(-) diff --git a/BE/src/main/resources/insert.sql b/BE/src/main/resources/insert.sql index f2d1c70ca..47ad2b94a 100644 --- a/BE/src/main/resources/insert.sql +++ b/BE/src/main/resources/insert.sql @@ -29,126 +29,126 @@ values ('☆Netflix☆Hongdae_Sangsu sta.20sec 갬성돋는 나만의 공간♡' insert into image(image_url, name, property_id) VALUES ('https://user-images.githubusercontent.com/69128652/118953932-3cbb2f80-b998-11eb-8faf-09cd0f9eac63.png', - 'pr#1-1',1), + 'pr#1-1', 1), ('https://user-images.githubusercontent.com/69128652/118953978-49d81e80-b998-11eb-9b92-1b8141659f27.png', - 'pr#1-2',1), + 'pr#1-2', 1), ('https://user-images.githubusercontent.com/69128652/118954012-4e9cd280-b998-11eb-8c0f-a3ec41aac5d3.png', - 'pr#1-3',1), + 'pr#1-3', 1), ('https://user-images.githubusercontent.com/69128652/118954055-59effe00-b998-11eb-992c-6d1b39863226.png', - 'pr#2-1',2), + 'pr#2-1', 2), ('https://user-images.githubusercontent.com/69128652/118954164-755b0900-b998-11eb-82bc-8dd0459da68b.png', - 'pr#2-2',2), + 'pr#2-2', 2), ('https://user-images.githubusercontent.com/69128652/118954174-7855f980-b998-11eb-9d07-47d5918b18e0.png', - 'pr#2-3',2), + 'pr#2-3', 2), ('https://user-images.githubusercontent.com/69128652/118954255-8e63ba00-b998-11eb-9927-8ddf3d983842.png', - 'pr#3-1',3), + 'pr#3-1', 3), ('https://user-images.githubusercontent.com/69128652/118954272-90c61400-b998-11eb-9ceb-005efa4d016f.png', - 'pr#3-2',3), + 'pr#3-2', 3), ('https://user-images.githubusercontent.com/69128652/118954287-93286e00-b998-11eb-8df0-25ec18f10002.png', - 'pr#3-3',3), + 'pr#3-3', 3), ('https://user-images.githubusercontent.com/69128652/119064380-353a6b80-ba16-11eb-9492-e6743e9f041f.png', - 'pr#4-1',4), + 'pr#4-1', 4), ('https://user-images.githubusercontent.com/69128652/119064387-37042f00-ba16-11eb-9d2a-7dfc82d8ceee.png', - 'pr#4-2',4), + 'pr#4-2', 4), ('https://user-images.githubusercontent.com/69128652/119064401-3a97b600-ba16-11eb-8bb4-caa90641cccd.png', - 'pr#4-3',4), + 'pr#4-3', 4), ('https://user-images.githubusercontent.com/69128652/119064415-3f5c6a00-ba16-11eb-85c4-bd7ee65d775e.png', - 'pr#5-1',5), + 'pr#5-1', 5), ('https://user-images.githubusercontent.com/69128652/119064421-41bec400-ba16-11eb-9c19-4aec50bb9f46.png', - 'pr#5-2',5), + 'pr#5-2', 5), ('https://user-images.githubusercontent.com/69128652/119064426-44211e00-ba16-11eb-9b70-3a7af1614031.png', - 'pr#5-3',5), + 'pr#5-3', 5), ('https://user-images.githubusercontent.com/69128652/119064436-48e5d200-ba16-11eb-9063-4c73d940a38e.png', - 'pr#6-1',6), + 'pr#6-1', 6), ('https://user-images.githubusercontent.com/69128652/119064441-4aaf9580-ba16-11eb-980f-ddbb1b679363.png', - 'pr#6-2',6), + 'pr#6-2', 6), ('https://user-images.githubusercontent.com/69128652/119064443-4c795900-ba16-11eb-8082-ef2a0ed15bd9.png', - 'pr#6-3',6), + 'pr#6-3', 6), ('https://user-images.githubusercontent.com/69128652/119064496-703c9f00-ba16-11eb-9971-f39caa42c6b7.png', - 'pr#7-1',7), + 'pr#7-1', 7), ('https://user-images.githubusercontent.com/69128652/119064490-6dda4500-ba16-11eb-9ecc-822abdf78fbd.png', - 'pr#7-2',7), + 'pr#7-2', 7), ('https://user-images.githubusercontent.com/69128652/119064498-729ef900-ba16-11eb-9aae-aed2a5773cd8.png', - 'pr#7-3',7), + 'pr#7-3', 7), ('https://user-images.githubusercontent.com/69128652/119064509-76328000-ba16-11eb-8e39-b562e19f97a5.png', - 'pr#8-1',8), + 'pr#8-1', 8), ('https://user-images.githubusercontent.com/69128652/119064517-77fc4380-ba16-11eb-9fed-e2a07869c524.png', - 'pr#8-2',8), + 'pr#8-2', 8), ('https://user-images.githubusercontent.com/69128652/119064520-7a5e9d80-ba16-11eb-9ece-97c4eaf442d4.png', - 'pr#8-3',8), + 'pr#8-3', 8), ('https://user-images.githubusercontent.com/69128652/119064535-7fbbe800-ba16-11eb-908d-707f23c5dbff.png', - 'pr#9-1',9), + 'pr#9-1', 9), ('https://user-images.githubusercontent.com/69128652/119064539-8185ab80-ba16-11eb-85be-a9090a085a9e.png', - 'pr#9-2',9), + 'pr#9-2', 9), ('https://user-images.githubusercontent.com/69128652/119064543-834f6f00-ba16-11eb-9477-766ef68db139.png', - 'pr#9-3',9), + 'pr#9-3', 9), ('https://user-images.githubusercontent.com/69128652/119064604-a712b500-ba16-11eb-9224-43274b7cbfbb.png', - 'pr#10-1',10), + 'pr#10-1', 10), ('https://user-images.githubusercontent.com/69128652/119064616-ad089600-ba16-11eb-9f9c-bae19b63d7ea.png', - 'pr#10-2',10), + 'pr#10-2', 10), ('https://user-images.githubusercontent.com/69128652/119064621-b1cd4a00-ba16-11eb-9889-b73f525f12b6.png', - 'pr#10-3',10), + 'pr#10-3', 10), ('https://user-images.githubusercontent.com/69128652/119064627-b5f96780-ba16-11eb-8dd5-ae1965c98449.png', - 'pr#11-1',11), + 'pr#11-1', 11), ('https://user-images.githubusercontent.com/69128652/119064631-b8f45800-ba16-11eb-880b-3160ae43ba07.png', - 'pr#11-2',11), + 'pr#11-2', 11), ('https://user-images.githubusercontent.com/69128652/119064638-bc87df00-ba16-11eb-98ea-6ad53b0a1fce.png', - 'pr#11-3',11), + 'pr#11-3', 11), ('https://user-images.githubusercontent.com/69128652/119064649-c1e52980-ba16-11eb-95a7-e8e73f708548.png', - 'pr#12-1',12), + 'pr#12-1', 12), ('https://user-images.githubusercontent.com/69128652/119064643-bf82cf80-ba16-11eb-907e-729d4cbdae0f.png', - 'pr#12-2',12), + 'pr#12-2', 12), ('https://user-images.githubusercontent.com/69128652/119064657-c4478380-ba16-11eb-9224-16e9c1cadc64.png', - 'pr#12-3',12), + 'pr#12-3', 12), ('https://user-images.githubusercontent.com/69128652/119067012-17700500-ba1c-11eb-99a7-405e084aa296.png', - 'pr#13-1',13), + 'pr#13-1', 13), ('https://user-images.githubusercontent.com/69128652/119067023-1ccd4f80-ba1c-11eb-8595-98aa407f8608.png', - 'pr#13-2',13), + 'pr#13-2', 13), ('https://user-images.githubusercontent.com/69128652/119067016-1a6af580-ba1c-11eb-9e15-6be5891fcb85.png', - 'pr#13-3',13), + 'pr#13-3', 13), ('https://user-images.githubusercontent.com/69128652/119067031-222a9a00-ba1c-11eb-806c-83c65ac0d36f.png', - 'pr#14-1',14), + 'pr#14-1', 14), ('https://user-images.githubusercontent.com/69128652/119067037-248cf400-ba1c-11eb-9238-02392cdda17c.png', - 'pr#14-2',14), + 'pr#14-2', 14), ('https://user-images.githubusercontent.com/69128652/119067044-28207b00-ba1c-11eb-8127-693a8d388581.png', - 'pr#14-3',14), + 'pr#14-3', 14), ('https://user-images.githubusercontent.com/69128652/119067050-2c4c9880-ba1c-11eb-8b5c-d9b264dc10d3.png', - 'pr#15-1',15), + 'pr#15-1', 15), ('https://user-images.githubusercontent.com/69128652/119067052-2eaef280-ba1c-11eb-9960-82fe87662dbc.png', - 'pr#15-2',15), + 'pr#15-2', 15), ('https://user-images.githubusercontent.com/69128652/119067096-45554980-ba1c-11eb-90ef-81abd09fac63.png', - 'pr#15-3',15), + 'pr#15-3', 15), ('https://user-images.githubusercontent.com/69128652/119067149-6322ae80-ba1c-11eb-9180-d66f7a03076e.png', - 'pr#16-1',16), + 'pr#16-1', 16), ('https://user-images.githubusercontent.com/69128652/119067153-64ec7200-ba1c-11eb-86cc-2b6533578961.png', - 'pr#16-2',16), + 'pr#16-2', 16), ('https://user-images.githubusercontent.com/69128652/119067158-674ecc00-ba1c-11eb-8308-7ae1318e3ee6.png', - 'pr#16-3',16), + 'pr#16-3', 16), ('https://user-images.githubusercontent.com/69128652/119067173-72096100-ba1c-11eb-9aed-d448f986702b.png', - 'pr#17-1',17), + 'pr#17-1', 17), ('https://user-images.githubusercontent.com/69128652/119067178-746bbb00-ba1c-11eb-9ff4-054081edaa86.png', - 'pr#17-2',17), + 'pr#17-2', 17), ('https://user-images.githubusercontent.com/69128652/119067182-759ce800-ba1c-11eb-85f1-a390efa439a8.png', - 'pr#17-3',17), + 'pr#17-3', 17), ('https://user-images.githubusercontent.com/69128652/119067196-7cc3f600-ba1c-11eb-83b8-b48ec20102b9.png', - 'pr#18-1',18), + 'pr#18-1', 18), ('https://user-images.githubusercontent.com/69128652/119067200-7f265000-ba1c-11eb-911c-1d2f4c4e56e4.png', - 'pr#18-2',18), + 'pr#18-2', 18), ('https://user-images.githubusercontent.com/69128652/119067203-80f01380-ba1c-11eb-9cb2-4c6bbad92727.png', - 'pr#18-3',18); + 'pr#18-3', 18); insert into property_detail(property_id, description, max_occupancy, cleaning_fee, occupied_date, bed_count, bath_count, room_type, review_count, latitude, longitude) VALUES (1, '집 내부 전체를 리모델링한 분위기있는 공간입니다. 복잡한 홍대에서 조금만 걸으면 아기자기한 느낌의 상수동이에요. 6호선 상수역은 바로 앞이라 어디든 이용이 편리합니다', - 6, 6400, null, 4, 2, 'entire house', 42, 37.5468631, 126.922349), -(2, 'Hello! We are locted in 5 minutes walking distance from Hongik Univ station Exit 4. If you are a solo or a couple traveler I believe our house is perfect for you. + 6, 6400, null, 4, 2, 'entire house', 42, 37.5468631, 126.922349), + (2, 'Hello! We are locted in 5 minutes walking distance from Hongik Univ station Exit 4. If you are a solo or a couple traveler I believe our house is perfect for you. The house is clean and cozy, located in a safe and quiet residential area.', - 3, 7800, null, 1, 1, 'private room', 2, 37.555742, 126.931276), + 3, 7800, null, 1, 1, 'private room', 2, 37.555742, 126.931276), (3, '- 대중교통으로 대한민국의 모든 Hot Place를 "한번에" (명동, 인사동, 강남, 광화문, 동대문 등등). - 안전한 숙소 (숙소 1분 내 경찰서 위치). - 도심속 조용한 숙소. @@ -163,14 +163,16 @@ The house is clean and cozy, located in a safe and quiet residential area.', (7, '고층에서 송도 센트럴파크와 송도 시내 전망을 바라볼 수 있습니다.', 3, 7830, null, 3, 2, 'entire house', 234, 37.385845, 126.635701), - (8, 'Bin''s House is a modern Mediterranean-style art building featuring fine views and works of art in Midan City, Yeongjongdo Island.', + (8, + 'Bin''s House is a modern Mediterranean-style art building featuring fine views and works of art in Midan City, Yeongjongdo Island.', 6, 3249, null, 2, 1, 'entire house', 656, 37.515898, 126.531973), (9, 'Main Equu는 [게스트하우스에쿠]가 대표할수있는 가장 전망과 시설이 좋은 방입니다', 8, 6890, null, 1, 1, 'entire house', 22, 37.539679, 126.643872), (10, '깨끗하고 안락한 ''엄마의꿈''에서 편안하고 행복한 시간 보내세요', 2, 19850, null, 1, 1, 'entire house', 7, 35.869576, 128.602858), - (11, 'JJun''S House #2입니다 >저희 숙소는 KTX동대구역, 동대구환승버스터미널,대구 1호선 도시철도, 신세계백화점에서 도보로 3분거리에 있는 저희 숙소의 특징은 아늑하고 편안한 공간를 즐길 수 있으며, 최대 2명까지 숙박이 가능합니다.', + (11, + 'JJun''S House #2입니다 >저희 숙소는 KTX동대구역, 동대구환승버스터미널,대구 1호선 도시철도, 신세계백화점에서 도보로 3분거리에 있는 저희 숙소의 특징은 아늑하고 편안한 공간를 즐길 수 있으며, 최대 2명까지 숙박이 가능합니다.', 2, 4580, null, 1, 1, 'entire house', 12, 35.882075, 128.626833), (12, '저희 cosy하우스를 눈여겨봐주셔서 감사합니다.. 철저한 침구교체, 방역작업 및 청소는 기본이며 퀄리티 높은 가구과 가전에서 5성급 호텔 이상의 안락함과 편안함을 느껴보시길 바랍니다..', 2, 2340, null, 1, 1, 'entire house', 0, 35.859388, 128.625969), @@ -184,9 +186,15 @@ The house is clean and cozy, located in a safe and quiet residential area.', (16, '제주만의 분위기가 물씬 나는 작고 조용한 저지예술인 마을에 위치한 숙소입니다. 감성적인 분위기 속에서 편안하고 즐겁게 쉬어갈 수 있습니다.', 4, 1273, null, 2, 2, 'entire house', 432, 33.342413, 126.256858), - (17, '제주도 동쪽 조용한 행원리 마을 안쪽에 위치한 "월정夜" 입니다. 돌담으로 둘러싸인 제주도의 예스러운 돌집과 따스한 햇빛이 비치는 마당이 있는 ''월정야''는 창문으로 보이는 한적하고 제주스런 시골 풍경과 함께 편안하게 머무르실 수 있는 숙소입니다.', + (17, + '제주도 동쪽 조용한 행원리 마을 안쪽에 위치한 "월정夜" 입니다. 돌담으로 둘러싸인 제주도의 예스러운 돌집과 따스한 햇빛이 비치는 마당이 있는 ''월정야''는 창문으로 보이는 한적하고 제주스런 시골 풍경과 함께 편안하게 머무르실 수 있는 숙소입니다.', 6, 5600, null, 4, 2, 'entire house', 67, 33.551302, 126.807569), (18, '제주 애월읍 곽지해수욕장(과물해수욕장) 근처에 있는 독채 렌탈 하우스입니다.', 5, 54000, null, 2, 3, 'entire house', 34, 33.447873, 126.307671); +insert into property_category(name, image_url) +values ('Outdoor getaways', 'https://user-images.githubusercontent.com/59776016/118950055-ce28a280-b994-11eb-8c89-e0190cdeee68.png'), + ('Unique stays','https://user-images.githubusercontent.com/59776016/118950041-cb2db200-b994-11eb-8757-436f287bb805.png'), + ('Entire homes','https://user-images.githubusercontent.com/59776016/118950072-d1bc2980-b994-11eb-9392-e66b9b4bdd0b.png'), + ('Pets allowed','https://user-images.githubusercontent.com/59776016/118950087-d4b71a00-b994-11eb-9311-b7271e0fc3b3.png'); From 4ae7d17e67656cf3ea1c1ed635e3fef5557de8c3 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 21 May 2021 14:29:45 +0900 Subject: [PATCH 08/99] =?UTF-8?q?refactor:=20ImageUrl=20=ED=95=84=EB=93=9C?= =?UTF-8?q?,=20=EA=B2=8C=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/codesquad/airbnb/domain/Location.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Location.java b/BE/src/main/java/com/codesquad/airbnb/domain/Location.java index 98729d168..75d5bda0c 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/Location.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Location.java @@ -9,9 +9,13 @@ public class Location { private String name; - public Location(String name) { + private String imageUrl; + + public Location(String name, String imageUrl) { this.name = name; + this.imageUrl = imageUrl; } + public Long getId() { return id; } @@ -19,4 +23,8 @@ public Long getId() { public String getName() { return name; } + + public String getImageUrl() { + return imageUrl; + } } From 3b186ac8d85cc5f4a16b1c6dd4c68fd8d14c3e16 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 21 May 2021 14:30:20 +0900 Subject: [PATCH 09/99] =?UTF-8?q?feat:=20Category=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 메인에서 띄워줄 카테고리 항목 추가 --- .../com/codesquad/airbnb/domain/Category.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/Category.java diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Category.java b/BE/src/main/java/com/codesquad/airbnb/domain/Category.java new file mode 100644 index 000000000..1cca80bac --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Category.java @@ -0,0 +1,30 @@ +package com.codesquad.airbnb.domain; + +import org.springframework.data.annotation.Id; + +public class Category { + + @Id + private Long id; + + private String name; + + private String imageUrl; + + public Category(String name, String imageUrl) { + this.name = name; + this.imageUrl = imageUrl; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getImageUrl() { + return imageUrl; + } +} From e711d0eb2aa7229817323de627fb876999966b09 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 21 May 2021 14:38:58 +0900 Subject: [PATCH 10/99] =?UTF-8?q?chore:=20image=5Furl=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BE/src/main/resources/schema.sql b/BE/src/main/resources/schema.sql index ee7fffa6e..3380c4cf7 100644 --- a/BE/src/main/resources/schema.sql +++ b/BE/src/main/resources/schema.sql @@ -5,7 +5,7 @@ create table location ( id BIGINT primary key auto_increment, name varchar(45), - image varchar(255) + image_url varchar(255) ); create table property From 02e7179055979ef941050eec0150f3ac3d66608e Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 21 May 2021 16:54:24 +0900 Subject: [PATCH 11/99] =?UTF-8?q?chore:=20build.gradle=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=84=A4=EC=A0=95=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/build.gradle | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/BE/build.gradle b/BE/build.gradle index 95aa72654..785a636cc 100644 --- a/BE/build.gradle +++ b/BE/build.gradle @@ -2,7 +2,6 @@ plugins { id 'org.springframework.boot' version '2.4.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' - id 'org.jetbrains.kotlin.jvm' version '1.4.32' } group 'com.codesquad.airbnb' @@ -14,8 +13,6 @@ repositories { } dependencies { - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' @@ -24,4 +21,4 @@ dependencies { test { useJUnitPlatform() -} \ No newline at end of file +} From 29194822edbf462c28103908e96710b6147d6b06 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 21 May 2021 16:55:16 +0900 Subject: [PATCH 12/99] =?UTF-8?q?feat:=20Location=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=9D=98=20=EB=A1=9C=EA=B1=B0=20=EA=B8=B0=EB=A1=9D?= =?UTF-8?q?=EC=9A=A9=20toString=EA=B3=BC=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/codesquad/airbnb/domain/Location.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Location.java b/BE/src/main/java/com/codesquad/airbnb/domain/Location.java index 75d5bda0c..98adae2e9 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/Location.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Location.java @@ -11,7 +11,7 @@ public class Location { private String imageUrl; - public Location(String name, String imageUrl) { + public Location(Long id, String name, String imageUrl) { this.name = name; this.imageUrl = imageUrl; } @@ -27,4 +27,11 @@ public String getName() { public String getImageUrl() { return imageUrl; } + + @Override + public String toString() { + return "Location{" + + "name='" + name + '\'' + + '}'; + } } From 48ecf285a2aa9facc2a419d36a6bc3b38d5881f8 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 21 May 2021 16:57:20 +0900 Subject: [PATCH 13/99] =?UTF-8?q?feat:=20LocationDAO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 일단은 findById를 resultSet으로 받아와 생성자에 넣도록 구현했다. 로케이션의 경우 DTO가 크게 필요하지 않아 빌더를 쓰지는 않았고 세터를 쓰는 것 보다 처음 객체 생성 시 파라미터로 리저트 셋의 값을 가져오는 게 더 나을 것 같다는 판단으로 구현했다. --- .../com/codesquad/airbnb/dao/LocationDAO.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java new file mode 100644 index 000000000..5ed1461fa --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java @@ -0,0 +1,30 @@ +package com.codesquad.airbnb.dao; + +import com.codesquad.airbnb.domain.Location; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import javax.sql.DataSource; + +@Repository +public class LocationDAO { + + private final JdbcTemplate jdbcTemplate; + + @Autowired + public LocationDAO(DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + public Location findById(Long id) { + String sql = "Select id, name, image_url FROM location WHERE id = ?"; + + RowMapper locationMapper = (rs, rowNum) -> { + return new Location(rs.getLong("id"), rs.getString("name"), rs.getString("image_url")); + }; + + return jdbcTemplate.queryForObject(sql, locationMapper, id); + } +} From 84dd0a2141e029d73baead912a3978a49e0b1343 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 21 May 2021 16:57:50 +0900 Subject: [PATCH 14/99] =?UTF-8?q?test:=20LocationDAOTest=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 테스트 데이터로 넣어놓은 로케이션을 아이디로 찾는다. --- .../codesquad/airbnb/dao/LocationDAOTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java new file mode 100644 index 000000000..c8b9731f0 --- /dev/null +++ b/BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java @@ -0,0 +1,27 @@ +package com.codesquad.airbnb.dao; + +import com.codesquad.airbnb.domain.Location; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +class LocationDAOTest { + + private Logger logger = LoggerFactory.getLogger(LocationDAOTest.class); + + @Autowired + private LocationDAO locationDAO; + + @Test + void locationDAO_findById() { + Location location = locationDAO.findById(1L); + assertThat(location).isNotNull(); + assertThat(location.getName()).isEqualTo("서울"); + logger.info("location found: {}", location); + } +} From 58481dd69f29147090a280023930f1d8ba85a06c Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 21 May 2021 17:08:36 +0900 Subject: [PATCH 15/99] =?UTF-8?q?feat:=20findAll=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 여러 객체를 받아올 때 쓸 매퍼(LocationMapper)를 이너클래스로 구현하고 findAll에서 여러 리저트 셋을 매퍼를 이용해 객체로 변환 --- .../com/codesquad/airbnb/dao/LocationDAO.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java index 5ed1461fa..41832f686 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java @@ -7,6 +7,9 @@ import org.springframework.stereotype.Repository; import javax.sql.DataSource; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; @Repository public class LocationDAO { @@ -18,6 +21,15 @@ public LocationDAO(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } + public class LocationMapper implements RowMapper { + public Location mapRow(ResultSet resultSet, int rowNumber) throws SQLException { + Location location = new Location(resultSet.getLong("id"), + resultSet.getString("name"), + resultSet.getString("image_url")); + return location; + } + } + public Location findById(Long id) { String sql = "Select id, name, image_url FROM location WHERE id = ?"; @@ -27,4 +39,10 @@ public Location findById(Long id) { return jdbcTemplate.queryForObject(sql, locationMapper, id); } + + public List findAll() { + String sql = "SELECT id, name, image_url FROM location"; + List locations = jdbcTemplate.query(sql, new LocationMapper()); + return locations; + } } From 92be2b64878c508e980ae388a7956f2d77dcd584 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 21 May 2021 17:08:58 +0900 Subject: [PATCH 16/99] =?UTF-8?q?test:=20findAll=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/dao/LocationDAOTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java index c8b9731f0..969a27e93 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java @@ -7,6 +7,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest @@ -24,4 +26,14 @@ void locationDAO_findById() { assertThat(location.getName()).isEqualTo("서울"); logger.info("location found: {}", location); } + + @Test + void locationDAO_findAll() { + List locations = locationDAO.findAll(); + assertThat(locations.get(0).getName()).isEqualTo("서울"); + assertThat(locations.get(1).getName()).isEqualTo("인천"); + assertThat(locations.get(2).getName()).isEqualTo("대구"); + assertThat(locations.get(3).getName()).isEqualTo("광주"); + assertThat(locations.get(4).getName()).isEqualTo("제주"); + } } From 22b865e59b70fa876aa4165444e723cc8a95d571 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Sat, 22 May 2021 00:51:16 +0900 Subject: [PATCH 17/99] =?UTF-8?q?feat:=20=EC=B9=B4=ED=85=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=20=ED=85=8C=EC=9D=B4=EB=B8=94=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/insert.sql | 10 ++++++++-- BE/src/main/resources/schema.sql | 30 +++++++++++++++++------------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/BE/src/main/resources/insert.sql b/BE/src/main/resources/insert.sql index 47ad2b94a..1f3e670e2 100644 --- a/BE/src/main/resources/insert.sql +++ b/BE/src/main/resources/insert.sql @@ -1,12 +1,18 @@ use airbnb; -INSERT into location (name, image) +INSERT into location (name, image_url) values ('서울', 'https://user-images.githubusercontent.com/59776016/118949618-61150d00-b994-11eb-8a8a-4a66f037444d.png'), ('인천', 'https://user-images.githubusercontent.com/59776016/118949720-7d18ae80-b994-11eb-91ed-6950b6745259.png'), ('대구', 'https://user-images.githubusercontent.com/59776016/118949734-7f7b0880-b994-11eb-8ec7-9c11a7a87c5e.png'), ('광주', 'https://user-images.githubusercontent.com/59776016/118949756-830e8f80-b994-11eb-8e6a-273f6d875d22.png'), ('제주', 'https://user-images.githubusercontent.com/59776016/118949756-830e8f80-b994-11eb-8e6a-273f6d875d22.png'); +INSERT INTO category (name, image_url) +values ('Outdoor getaways', 'https://user-images.githubusercontent.com/59776016/118950055-ce28a280-b994-11eb-8c89-e0190cdeee68.png'), + ('Unique stays', 'https://user-images.githubusercontent.com/59776016/118950041-cb2db200-b994-11eb-8757-436f287bb805.png'), + ('Entire homes', 'https://user-images.githubusercontent.com/59776016/118950072-d1bc2980-b994-11eb-9392-e66b9b4bdd0b.png'), + ('Pets allowed', 'https://user-images.githubusercontent.com/59776016/118950087-d4b71a00-b994-11eb-9311-b7271e0fc3b3.png'); + INSERT into property (name, price, location_id) values ('☆Netflix☆Hongdae_Sangsu sta.20sec 갬성돋는 나만의 공간♡', 300000, 1), ('#2 Hongik Univ Stn 5mins Cozy & Quiet house', 60000, 1), @@ -22,7 +28,7 @@ values ('☆Netflix☆Hongdae_Sangsu sta.20sec 갬성돋는 나만의 공간♡' ('#범어역1분#명품가구', 16000, 3), ('Oasis House ♥︎ 신규오픈/ 복층 / 고층시티뷰 / 상무지구핫플', 30000, 4), ('켈리 하우스, *유스퀘어 버스터미널 인근(near bus terminal)', 44000, 4), - ('미니미HOUSE 2🌿광주 🌿주차장무료/넷플릭스/매일침구교체💚', 12000, 4), + ('미니미HOUSE 2 광주 주차장무료/넷플릭스/매일침구교체', 12000, 4), ('studio noi 스튜디오노이.협재해수욕장 10분거리 감성적인 독채', 88000, 5), ('"월정야大" 월정해변 근처 조용한 마을 돌집', 770000, 5), ('제주도, 제주시, 애월별땅,cozy 곽지해수욕장,애월한담산책로, 공항에서30분, 독채펜션', 390000, 5); diff --git a/BE/src/main/resources/schema.sql b/BE/src/main/resources/schema.sql index 3380c4cf7..888b1e8d3 100644 --- a/BE/src/main/resources/schema.sql +++ b/BE/src/main/resources/schema.sql @@ -1,14 +1,21 @@ -create database airbnb; +create database if not exists airbnb; use airbnb; -create table location +create table if not exists location ( id BIGINT primary key auto_increment, name varchar(45), image_url varchar(255) ); -create table property +create table if not exists category +( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(45), + image_url VARCHAR(1000) +); + +create table if not exists property ( id bigint primary key auto_increment, name varchar(255), @@ -17,8 +24,7 @@ create table property foreign key (location_id) references location (id) ); -drop table property_detail; -create table property_detail +create table if not exists property_detail ( property_id bigint, description varchar(255), @@ -34,8 +40,7 @@ create table property_detail foreign key (property_id) references property (id) ); -drop table image; -create table image +create table if not exists image ( id BIGINT Primary Key auto_increment, image_url varchar(1000), @@ -44,14 +49,14 @@ create table image foreign key (property_id) references property(id) ); -create table user +create table if not exists user ( id BIGINT primary key auto_increment, name varchar(45), email varchar(255) ); -create table reservation +create table if not exists reservation ( check_in_date datetime, check_out_date datetime, @@ -63,7 +68,7 @@ create table reservation foreign key (property_id) references property (id) ); -create table wish_list +create table if not exists wish_list ( bookmark boolean, user_id bigint, @@ -72,12 +77,11 @@ create table wish_list foreign key (property_id) references property (id) ); -drop table property_category; -create table property_category +create table if not exists property_category ( id bigint primary key auto_increment, name varchar(45), image_url varchar(1000) ); -drop table wish_list, reservation, user, property_detail, image, property, location; +# drop table wish_list, reservation, user, property_detail, image, property, location; From bb9a629159608697167f8019b6ec811136805019 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Sat, 22 May 2021 00:52:09 +0900 Subject: [PATCH 18/99] =?UTF-8?q?feat:=20CategoryDAO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit findAll만 구현해놓은 상태라 매퍼를 따로 뺴지 않아도 될 것 같아서 두었다. --- .../com/codesquad/airbnb/dao/CategoryDAO.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java new file mode 100644 index 000000000..055666726 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java @@ -0,0 +1,34 @@ +package com.codesquad.airbnb.dao; + +import com.codesquad.airbnb.domain.Category; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import javax.sql.DataSource; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@Repository +public class CategoryDAO { + + private JdbcTemplate jdbcTemplate; + + @Autowired + public CategoryDAO(DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + public List findAll() { + String sql = "SELECT id, name, image_url FROM category"; + RowMapper categoryMapper = new RowMapper() { + @Override + public Category mapRow(ResultSet rs, int rowNum) throws SQLException { + return new Category(rs.getString("name"), rs.getString("image_url")); + } + }; + return jdbcTemplate.query(sql, categoryMapper); + } +} From 6122150e97bfd231af90eacce6e9957182354f3f Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Sat, 22 May 2021 00:53:08 +0900 Subject: [PATCH 19/99] =?UTF-8?q?test:=20CategoryDAO=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 미리 넣어둔 카테고리 네개로 잘 불러오는 지 확인했다. --- .../codesquad/airbnb/dao/CategoryDAOTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 BE/src/test/java/com/codesquad/airbnb/dao/CategoryDAOTest.java diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/CategoryDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/CategoryDAOTest.java new file mode 100644 index 000000000..8def663b4 --- /dev/null +++ b/BE/src/test/java/com/codesquad/airbnb/dao/CategoryDAOTest.java @@ -0,0 +1,27 @@ +package com.codesquad.airbnb.dao; + +import com.codesquad.airbnb.domain.Category; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +@SpringBootTest +class CategoryDAOTest { + + private Logger logger = LoggerFactory.getLogger(CategoryDAOTest.class); + + @Autowired + private CategoryDAO categoryDAO; + + @Test + void CategoryDAO_findAll() { + List categories = categoryDAO.findAll(); + assertThat(categories.size()).isGreaterThanOrEqualTo(4); + } +} From 07f7a61306caba5ca9ebf6c765dfc3dc85df6128 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Sat, 22 May 2021 19:41:53 +0900 Subject: [PATCH 20/99] =?UTF-8?q?chore:=20Property=5Fdetail=20table?= =?UTF-8?q?=EC=97=90=20rating=20=ED=95=AD=EB=AA=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/schema.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/BE/src/main/resources/schema.sql b/BE/src/main/resources/schema.sql index 3380c4cf7..97b05aebf 100644 --- a/BE/src/main/resources/schema.sql +++ b/BE/src/main/resources/schema.sql @@ -31,6 +31,7 @@ create table property_detail review_count int, latitude double, longitude double, + rating double, foreign key (property_id) references property (id) ); From 58ce60b55fafaa528d0e3a3cf579636afe15a9b0 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Sat, 22 May 2021 19:43:58 +0900 Subject: [PATCH 21/99] =?UTF-8?q?feat:=20search=20=EC=8B=9C,=20List?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=9C=EB=A0=A5=ED=95=98=EA=B8=B0=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20DTO=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit title, image_url, bookmark, pricePerNight, totalPrice, reviewCount, rating을 갖는 PropertyDto를 List로 저장해, 반환하는 PropertiesResponseDto 생성 --- .../airbnb/dto/PropertiesResponseDto.java | 17 ++++ .../com/codesquad/airbnb/dto/PropertyDto.java | 83 +++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDto.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDto.java new file mode 100644 index 000000000..8fb7f748a --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDto.java @@ -0,0 +1,17 @@ +package com.codesquad.airbnb.dto; + +import java.util.ArrayList; +import java.util.List; + +public class PropertiesResponseDto { + + List properties = new ArrayList<>(); + + public PropertiesResponseDto(List properties) { + this.properties = properties; + } + + public List getProperties() { + return properties; + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java new file mode 100644 index 000000000..9dba18c0e --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java @@ -0,0 +1,83 @@ +package com.codesquad.airbnb.dto; + +import com.codesquad.airbnb.domain.*; + +import java.util.HashSet; +import java.util.Set; + +public class PropertyDto { + + private Long propertyId; + private Set images = new HashSet<>(); + private String title; + private boolean bookmark; + private int pricePerNight; + private int totalPrice; + private int reviewCount; + private double rating; + + public PropertyDto() { + } + + public PropertyDto(Long propertyId, Image image, String title, boolean bookmark, int pricePerNight, int totalPrice, int reviewCount, double rating) { + this.propertyId = propertyId; + this.images.add(image); + this.title = title; + this.bookmark = bookmark; + this.pricePerNight = pricePerNight; + this.totalPrice = totalPrice; + this.reviewCount = reviewCount; + this.rating = rating; + } + + public static PropertyDto of(Property property, PropertyDetail propertyDetail, WishList wishList, Image image, int totalPrice) { + return new PropertyDto(property.getId(), image, property.getName(), wishList.isBookmark(), property.getPrice(), totalPrice, + propertyDetail.getReviewCount(), propertyDetail.getRating()); + } + + public Long getPropertyId() { + return propertyId; + } + + public Set getImages() { + return images; + } + + public String getTitle() { + return title; + } + + public boolean isBookmark() { + return bookmark; + } + + public int getPricePerNight() { + return pricePerNight; + } + + public int getTotalPrice() { + return totalPrice; + } + + public int getReviewCount() { + return reviewCount; + } + + public double getRating() { + return rating; + } + + @Override + public String toString() { + return "PropertyDto{" + + "propertyId=" + propertyId + + ", images=" + images + + ", title='" + title + '\'' + + ", bookmark=" + bookmark + + ", pricePerNight=" + pricePerNight + + ", totalPrice=" + totalPrice + + ", reviewCount=" + reviewCount + + ", rating=" + rating + + '}'; + } +} From cbb45811bfd3344756b1aadcf1ff4f40a6a5b8f3 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Sat, 22 May 2021 19:44:38 +0900 Subject: [PATCH 22/99] =?UTF-8?q?feat:=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?UTF-8?q?=EC=99=80=20toString=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/domain/Property.java | 15 +++++++ .../airbnb/domain/PropertyDetail.java | 43 ++++++++++++++++--- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Property.java b/BE/src/main/java/com/codesquad/airbnb/domain/Property.java index 083c74cc2..c1ecfdb6e 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/Property.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Property.java @@ -13,6 +13,12 @@ public class Property { public Property() { } + public Property(Long id, String name, int price) { + this.id = id; + this.name = name; + this.price = price; + } + public Long getId() { return id; } @@ -24,4 +30,13 @@ public String getName() { public int getPrice() { return price; } + + @Override + public String toString() { + return "Property{" + + "id=" + id + + ", name='" + name + '\'' + + ", price=" + price + + '}'; + } } diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java b/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java index 1ea525db9..78d373374 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java @@ -10,15 +10,28 @@ public class PropertyDetail { private Long property_id; private String description; - private String maxOccupancy; + private int maxOccupancy; private int cleaningFee; - private LocalDate occupiedDate; private int bedCount; private int bathCount; private String roomType; private int reviewCount; private double latitude; private double longitude; + private double rating; + + public PropertyDetail(Long property_id, String description, int maxOccupancy, int cleaningFee, int bedCount, int bathCount, String roomType, int reviewCount, double latitude, double longitude) { + this.property_id = property_id; + this.description = description; + this.maxOccupancy = maxOccupancy; + this.cleaningFee = cleaningFee; + this.bedCount = bedCount; + this.bathCount = bathCount; + this.roomType = roomType; + this.reviewCount = reviewCount; + this.latitude = latitude; + this.longitude = longitude; + } public Long getProperty_id() { return property_id; @@ -28,7 +41,7 @@ public String getDescription() { return description; } - public String getMaxOccupancy() { + public int getMaxOccupancy() { return maxOccupancy; } @@ -36,10 +49,6 @@ public int getCleaningFee() { return cleaningFee; } - public LocalDate getOccupiedDate() { - return occupiedDate; - } - public int getBedCount() { return bedCount; } @@ -63,4 +72,24 @@ public double getLatitude() { public double getLongitude() { return longitude; } + + public double getRating() { + return rating; + } + + @Override + public String toString() { + return "PropertyDetail{" + + "property_id=" + property_id + + ", description='" + description + '\'' + + ", maxOccupancy=" + maxOccupancy + + ", cleaningFee=" + cleaningFee + + ", bedCount=" + bedCount + + ", bathCount=" + bathCount + + ", roomType='" + roomType + '\'' + + ", reviewCount=" + reviewCount + + ", latitude=" + latitude + + ", longitude=" + longitude + + '}'; + } } From 5e32eb6d6fafd437b9b1b0a2ca497f874ca37203 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Sat, 22 May 2021 19:45:13 +0900 Subject: [PATCH 23/99] =?UTF-8?q?feat:=20table=20Entity=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/domain/Image.java | 21 +++++++++++++++++++ .../com/codesquad/airbnb/domain/WishList.java | 11 ++++++++++ 2 files changed, 32 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/Image.java diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Image.java b/BE/src/main/java/com/codesquad/airbnb/domain/Image.java new file mode 100644 index 000000000..1564108f7 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Image.java @@ -0,0 +1,21 @@ +package com.codesquad.airbnb.domain; + +public class Image { + + private String imageUrl; + + public Image(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getImageUrl() { + return imageUrl; + } + + @Override + public String toString() { + return "Image{" + + "imageUrl='" + imageUrl + '\'' + + '}'; + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java b/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java index 13632c98a..30758d739 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java @@ -1,4 +1,15 @@ package com.codesquad.airbnb.domain; public class WishList { + + private boolean bookmark; + public boolean isBookmark() { + return bookmark; + } + + public WishList(boolean bookmark) { + this.bookmark = bookmark; + } + + } From 307c2c87c746c791f3ecee93aee39be71b6a15ab Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Sat, 22 May 2021 19:46:36 +0900 Subject: [PATCH 24/99] =?UTF-8?q?feat:=20Property=EB=A5=BC=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=EB=A1=9C=20=EB=B6=88=EB=9F=AC=EC=98=A4=EB=8A=94=20DAO?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Id 값으로 Property 찾기, 전체 Property 찾기, 조건에 따른 PropertiesDtoResponse 찾기 가능 --- .../com/codesquad/airbnb/dao/PropertyDao.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java new file mode 100644 index 000000000..b63dbeb66 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java @@ -0,0 +1,93 @@ +package com.codesquad.airbnb.dao; + +import com.codesquad.airbnb.domain.Image; +import com.codesquad.airbnb.domain.Property; +import com.codesquad.airbnb.domain.PropertyDetail; +import com.codesquad.airbnb.domain.WishList; +import com.codesquad.airbnb.dto.PropertiesResponseDto; +import com.codesquad.airbnb.dto.PropertyDto; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.SqlParameterValue; +import org.springframework.stereotype.Repository; + +import javax.sql.DataSource; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.time.LocalDate; +import java.util.List; + +@Repository +public class PropertyDao { + + private final JdbcTemplate jdbcTemplate; + + @Autowired + public PropertyDao(DataSource dataSource) { + jdbcTemplate = new JdbcTemplate(dataSource); + } + + public class PropertyRowMapper implements RowMapper { + // interface method + public Property mapRow(ResultSet rs, int rowNum) throws SQLException { + Property property = new Property(rs.getLong("id"), rs.getString("name"), rs.getInt("price")); + return property; + } + } + + public class PropertyDetailRowMapper implements RowMapper { + + // interface method + @Override + public PropertyDto mapRow(ResultSet rs, int rowNum) throws SQLException { + Property property = new Property(rs.getLong("id"), rs.getString("name"), rs.getInt("price")); + PropertyDetail propertyDetail = new PropertyDetail(rs.getLong("property_id"), + rs.getString("description"), rs.getInt("max_occupancy"), + rs.getInt("cleaning_fee"), rs.getInt("bed_count"), rs.getInt("bath_count"), + rs.getString("room_type"), rs.getInt("review_count"), + rs.getDouble("latitude"), rs.getDouble("longitude")); + WishList wishList = new WishList(rs.getBoolean("bookmark")); + Image image = new Image(rs.getString("image_url")); + + return PropertyDto.of(property, propertyDetail, wishList, image, 0); + } + } + + public Property findById(Long id) { + String sql = "SELECT * FROM property WHERE id = ?"; + + return jdbcTemplate.queryForObject(sql, new PropertyRowMapper(), id); + } + + public List findAll() { + String sql = "SELECT * FROM property"; + List properties = jdbcTemplate.query(sql, new PropertyRowMapper()); + + return properties; + } + + public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, + int minPrice, int maxPrice, int adult, int children, int infant) { + int maxOccupancy = adult+children+infant; + String sql = "SELECT * FROM property, property_detail, image, wish_list " + + "RIGHT JOIN property p on wish_list.property_id = p.id " + + "WHERE property.id = property_detail.property_id and " + + "property.id = image.property_id and " + + "property.location_id = ? and " + + "property_detail.max_occupancy >= ? and " + + "property.price >= ? and property.price <= ?"; + + List propertyDto = jdbcTemplate.query(sql, new PropertyDetailRowMapper(), + new SqlParameterValue(Types.BIGINT, locationId), + new SqlParameterValue(Types.INTEGER, maxOccupancy), + new SqlParameterValue(Types.INTEGER, minPrice), + new SqlParameterValue(Types.INTEGER, maxPrice)); + PropertiesResponseDto propertyDtos = new PropertiesResponseDto(propertyDto); + + return propertyDtos; + } + +} + From ea8f40ffafb91728a6f03f64e8062105c1c4363a Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Sat, 22 May 2021 19:47:12 +0900 Subject: [PATCH 25/99] =?UTF-8?q?test:=20PropertyDaoTest=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codesquad/airbnb/dao/PropertyDaoTest.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java new file mode 100644 index 000000000..8a65d34bb --- /dev/null +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java @@ -0,0 +1,51 @@ +package com.codesquad.airbnb.dao; + +import com.codesquad.airbnb.domain.Property; +import com.codesquad.airbnb.dto.PropertiesResponseDto; +import com.codesquad.airbnb.dto.PropertyDto; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +public class PropertyDaoTest { + private Logger logger = LoggerFactory.getLogger(PropertyDaoTest.class); + + @Autowired + PropertyDao propertyDao; + + @Test + void propertyDao_findById() { + Property property = propertyDao.findById(1L); + assertThat(property).isNotNull(); + logger.info("Find property by propertyDao: {}", + property); + } + + @Test + void propertyDao_findByAll() { + List properties = propertyDao.findAll(); + for(Property property : properties){ + assertThat(property).isNotNull(); + logger.info("Find property by propertyDao: {}", + property); + } + } + + @Test + void propertyDao_findBy() { + PropertiesResponseDto properties = propertyDao.findBy(1L,null,null,10000, 100000, 2,0,0); + for(PropertyDto property : properties.getProperties()){ + assertThat(property).isNotNull(); + logger.info("Find property by propertyDao: {}", + property); + } + } +} From 9e3b6d3d5c6f1acb0c2df82c503ac20880b04e5b Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Mon, 24 May 2021 12:18:03 +0900 Subject: [PATCH 26/99] =?UTF-8?q?feat:=20Image=EB=A5=BC=20DB=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=94=B0=EB=A1=9C=20=EB=B9=BC=EC=98=A4=EB=8A=94=20?= =?UTF-8?q?=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Image가 별도의 List에 담아져야하는데, Dto를 이미지의 개수만큼 만드는 문제 때문에 별도로 DB에서 추출해 List에 넣는 방식으로 변경. --- .../com/codesquad/airbnb/dao/PropertyDao.java | 26 ++++++++++++++----- .../com/codesquad/airbnb/dto/PropertyDto.java | 17 +++++++----- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java index b63dbeb66..246ad6d9f 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java @@ -49,9 +49,7 @@ public PropertyDto mapRow(ResultSet rs, int rowNum) throws SQLException { rs.getString("room_type"), rs.getInt("review_count"), rs.getDouble("latitude"), rs.getDouble("longitude")); WishList wishList = new WishList(rs.getBoolean("bookmark")); - Image image = new Image(rs.getString("image_url")); - - return PropertyDto.of(property, propertyDetail, wishList, image, 0); + return PropertyDto.of(property, propertyDetail, wishList,0); } } @@ -71,23 +69,39 @@ public List findAll() { public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { int maxOccupancy = adult+children+infant; - String sql = "SELECT * FROM property, property_detail, image, wish_list " + - "RIGHT JOIN property p on wish_list.property_id = p.id " + + String sql = "SELECT * FROM property, property_detail, wish_list " + "WHERE property.id = property_detail.property_id and " + - "property.id = image.property_id and " + + "property.id = wish_list.property_id and " + "property.location_id = ? and " + "property_detail.max_occupancy >= ? and " + "property.price >= ? and property.price <= ?"; + // TODO: userid도 함께 확인해서 wishList를 찾는것이 좋을 것 같음... List propertyDto = jdbcTemplate.query(sql, new PropertyDetailRowMapper(), new SqlParameterValue(Types.BIGINT, locationId), new SqlParameterValue(Types.INTEGER, maxOccupancy), new SqlParameterValue(Types.INTEGER, minPrice), new SqlParameterValue(Types.INTEGER, maxPrice)); + + propertyDto.stream() + .forEach(propertyDto1 -> propertyDto1.addImage(findImageByPropertyId(propertyDto1.getPropertyId()))); + PropertiesResponseDto propertyDtos = new PropertiesResponseDto(propertyDto); return propertyDtos; } + private List findImageByPropertyId(Long propertyId) { + String sql = "SELECT * FROM image " + + "WHERE image.property_id = ?"; + + List images = jdbcTemplate.query(sql, new RowMapper() { + @Override + public Image mapRow(ResultSet rs, int rowNum) throws SQLException { + return new Image(rs.getString("image_url")); + } + }, propertyId); + return images; + } } diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java index 9dba18c0e..86c3b1774 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java @@ -2,13 +2,15 @@ import com.codesquad.airbnb.domain.*; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; public class PropertyDto { private Long propertyId; - private Set images = new HashSet<>(); + private List images = new ArrayList<>(); private String title; private boolean bookmark; private int pricePerNight; @@ -19,9 +21,8 @@ public class PropertyDto { public PropertyDto() { } - public PropertyDto(Long propertyId, Image image, String title, boolean bookmark, int pricePerNight, int totalPrice, int reviewCount, double rating) { + public PropertyDto(Long propertyId, String title, boolean bookmark, int pricePerNight, int totalPrice, int reviewCount, double rating) { this.propertyId = propertyId; - this.images.add(image); this.title = title; this.bookmark = bookmark; this.pricePerNight = pricePerNight; @@ -30,16 +31,20 @@ public PropertyDto(Long propertyId, Image image, String title, boolean bookmark, this.rating = rating; } - public static PropertyDto of(Property property, PropertyDetail propertyDetail, WishList wishList, Image image, int totalPrice) { - return new PropertyDto(property.getId(), image, property.getName(), wishList.isBookmark(), property.getPrice(), totalPrice, + public static PropertyDto of(Property property, PropertyDetail propertyDetail, WishList wishList, int totalPrice) { + return new PropertyDto(property.getId(), property.getName(), wishList.isBookmark(), property.getPrice(), totalPrice, propertyDetail.getReviewCount(), propertyDetail.getRating()); } + public void addImage(List images) { + images.stream().forEach(image -> this.images.add(image.getImageUrl())); + } + public Long getPropertyId() { return propertyId; } - public Set getImages() { + public List getImages() { return images; } From d8d0bca1adddb117b1bc53bbc1a649b34a832083 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Mon, 24 May 2021 17:45:54 +0900 Subject: [PATCH 27/99] =?UTF-8?q?refactor:=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?UTF-8?q?=EC=97=90=20id=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DAO에서 리저트셋으로 데이터를 가져와 내보낼 때 id 지정 --- .../java/com/codesquad/airbnb/domain/Category.java | 11 ++++++++++- .../java/com/codesquad/airbnb/domain/Location.java | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Category.java b/BE/src/main/java/com/codesquad/airbnb/domain/Category.java index 1cca80bac..565bf3d6a 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/Category.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Category.java @@ -11,7 +11,8 @@ public class Category { private String imageUrl; - public Category(String name, String imageUrl) { + public Category(Long id, String name, String imageUrl) { + this.id = id; this.name = name; this.imageUrl = imageUrl; } @@ -27,4 +28,12 @@ public String getName() { public String getImageUrl() { return imageUrl; } + + @Override + public String toString() { + return "Category{" + + "id=" + id + + ", name='" + name + '\'' + + '}'; + } } diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Location.java b/BE/src/main/java/com/codesquad/airbnb/domain/Location.java index 98adae2e9..e3f8ac97d 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/Location.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Location.java @@ -12,6 +12,7 @@ public class Location { private String imageUrl; public Location(Long id, String name, String imageUrl) { + this.id = id; this.name = name; this.imageUrl = imageUrl; } From b73bca3fdc53e9a7bd292bcf8a44c87017f4e542 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Mon, 24 May 2021 17:48:01 +0900 Subject: [PATCH 28/99] =?UTF-8?q?refactor:=20=EC=B9=B4=ED=85=8C=EA=B3=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=83=9D=EC=84=B1=EC=9E=90=EC=97=90=20id=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=A1=9C=20=EC=BD=94=EB=93=9C=EB=B3=80?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java index 055666726..f8ef3c87a 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java @@ -26,7 +26,7 @@ public List findAll() { RowMapper categoryMapper = new RowMapper() { @Override public Category mapRow(ResultSet rs, int rowNum) throws SQLException { - return new Category(rs.getString("name"), rs.getString("image_url")); + return new Category(rs.getLong("id"), rs.getString("name"), rs.getString("image_url")); } }; return jdbcTemplate.query(sql, categoryMapper); From 88d3c965293be5e76f28468844dbdec33b42ff05 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Mon, 24 May 2021 17:51:01 +0900 Subject: [PATCH 29/99] =?UTF-8?q?refactor:=20=EC=A4=91=EB=B3=B5=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/codesquad/airbnb/dao/LocationDAO.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java index 41832f686..beff7ba38 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java @@ -21,11 +21,12 @@ public LocationDAO(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } - public class LocationMapper implements RowMapper { + private static class LocationMapper implements RowMapper { public Location mapRow(ResultSet resultSet, int rowNumber) throws SQLException { Location location = new Location(resultSet.getLong("id"), resultSet.getString("name"), resultSet.getString("image_url")); + return location; } } @@ -33,16 +34,11 @@ public Location mapRow(ResultSet resultSet, int rowNumber) throws SQLException { public Location findById(Long id) { String sql = "Select id, name, image_url FROM location WHERE id = ?"; - RowMapper locationMapper = (rs, rowNum) -> { - return new Location(rs.getLong("id"), rs.getString("name"), rs.getString("image_url")); - }; - - return jdbcTemplate.queryForObject(sql, locationMapper, id); + return jdbcTemplate.queryForObject(sql, new LocationMapper(), id); } public List findAll() { String sql = "SELECT id, name, image_url FROM location"; - List locations = jdbcTemplate.query(sql, new LocationMapper()); - return locations; + return jdbcTemplate.query(sql, new LocationMapper()); } } From e51a686a31a63911451d83ff295478e9b8350f05 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Mon, 24 May 2021 17:51:22 +0900 Subject: [PATCH 30/99] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=EC=97=90=20?= =?UTF-8?q?=EB=B3=B4=EB=82=BC=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EC=9A=A9=20DTO?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/dto/MainDTO.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/MainDTO.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/MainDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/MainDTO.java new file mode 100644 index 000000000..abb579696 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dto/MainDTO.java @@ -0,0 +1,29 @@ +package com.codesquad.airbnb.dto; + +import com.codesquad.airbnb.domain.Category; +import com.codesquad.airbnb.domain.Location; + +import java.util.List; + +public class MainDTO { + + private List locations; + + private List categories; + + public List getLocations() { + return locations; + } + + public List getCategories() { + return categories; + } + + public void setLocations(List locations) { + this.locations = locations; + } + + public void setCategories(List categories) { + this.categories = categories; + } +} From 98e194e77393e217f90109c393e4be5bcaa8f701 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Mon, 24 May 2021 17:54:24 +0900 Subject: [PATCH 31/99] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=9A=A9=20=EB=B9=84=EC=A7=80=EB=8B=88?= =?UTF-8?q?=EC=8A=A4=20=EB=A1=9C=EC=A7=81=EC=9D=84=20=EA=B0=80=EC=A7=88=20?= =?UTF-8?q?MainService=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codesquad/airbnb/service/MainService.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/service/MainService.java diff --git a/BE/src/main/java/com/codesquad/airbnb/service/MainService.java b/BE/src/main/java/com/codesquad/airbnb/service/MainService.java new file mode 100644 index 000000000..685cfc796 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/service/MainService.java @@ -0,0 +1,27 @@ +package com.codesquad.airbnb.service; + +import com.codesquad.airbnb.dao.CategoryDAO; +import com.codesquad.airbnb.dao.LocationDAO; +import com.codesquad.airbnb.dto.MainDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class MainService { + + private final CategoryDAO categoryDAO; + private final LocationDAO locationDAO; + + @Autowired + public MainService(CategoryDAO categoryDAO, LocationDAO locationDAO) { + this.categoryDAO = categoryDAO; + this.locationDAO = locationDAO; + } + + public MainDTO browseMainDTO() { + MainDTO mainDTO = new MainDTO(); + mainDTO.setCategories(categoryDAO.findAll()); + mainDTO.setLocations(locationDAO.findAll()); + return mainDTO; + } +} From 8b247e211292f4f8d992c123b4916fe2b2927d83 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Mon, 24 May 2021 17:54:38 +0900 Subject: [PATCH 32/99] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/controller/MainController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/controller/MainController.java diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/MainController.java b/BE/src/main/java/com/codesquad/airbnb/controller/MainController.java new file mode 100644 index 000000000..5ae6fadac --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/controller/MainController.java @@ -0,0 +1,23 @@ +package com.codesquad.airbnb.controller; + +import com.codesquad.airbnb.dto.MainDTO; +import com.codesquad.airbnb.service.MainService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class MainController { + + private MainService mainService; + + @Autowired + public MainController(MainService mainService) { + this.mainService = mainService; + } + + @GetMapping("/main") + public MainDTO getMain() { + return mainService.browseMainDTO(); + } +} From 8bd954d4bdc1b0a618bb1ecb916af35599ef7ef5 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Mon, 24 May 2021 17:55:04 +0900 Subject: [PATCH 33/99] =?UTF-8?q?test:=20LocationDAOTest=EC=97=90=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=EB=94=94=EA=B0=92=EC=9D=84=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC=ED=95=98=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EA=B5=AC=EB=AC=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java index 969a27e93..cbc388653 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/LocationDAOTest.java @@ -24,6 +24,7 @@ void locationDAO_findById() { Location location = locationDAO.findById(1L); assertThat(location).isNotNull(); assertThat(location.getName()).isEqualTo("서울"); + assertThat(location.getId()).isNotNull(); logger.info("location found: {}", location); } From 9253e7bc3417609179b692e949479f01bf4e1641 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Mon, 24 May 2021 18:07:45 +0900 Subject: [PATCH 34/99] =?UTF-8?q?refactor:=20Image=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=ED=95=9C=20=EA=B2=83=20String=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=B6=94=EC=B6=9C=20=ED=95=98=EB=8A=94=EA=B2=83?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 쿼리에서 필요한 정보만 가져오도록 수정 --- .../com/codesquad/airbnb/dao/PropertyDao.java | 40 +++++++++---------- .../com/codesquad/airbnb/dto/PropertyDto.java | 10 ++--- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java index 246ad6d9f..a5d0f3e5e 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java @@ -1,6 +1,5 @@ package com.codesquad.airbnb.dao; -import com.codesquad.airbnb.domain.Image; import com.codesquad.airbnb.domain.Property; import com.codesquad.airbnb.domain.PropertyDetail; import com.codesquad.airbnb.domain.WishList; @@ -42,19 +41,14 @@ public class PropertyDetailRowMapper implements RowMapper { // interface method @Override public PropertyDto mapRow(ResultSet rs, int rowNum) throws SQLException { - Property property = new Property(rs.getLong("id"), rs.getString("name"), rs.getInt("price")); - PropertyDetail propertyDetail = new PropertyDetail(rs.getLong("property_id"), - rs.getString("description"), rs.getInt("max_occupancy"), - rs.getInt("cleaning_fee"), rs.getInt("bed_count"), rs.getInt("bath_count"), - rs.getString("room_type"), rs.getInt("review_count"), - rs.getDouble("latitude"), rs.getDouble("longitude")); - WishList wishList = new WishList(rs.getBoolean("bookmark")); - return PropertyDto.of(property, propertyDetail, wishList,0); + return PropertyDto.of(rs.getLong("id"), rs.getString("name"), + rs.getBoolean("bookmark"), rs.getInt("price"), + 0, rs.getInt("review_count"), rs.getInt("rating")); } } public Property findById(Long id) { - String sql = "SELECT * FROM property WHERE id = ?"; + String sql = "SELECT p.id, p.name, p.price FROM property as p WHERE id = ?"; return jdbcTemplate.queryForObject(sql, new PropertyRowMapper(), id); } @@ -69,12 +63,16 @@ public List findAll() { public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { int maxOccupancy = adult+children+infant; - String sql = "SELECT * FROM property, property_detail, wish_list " + - "WHERE property.id = property_detail.property_id and " + - "property.id = wish_list.property_id and " + - "property.location_id = ? and " + - "property_detail.max_occupancy >= ? and " + - "property.price >= ? and property.price <= ?"; + String sql = "select p.id, p.name, wl.bookmark, p.price, pd.review_count, pd.rating " + + "from property as p, " + + "property_detail as pd, " + + "wish_list as wl " + + "where p.id = pd.property_id " + + "and p.id = wl.property_id " + + "and p.location_id = ? " + + "and pd.max_occupancy >= ? " + + "and p.price >= ? " + + "and p.price <= ?"; // TODO: userid도 함께 확인해서 wishList를 찾는것이 좋을 것 같음... List propertyDto = jdbcTemplate.query(sql, new PropertyDetailRowMapper(), @@ -84,21 +82,21 @@ public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDat new SqlParameterValue(Types.INTEGER, maxPrice)); propertyDto.stream() - .forEach(propertyDto1 -> propertyDto1.addImage(findImageByPropertyId(propertyDto1.getPropertyId()))); + .forEach(propertyDto1 -> propertyDto1.setImages(findImageByPropertyId(propertyDto1.getPropertyId()))); PropertiesResponseDto propertyDtos = new PropertiesResponseDto(propertyDto); return propertyDtos; } - private List findImageByPropertyId(Long propertyId) { + private List findImageByPropertyId(Long propertyId) { String sql = "SELECT * FROM image " + "WHERE image.property_id = ?"; - List images = jdbcTemplate.query(sql, new RowMapper() { + List images = jdbcTemplate.query(sql, new RowMapper() { @Override - public Image mapRow(ResultSet rs, int rowNum) throws SQLException { - return new Image(rs.getString("image_url")); + public String mapRow(ResultSet rs, int rowNum) throws SQLException { + return rs.getString("image_url"); } }, propertyId); return images; diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java index 86c3b1774..2b5b3c113 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java @@ -31,13 +31,13 @@ public PropertyDto(Long propertyId, String title, boolean bookmark, int pricePer this.rating = rating; } - public static PropertyDto of(Property property, PropertyDetail propertyDetail, WishList wishList, int totalPrice) { - return new PropertyDto(property.getId(), property.getName(), wishList.isBookmark(), property.getPrice(), totalPrice, - propertyDetail.getReviewCount(), propertyDetail.getRating()); + public static PropertyDto of(Long propertyId, String propertyTitle, boolean bookmark, int price, int totalPrice, int reviewCount, double rating) { + return new PropertyDto(propertyId, propertyTitle, bookmark, price, totalPrice, + reviewCount, rating); } - public void addImage(List images) { - images.stream().forEach(image -> this.images.add(image.getImageUrl())); + public void setImages(List images) { + this.images = images; } public Long getPropertyId() { From a6a24b934fa105337cec2e21fb2002fe9d198166 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Mon, 24 May 2021 18:08:29 +0900 Subject: [PATCH 35/99] =?UTF-8?q?feat:=20=EA=B2=80=EC=83=89=20=EC=BB=A8?= =?UTF-8?q?=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 특정 데이터를 입력하여 검색하면, 결과값이 나오는 컨트롤러 생성 --- .../codesquad/airbnb/SearchController.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/SearchController.java diff --git a/BE/src/main/java/com/codesquad/airbnb/SearchController.java b/BE/src/main/java/com/codesquad/airbnb/SearchController.java new file mode 100644 index 000000000..75f827d20 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/SearchController.java @@ -0,0 +1,36 @@ +package com.codesquad.airbnb; + +import com.codesquad.airbnb.dao.PropertyDao; +import com.codesquad.airbnb.dto.PropertiesResponseDto; +import com.codesquad.airbnb.dto.PropertyDto; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; + +@RestController +@RequestMapping("/search") +public class SearchController { + + PropertyDao propertyDao; + + public SearchController(PropertyDao propertyDao) { + this.propertyDao = propertyDao; + } + + @GetMapping() + public ResponseEntity search( + @RequestParam(value = "locationId", required = false) Long locationId, + @RequestParam(value = "checkIn" , required = false)LocalDate checkIn, + @RequestParam(value = "checkOut" , required = false)LocalDate checkOut, + @RequestParam(value = "minPrice" , required = false, defaultValue = "0")int minPrice, + @RequestParam(value = "maxPrice" , required = false, defaultValue = "1000000")int maxPrice, + @RequestParam(value = "adult" , required = false, defaultValue = "0")int adult, + @RequestParam(value = "children" , required = false, defaultValue = "0")int children, + @RequestParam(value = "infant" , required = false, defaultValue = "0")int infant + ) { + PropertiesResponseDto propertiesResponseDto = propertyDao.findBy(locationId,checkIn,checkOut,minPrice,maxPrice,adult,children,infant); + return ResponseEntity.ok().body(propertiesResponseDto); + } + +} From 94566b8cd45de087decd0d03afb469d69228a6be Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Mon, 24 May 2021 18:08:48 +0900 Subject: [PATCH 36/99] =?UTF-8?q?chore:=20wish=5Flist=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=9E=85=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/insert.sql | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/BE/src/main/resources/insert.sql b/BE/src/main/resources/insert.sql index 47ad2b94a..f72f2023b 100644 --- a/BE/src/main/resources/insert.sql +++ b/BE/src/main/resources/insert.sql @@ -198,3 +198,22 @@ values ('Outdoor getaways', 'https://user-images.githubusercontent.com/59776016/ ('Entire homes','https://user-images.githubusercontent.com/59776016/118950072-d1bc2980-b994-11eb-9392-e66b9b4bdd0b.png'), ('Pets allowed','https://user-images.githubusercontent.com/59776016/118950087-d4b71a00-b994-11eb-9311-b7271e0fc3b3.png'); +insert into wish_list(property_id, bookmark) +values (1, false), + (2,false), + (3,false), + (4,false), + (5, false), + (6,false), + (7,false), + (8,false), + (9, false), + (10,false), + (11,false), + (12,false), + (13, false), + (14,false), + (15,false), + (16,false), + (17, false), + (18,false); From e1c14a594e52540cfd46981a8505c944f9501e61 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 12:20:42 +0900 Subject: [PATCH 37/99] =?UTF-8?q?feat:=20Reservation=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codesquad/airbnb/domain/Reservation.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java b/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java index 007653090..c2f4cbefc 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java @@ -1,6 +1,99 @@ package com.codesquad.airbnb.domain; +import org.springframework.data.annotation.Id; + +import java.time.LocalDate; + public class Reservation { + @Id + private Long id; + private LocalDate checkIn; + private LocalDate checkOut; + private int totalPrice; + private int guestCount; + private Long userId; + private Long propertyId; + + public Reservation() { + } + + public Reservation(Long id, LocalDate checkIn, LocalDate checkOut, int totalPrice, int guestCount, Long userId, Long propertyId) { + this.id = id; + this.checkIn = checkIn; + this.checkOut = checkOut; + this.totalPrice = totalPrice; + this.guestCount = guestCount; + this.userId = userId; + this.propertyId = propertyId; + } + + public Long getId() { + return id; + } + + public LocalDate getCheckIn() { + return checkIn; + } + + public LocalDate getCheckOut() { + return checkOut; + } + + public int getTotalPrice() { + return totalPrice; + } + + public int getGuestCount() { + return guestCount; + } + + public Long getUserId() { + return userId; + } + + public Long getPropertyId() { + return propertyId; + } + + public void setId(Long id) { + this.id = id; + } + + public void setCheckIn(LocalDate checkIn) { + this.checkIn = checkIn; + } + + public void setCheckOut(LocalDate checkOut) { + this.checkOut = checkOut; + } + + public void setTotalPrice(int totalPrice) { + this.totalPrice = totalPrice; + } + + public void setGuestCount(int guestCount) { + this.guestCount = guestCount; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public void setPropertyId(Long propertyId) { + this.propertyId = propertyId; + } + @Override + public String toString() { + return "Reservation{" + + "id=" + id + + ", checkIn=" + checkIn + + ", checkOut=" + checkOut + + ", totalPrice=" + totalPrice + + ", guestCount=" + guestCount + + ", userId=" + userId + + ", propertyId=" + propertyId + + '}'; + } } From f4596a4ec8af6f6133dad13e12185638d325fbbb Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 12:20:46 +0900 Subject: [PATCH 38/99] =?UTF-8?q?chore:=20table=20Insert=EC=97=90=20rating?= =?UTF-8?q?=20=ED=95=AD=EB=AA=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/insert.sql | 38 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/BE/src/main/resources/insert.sql b/BE/src/main/resources/insert.sql index f72f2023b..1e1a531c2 100644 --- a/BE/src/main/resources/insert.sql +++ b/BE/src/main/resources/insert.sql @@ -143,54 +143,54 @@ VALUES ('https://user-images.githubusercontent.com/69128652/118953932-3cbb2f80-b insert into property_detail(property_id, description, max_occupancy, cleaning_fee, occupied_date, bed_count, bath_count, - room_type, review_count, latitude, longitude) + room_type, review_count, latitude, longitude, rating) VALUES (1, '집 내부 전체를 리모델링한 분위기있는 공간입니다. 복잡한 홍대에서 조금만 걸으면 아기자기한 느낌의 상수동이에요. 6호선 상수역은 바로 앞이라 어디든 이용이 편리합니다', - 6, 6400, null, 4, 2, 'entire house', 42, 37.5468631, 126.922349), + 6, 6400, null, 4, 2, 'entire house', 42, 37.5468631, 126.922349, 4.7), (2, 'Hello! We are locted in 5 minutes walking distance from Hongik Univ station Exit 4. If you are a solo or a couple traveler I believe our house is perfect for you. The house is clean and cozy, located in a safe and quiet residential area.', - 3, 7800, null, 1, 1, 'private room', 2, 37.555742, 126.931276), + 3, 7800, null, 1, 1, 'private room', 2, 37.555742, 126.931276, 4.9), (3, '- 대중교통으로 대한민국의 모든 Hot Place를 "한번에" (명동, 인사동, 강남, 광화문, 동대문 등등). - 안전한 숙소 (숙소 1분 내 경찰서 위치). - 도심속 조용한 숙소. - 입실 전 / 후 캐리어 보관 서비스 제공.', - 2, 4300, null, 1, 1, 'entire house', 19, 37.579678, 127.005000), + 2, 4300, null, 1, 1, 'entire house', 19, 37.579678, 127.005000, 4.2), (4, '교통의 요지 선릉역에 위치한 신축건물', - 4, 8900, null, 2, 1, 'private room', 104, 37.506602, 127.050994), + 4, 8900, null, 2, 1, 'private room', 104, 37.506602, 127.050994, 4.6), (5, 'Room is right next to Gangnam station exit no.1', - 6, 6400, null, 4, 2, 'entire house', 9, 37.496451, 127.030199), + 6, 6400, null, 4, 2, 'entire house', 9, 37.496451, 127.030199, 4.5), (6, '여의도와 한강이 한눈에 보이는 전망입니다. 야경이 매우 아름답고 굉장히 꺠끗한 숙소 입니다.', - 4, 12400, null, 2, 2, 'entire house', 251, 37.516869, 126.914027), + 4, 12400, null, 2, 2, 'entire house', 251, 37.516869, 126.914027, 4.3), (7, '고층에서 송도 센트럴파크와 송도 시내 전망을 바라볼 수 있습니다.', - 3, 7830, null, 3, 2, 'entire house', 234, 37.385845, 126.635701), + 3, 7830, null, 3, 2, 'entire house', 234, 37.385845, 126.635701, 4.1), (8, 'Bin''s House is a modern Mediterranean-style art building featuring fine views and works of art in Midan City, Yeongjongdo Island.', - 6, 3249, null, 2, 1, 'entire house', 656, 37.515898, 126.531973), + 6, 3249, null, 2, 1, 'entire house', 656, 37.515898, 126.531973, 4.8), (9, 'Main Equu는 [게스트하우스에쿠]가 대표할수있는 가장 전망과 시설이 좋은 방입니다', - 8, 6890, null, 1, 1, 'entire house', 22, 37.539679, 126.643872), + 8, 6890, null, 1, 1, 'entire house', 22, 37.539679, 126.643872, 3.9), (10, '깨끗하고 안락한 ''엄마의꿈''에서 편안하고 행복한 시간 보내세요', - 2, 19850, null, 1, 1, 'entire house', 7, 35.869576, 128.602858), + 2, 19850, null, 1, 1, 'entire house', 7, 35.869576, 128.602858, 4.2), (11, 'JJun''S House #2입니다 >저희 숙소는 KTX동대구역, 동대구환승버스터미널,대구 1호선 도시철도, 신세계백화점에서 도보로 3분거리에 있는 저희 숙소의 특징은 아늑하고 편안한 공간를 즐길 수 있으며, 최대 2명까지 숙박이 가능합니다.', - 2, 4580, null, 1, 1, 'entire house', 12, 35.882075, 128.626833), + 2, 4580, null, 1, 1, 'entire house', 12, 35.882075, 128.626833, 4.5), (12, '저희 cosy하우스를 눈여겨봐주셔서 감사합니다.. 철저한 침구교체, 방역작업 및 청소는 기본이며 퀄리티 높은 가구과 가전에서 5성급 호텔 이상의 안락함과 편안함을 느껴보시길 바랍니다..', - 2, 2340, null, 1, 1, 'entire house', 0, 35.859388, 128.625969), + 2, 2340, null, 1, 1, 'entire house', 0, 35.859388, 128.625969, 0.0), (13, '♥︎ 2021년 5월 신규 오픈 ♥︎ 소중한 사람과 행복한 시간을 보내고 싶다면 …? 오아시스 하우스는 특별한 사람에게 좋은 추억을 선물하는 공간이 되고 싶습니다.', - 4, 29960, null, 2, 2, 'entire house', 12, 35.158648, 126.849985), + 4, 29960, null, 2, 2, 'entire house', 12, 35.158648, 126.849985, 4.7), (14, '제 숙소는 광주버스터미널에서 도보로 3분거리, 길건너에는 신세계백화점과 이마트, CGV, 터미널 식당가', - 3, 36690, null, 1, 1, 'entire house', 87, 35.160874, 126.884962), + 3, 36690, null, 1, 1, 'entire house', 87, 35.160874, 126.884962, 4.5), (15, '운천저수지 공원 뷰 (2021년 뷰는 지하철 공사가 일부 진행 중입니다:)', - 2, 23348, null, 1, 12, 'private room', 567, 35.147699, 126.854781), + 2, 23348, null, 1, 12, 'private room', 567, 35.147699, 126.854781, 4.9), (16, '제주만의 분위기가 물씬 나는 작고 조용한 저지예술인 마을에 위치한 숙소입니다. 감성적인 분위기 속에서 편안하고 즐겁게 쉬어갈 수 있습니다.', - 4, 1273, null, 2, 2, 'entire house', 432, 33.342413, 126.256858), + 4, 1273, null, 2, 2, 'entire house', 432, 33.342413, 126.256858, 4.6), (17, '제주도 동쪽 조용한 행원리 마을 안쪽에 위치한 "월정夜" 입니다. 돌담으로 둘러싸인 제주도의 예스러운 돌집과 따스한 햇빛이 비치는 마당이 있는 ''월정야''는 창문으로 보이는 한적하고 제주스런 시골 풍경과 함께 편안하게 머무르실 수 있는 숙소입니다.', - 6, 5600, null, 4, 2, 'entire house', 67, 33.551302, 126.807569), + 6, 5600, null, 4, 2, 'entire house', 67, 33.551302, 126.807569, 4.2), (18, '제주 애월읍 곽지해수욕장(과물해수욕장) 근처에 있는 독채 렌탈 하우스입니다.', - 5, 54000, null, 2, 3, 'entire house', 34, 33.447873, 126.307671); + 5, 54000, null, 2, 3, 'entire house', 34, 33.447873, 126.307671, 4.1); insert into property_category(name, image_url) values ('Outdoor getaways', 'https://user-images.githubusercontent.com/59776016/118950055-ce28a280-b994-11eb-8c89-e0190cdeee68.png'), From 1028aaedec0abcb862277ac36fbc6cfaf4bf1ee5 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 12:21:37 +0900 Subject: [PATCH 39/99] =?UTF-8?q?test:=20PropertyDaoTest=EC=97=90=20LocalD?= =?UTF-8?q?ate=20=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java index 8a65d34bb..d38161bb3 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java @@ -9,8 +9,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import java.time.LocalDate; import java.util.List; -import java.util.Map; + import static org.assertj.core.api.Assertions.assertThat; @@ -41,7 +42,8 @@ void propertyDao_findByAll() { @Test void propertyDao_findBy() { - PropertiesResponseDto properties = propertyDao.findBy(1L,null,null,10000, 100000, 2,0,0); + PropertiesResponseDto properties = propertyDao.findBy(1L, LocalDate.of(2021,5,20),LocalDate.of(2021,5,23), + 10000, 100000, 2,0,0); for(PropertyDto property : properties.getProperties()){ assertThat(property).isNotNull(); logger.info("Find property by propertyDao: {}", From 8b5446dd0aa94e65e6673e95365eb7f3821e08b7 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 12:22:18 +0900 Subject: [PATCH 40/99] =?UTF-8?q?feat:=20ReservationDAO=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit reservation 타입을 받아 데이터를 추가하는 insertReservation, ReservationId, userId, propertyId로 예약을 검색하는 각각의 메서드 구현 --- .../codesquad/airbnb/dao/ReservationDAO.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java new file mode 100644 index 000000000..d82c93c71 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java @@ -0,0 +1,74 @@ +package com.codesquad.airbnb.dao; + +import com.codesquad.airbnb.domain.Reservation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcInsert; +import org.springframework.stereotype.Repository; + +import javax.sql.DataSource; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.time.LocalDate; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Repository +public class ReservationDAO { + + private JdbcTemplate jdbcTemplate; + private SimpleJdbcInsert simpleJdbcInsert; + + @Autowired + public ReservationDAO(DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + this.simpleJdbcInsert = new SimpleJdbcInsert(dataSource).withTableName("reservation"); + } + + private static class ReservationMapper implements RowMapper { + public Reservation mapRow(ResultSet resultSet, int rowNumber) throws SQLException { + return new Reservation(resultSet.getLong("id"), + resultSet.getDate("check_in_date").toLocalDate(), + resultSet.getDate("check_out_date").toLocalDate(), + resultSet.getInt("total_price"), + resultSet.getInt("guest_count"), + resultSet.getLong("user_id"), + resultSet.getLong("property_id")); + } + } + + public int insertReservation(Reservation reservation) { + Map parameters = new HashMap<>(); + parameters.put("check_in_date", reservation.getCheckIn()); + parameters.put("check_out_date", reservation.getCheckOut()); + parameters.put("total_price", reservation.getTotalPrice()); + parameters.put("guest_count", reservation.getGuestCount()); + parameters.put("user_id", reservation.getUserId()); + parameters.put("property_id", reservation.getPropertyId()); + + return simpleJdbcInsert.execute(parameters); + } + + public Reservation findReservationById(Long id) { + String sql = "SELECT id, check_in_date, check_out_date, total_price, guest_count, user_id, property_id " + + "FROM reservation WHERE id = ?"; + + return jdbcTemplate.queryForObject(sql, new ReservationMapper(), id); + } + + public List findAllReservationsByUserId(Long userId) { + String sql = "SELECT id, check_in_date, check_out_date, total_price, guest_count " + + "FROM reservation WHERE user_id = ?"; + + return jdbcTemplate.query(sql, new ReservationMapper(), userId); + } + + public List findAllReservationsByPropertyId(Long propertyId) { + String sql = "SELECT id, check_in_date, check_out_date, total_price, guest_count " + + "FROM reservation WHERE property_id = ?"; + + return jdbcTemplate.query(sql, new ReservationMapper(), propertyId); + } +} From 95eb6fac08a5244ac94a604827a103ce6e351e05 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 12:23:02 +0900 Subject: [PATCH 41/99] =?UTF-8?q?refactor:=20CheckIn,=20CheckOut=20?= =?UTF-8?q?=EB=82=A0=EC=A7=9C=20=EA=B8=B0=EA=B0=84=EC=9D=84=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=ED=95=B4=EC=84=9C=20totalPrice=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=B0=A9=EC=8B=9D=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 날짜를 계산하는 로직을 추가하여, totalPrice를 set 할 수 있는 방향으로 메서드를 추가 후 변경해주었다. --- .../com/codesquad/airbnb/dao/PropertyDao.java | 13 +++++++++---- .../com/codesquad/airbnb/dto/PropertyDto.java | 15 +++++++++------ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java index a5d0f3e5e..563fbfb04 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java @@ -1,8 +1,6 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Property; -import com.codesquad.airbnb.domain.PropertyDetail; -import com.codesquad.airbnb.domain.WishList; import com.codesquad.airbnb.dto.PropertiesResponseDto; import com.codesquad.airbnb.dto.PropertyDto; import org.springframework.beans.factory.annotation.Autowired; @@ -16,6 +14,7 @@ import java.sql.SQLException; import java.sql.Types; import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.List; @Repository @@ -43,7 +42,7 @@ public class PropertyDetailRowMapper implements RowMapper { public PropertyDto mapRow(ResultSet rs, int rowNum) throws SQLException { return PropertyDto.of(rs.getLong("id"), rs.getString("name"), rs.getBoolean("bookmark"), rs.getInt("price"), - 0, rs.getInt("review_count"), rs.getInt("rating")); + rs.getInt("review_count"), rs.getDouble("rating")); } } @@ -75,6 +74,8 @@ public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDat "and p.price <= ?"; // TODO: userid도 함께 확인해서 wishList를 찾는것이 좋을 것 같음... + long diff = ChronoUnit.DAYS.between(checkIn, checkOut); + List propertyDto = jdbcTemplate.query(sql, new PropertyDetailRowMapper(), new SqlParameterValue(Types.BIGINT, locationId), new SqlParameterValue(Types.INTEGER, maxOccupancy), @@ -82,7 +83,11 @@ public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDat new SqlParameterValue(Types.INTEGER, maxPrice)); propertyDto.stream() - .forEach(propertyDto1 -> propertyDto1.setImages(findImageByPropertyId(propertyDto1.getPropertyId()))); + .forEach(propertyDto1 -> { + propertyDto1.setImages(findImageByPropertyId(propertyDto1.getPropertyId())); + propertyDto1.setTotalPrice(diff); + } + ); PropertiesResponseDto propertyDtos = new PropertiesResponseDto(propertyDto); diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java index 2b5b3c113..0d48945a5 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java @@ -14,25 +14,24 @@ public class PropertyDto { private String title; private boolean bookmark; private int pricePerNight; - private int totalPrice; + private long totalPrice; private int reviewCount; private double rating; public PropertyDto() { } - public PropertyDto(Long propertyId, String title, boolean bookmark, int pricePerNight, int totalPrice, int reviewCount, double rating) { + public PropertyDto(Long propertyId, String title, boolean bookmark, int pricePerNight, int reviewCount, double rating) { this.propertyId = propertyId; this.title = title; this.bookmark = bookmark; this.pricePerNight = pricePerNight; - this.totalPrice = totalPrice; this.reviewCount = reviewCount; this.rating = rating; } - public static PropertyDto of(Long propertyId, String propertyTitle, boolean bookmark, int price, int totalPrice, int reviewCount, double rating) { - return new PropertyDto(propertyId, propertyTitle, bookmark, price, totalPrice, + public static PropertyDto of(Long propertyId, String propertyTitle, boolean bookmark, int price, int reviewCount, double rating) { + return new PropertyDto(propertyId, propertyTitle, bookmark, price, reviewCount, rating); } @@ -40,6 +39,10 @@ public void setImages(List images) { this.images = images; } + public void setTotalPrice(long totalDate) { + totalPrice = totalDate * pricePerNight; + } + public Long getPropertyId() { return propertyId; } @@ -60,7 +63,7 @@ public int getPricePerNight() { return pricePerNight; } - public int getTotalPrice() { + public long getTotalPrice() { return totalPrice; } From 223132aa166ef87618c860e8e932b9e5d0a69e17 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 12:23:32 +0900 Subject: [PATCH 42/99] =?UTF-8?q?test:=20ReservationDAO=EC=9D=98=20insert,?= =?UTF-8?q?=20findById,=20findByUserId=EB=A5=BC=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/dao/ReservationDAOTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java new file mode 100644 index 000000000..dd9cc8a91 --- /dev/null +++ b/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java @@ -0,0 +1,44 @@ +package com.codesquad.airbnb.dao; + +import com.codesquad.airbnb.domain.Reservation; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.util.List; + +import static org.assertj.core.api.Assertions.*; + +@SpringBootTest +@Transactional +class ReservationDAOTest { + + @Autowired + ReservationDAO reservationDAO; + + @Test + void reservationDAO_insertTest() { + Reservation reservation = new Reservation(1L, LocalDate.of(2021, 9, 13), + LocalDate.of(2021, 9, 20), + 200000, 4, 1L, 1L); + + assertThat(reservationDAO.insertReservation(reservation)).isEqualTo(1); + } + + @Test + void reservationDAO_findByIdTest() { + Reservation reservation = reservationDAO.findReservationById(1L); + + assertThat(reservation).isNotNull(); + assertThat(reservation.getId()).isEqualTo(1L); + } + + @Test + void setReservationDAO_findByUserIdTest() { + List reservation = reservationDAO.findAllReservationsByUserId(1L); + + assertThat(reservation.get(0).getUserId()).isEqualTo(1L); + } +} From ccc96e700ad6051da94c372af6054b1b1de8afc4 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 12:24:23 +0900 Subject: [PATCH 43/99] =?UTF-8?q?refactor:=20reservation=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=EC=97=90=20id=20=EC=BB=AC=EB=9F=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/schema.sql | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/BE/src/main/resources/schema.sql b/BE/src/main/resources/schema.sql index a712e50af..ae07a7be4 100644 --- a/BE/src/main/resources/schema.sql +++ b/BE/src/main/resources/schema.sql @@ -3,15 +3,15 @@ use airbnb; create table if not exists location ( - id BIGINT primary key auto_increment, - name varchar(45), + id BIGINT primary key auto_increment, + name varchar(45), image_url varchar(255) ); create table if not exists category ( - id BIGINT PRIMARY KEY AUTO_INCREMENT, - name VARCHAR(45), + id BIGINT PRIMARY KEY AUTO_INCREMENT, + name VARCHAR(45), image_url VARCHAR(1000) ); @@ -29,25 +29,25 @@ create table if not exists property_detail property_id bigint, description varchar(255), max_occupancy int, - cleaning_fee int, - occupied_date date, + cleaning_fee int, + occupied_date date, bed_count int, bath_count int, room_type varchar(45), review_count int, latitude double, longitude double, - rating double, + rating double, foreign key (property_id) references property (id) ); create table if not exists image ( - id BIGINT Primary Key auto_increment, - image_url varchar(1000), - name varchar(45), + id BIGINT Primary Key auto_increment, + image_url varchar(1000), + name varchar(45), property_id bigint, - foreign key (property_id) references property(id) + foreign key (property_id) references property (id) ); create table if not exists user @@ -59,6 +59,7 @@ create table if not exists user create table if not exists reservation ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, check_in_date datetime, check_out_date datetime, total_price int, @@ -80,8 +81,8 @@ create table if not exists wish_list create table if not exists property_category ( - id bigint primary key auto_increment, - name varchar(45), + id bigint primary key auto_increment, + name varchar(45), image_url varchar(1000) ); From 835d374ce621d74dd49b8ed91b03fc7cb9b7fa02 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 12:25:50 +0900 Subject: [PATCH 44/99] =?UTF-8?q?feat:=20=EB=A1=9C=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=95=84=EC=9D=B4=EB=94=94=EB=A1=9C=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=8D=BC=ED=8B=B0=EC=9D=98=20=EA=B0=80=EA=B2=A9?= =?UTF-8?q?=EB=A7=8C=20=EB=B0=9B=EC=95=84=EC=98=A4=EB=8A=94=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java index a5d0f3e5e..c9b6b3cbc 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java @@ -101,5 +101,11 @@ public String mapRow(ResultSet rs, int rowNum) throws SQLException { }, propertyId); return images; } + + public List findPricesByLocationId(Long locationId) { + String sql = "SELECT price FROM property where location_id = ?"; + + return jdbcTemplate.queryForList(sql, Integer.class, locationId); + } } From 46d1d55ad8b7d116da78f61b1a35195c04c0093b Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 12:26:20 +0900 Subject: [PATCH 45/99] =?UTF-8?q?test:=20=EB=A1=9C=EC=BC=80=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=95=84=EC=9D=B4=EB=94=94=EB=A1=9C=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=8D=BC=ED=8B=B0=20=EA=B0=80=EA=B2=A9=EC=9D=84=20?= =?UTF-8?q?=EB=B0=9B=EC=95=84=EC=98=A4=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/codesquad/airbnb/dao/PropertyDaoTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java index 8a65d34bb..77702ffc2 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java @@ -48,4 +48,13 @@ void propertyDao_findBy() { property); } } + + @Test + void propertyDao_findPricesTest() { + List prices = propertyDao.findPricesByLocationId(1L); + + assertThat(prices.size()).isEqualTo(6); + assertThat(prices.get(0)).isEqualTo(300000); + assertThat(prices.get(1)).isEqualTo(60000); + } } From e011acdb9ad95dc5254890a3f20723e80d37bc64 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 12:31:00 +0900 Subject: [PATCH 46/99] =?UTF-8?q?feat:=20PropertyService=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=ED=8F=89=EA=B7=A0=20=EA=B0=80=EA=B2=A9?= =?UTF-8?q?=20=EA=B5=AC=ED=95=98=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/service/PropertyService.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java diff --git a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java new file mode 100644 index 000000000..06018389b --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java @@ -0,0 +1,30 @@ +package com.codesquad.airbnb.service; + +import com.codesquad.airbnb.dao.PropertyDao; +import com.codesquad.airbnb.dto.PriceSearchDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class PropertyService { + + private PropertyDao propertyDao; + + @Autowired + public PropertyService(PropertyDao propertyDao) { + this.propertyDao = propertyDao; + } + + public int getAveragePrice(Long locationId) { + int average = 0; + List prices = propertyDao.findPricesByLocationId(locationId); + + for (Integer i : prices) { + average += i; + } + + return average / prices.size(); + } +} From 08d29c82ee71b4262eb6106671c90ccfd4f2474c Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 12:31:35 +0900 Subject: [PATCH 47/99] =?UTF-8?q?test:=20=ED=8F=89=EA=B7=A0=20=EA=B0=80?= =?UTF-8?q?=EA=B2=A9=EC=9D=84=20=EA=B5=AC=ED=95=98=EB=8A=94=20averagePrice?= =?UTF-8?q?Test=20=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/service/PropertyServiceTest.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java diff --git a/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java b/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java new file mode 100644 index 000000000..81cce42cd --- /dev/null +++ b/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java @@ -0,0 +1,31 @@ +package com.codesquad.airbnb.service; + +import com.codesquad.airbnb.dto.PriceSearchDTO; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.assertj.core.api.Assertions.*; + +@SpringBootTest +class PropertyServiceTest { + + private Logger logger = LoggerFactory.getLogger(PropertyServiceTest.class); + + private PropertyService propertyService; + + @Autowired + public PropertyServiceTest(PropertyService propertyService) { + this.propertyService = propertyService; + } + + @Test + void propertyService_averagePriceTest() { + int averagePrice = propertyService.getAveragePrice(1L); + + assertThat(averagePrice).isGreaterThan(0); + logger.info("Average Price of location 1L is: " + averagePrice); + } +} From d8a25c72f2a8187407fb8db991874999bcc5c8b7 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 14:10:20 +0900 Subject: [PATCH 48/99] =?UTF-8?q?feat:=20=EA=B7=B8=EB=9E=98=ED=94=84?= =?UTF-8?q?=EB=A5=BC=20=EA=B7=B8=EB=A6=B4=20=EB=95=8C=20=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20propertyCounts=EB=A5=BC=20=EA=B5=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 50000원 단위로 끊어서 프로퍼티의 개수를 구해 배열에 넣는다 --- .../com/codesquad/airbnb/service/PropertyService.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java index 06018389b..b05a2647f 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java @@ -27,4 +27,15 @@ public int getAveragePrice(Long locationId) { return average / prices.size(); } + + public int[] getPropertyCountsByPriceRange(Long locationId) { + int[] priceCounts = new int[20]; + List prices = propertyDao.findPricesByLocationId(locationId); + + for (Integer i : prices) { + priceCounts[i / 50000]++; + } + + return priceCounts; + } } From 107db5cd2b56b11c1c4c2a2bc5a41140ce580190 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 14:10:40 +0900 Subject: [PATCH 49/99] =?UTF-8?q?test:=20propertyCount=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codesquad/airbnb/service/PropertyServiceTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java b/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java index 81cce42cd..e1b7bebae 100644 --- a/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java @@ -28,4 +28,13 @@ void propertyService_averagePriceTest() { assertThat(averagePrice).isGreaterThan(0); logger.info("Average Price of location 1L is: " + averagePrice); } + + @Test + void propertyService_priceCountTest() { + int[] priceCount = propertyService.getPropertyCountsByPriceRange(1L); + + for (int i : priceCount) { + System.out.print(i + " "); + } + } } From 1c98261e49d03fc6269d69dbbd3d88ee9ec3d9dd Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 14:11:49 +0900 Subject: [PATCH 50/99] =?UTF-8?q?feat:=20PriceSearchDTO=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 평균 가격과 가격별 프로퍼티 개수를 감싸줄 DTO --- .../codesquad/airbnb/dto/PriceSearchDTO.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/PriceSearchDTO.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PriceSearchDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/PriceSearchDTO.java new file mode 100644 index 000000000..88349c83e --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PriceSearchDTO.java @@ -0,0 +1,33 @@ +package com.codesquad.airbnb.dto; + +import java.util.Arrays; + +public class PriceSearchDTO { + + private int averagePrice; + private int[] numberOfRooms; + + public int getAveragePrice() { + return averagePrice; + } + + public int[] getNumberOfRooms() { + return numberOfRooms; + } + + public void setAveragePrice(int averagePrice) { + this.averagePrice = averagePrice; + } + + public void setNumberOfRooms(int[] numberOfRooms) { + this.numberOfRooms = numberOfRooms; + } + + @Override + public String toString() { + return "PriceSearchDTO{" + + "averagePrice=" + averagePrice + + ", numberOfRooms=" + Arrays.toString(numberOfRooms) + + '}'; + } +} From 946e30c86d994aab518af229818be069c5c1f42f Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 14:14:32 +0900 Subject: [PATCH 51/99] =?UTF-8?q?feat:=20PriceSearchDTO=EB=A5=BC=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A4=EC=96=B4=20=EB=82=B4=EB=B3=B4=EB=82=B4?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit getAveragePrice와 getPropertyCountsByPriceRange는 private으로 하려다 테스트를 하기위해 package private으로 접근제어자 변경 --- .../codesquad/airbnb/service/PropertyService.java | 12 ++++++++++-- .../airbnb/service/PropertyServiceTest.java | 7 +++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java index b05a2647f..2e2636fc5 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java @@ -17,7 +17,7 @@ public PropertyService(PropertyDao propertyDao) { this.propertyDao = propertyDao; } - public int getAveragePrice(Long locationId) { + int getAveragePrice(Long locationId) { int average = 0; List prices = propertyDao.findPricesByLocationId(locationId); @@ -28,7 +28,7 @@ public int getAveragePrice(Long locationId) { return average / prices.size(); } - public int[] getPropertyCountsByPriceRange(Long locationId) { + int[] getPropertyCountsByPriceRange(Long locationId) { int[] priceCounts = new int[20]; List prices = propertyDao.findPricesByLocationId(locationId); @@ -38,4 +38,12 @@ public int[] getPropertyCountsByPriceRange(Long locationId) { return priceCounts; } + + public PriceSearchDTO priceSearch(Long locationId) { + PriceSearchDTO priceSearchDTO = new PriceSearchDTO(); + priceSearchDTO.setAveragePrice(getAveragePrice(locationId)); + priceSearchDTO.setNumberOfRooms(getPropertyCountsByPriceRange(locationId)); + + return priceSearchDTO; + } } diff --git a/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java b/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java index e1b7bebae..e7153761d 100644 --- a/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java @@ -37,4 +37,11 @@ void propertyService_priceCountTest() { System.out.print(i + " "); } } + + @Test + void propertyService_priceSearch() { + PriceSearchDTO priceSearchDTO = propertyService.priceSearch(3L); + + logger.info("Price Search for location 5L: " + priceSearchDTO); + } } From e07ac11bc65479f43f1a001e6c7a45ce0ac3207f Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 14:31:10 +0900 Subject: [PATCH 52/99] =?UTF-8?q?chore:=20image=20=ED=95=AD=EB=AA=A9?= =?UTF-8?q?=EC=97=90=20thumbnail=20boolean=EC=9D=84=20=EB=84=A3=EC=96=B4,?= =?UTF-8?q?=20=EB=A9=94=EC=9D=B8=EC=9C=BC=EB=A1=9C=20=EC=93=B8=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=EC=9D=B8=EC=A7=80=20=EA=B5=AC=EB=B6=84=20?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/insert.sql | 110 +++++++++++++++---------------- BE/src/main/resources/schema.sql | 1 + 2 files changed, 56 insertions(+), 55 deletions(-) diff --git a/BE/src/main/resources/insert.sql b/BE/src/main/resources/insert.sql index 1e1a531c2..91b9e4a24 100644 --- a/BE/src/main/resources/insert.sql +++ b/BE/src/main/resources/insert.sql @@ -27,119 +27,119 @@ values ('☆Netflix☆Hongdae_Sangsu sta.20sec 갬성돋는 나만의 공간♡' ('"월정야大" 월정해변 근처 조용한 마을 돌집', 770000, 5), ('제주도, 제주시, 애월별땅,cozy 곽지해수욕장,애월한담산책로, 공항에서30분, 독채펜션', 390000, 5); -insert into image(image_url, name, property_id) +insert into image(image_url, name, property_id, thumbnail) VALUES ('https://user-images.githubusercontent.com/69128652/118953932-3cbb2f80-b998-11eb-8faf-09cd0f9eac63.png', - 'pr#1-1', 1), + 'pr#1-1', 1, 1), ('https://user-images.githubusercontent.com/69128652/118953978-49d81e80-b998-11eb-9b92-1b8141659f27.png', - 'pr#1-2', 1), + 'pr#1-2', 1, 0), ('https://user-images.githubusercontent.com/69128652/118954012-4e9cd280-b998-11eb-8c0f-a3ec41aac5d3.png', - 'pr#1-3', 1), + 'pr#1-3', 1, 0), ('https://user-images.githubusercontent.com/69128652/118954055-59effe00-b998-11eb-992c-6d1b39863226.png', - 'pr#2-1', 2), + 'pr#2-1', 2, 1), ('https://user-images.githubusercontent.com/69128652/118954164-755b0900-b998-11eb-82bc-8dd0459da68b.png', - 'pr#2-2', 2), + 'pr#2-2', 2, 0), ('https://user-images.githubusercontent.com/69128652/118954174-7855f980-b998-11eb-9d07-47d5918b18e0.png', - 'pr#2-3', 2), + 'pr#2-3', 2, 0), ('https://user-images.githubusercontent.com/69128652/118954255-8e63ba00-b998-11eb-9927-8ddf3d983842.png', - 'pr#3-1', 3), + 'pr#3-1', 3, 1), ('https://user-images.githubusercontent.com/69128652/118954272-90c61400-b998-11eb-9ceb-005efa4d016f.png', - 'pr#3-2', 3), + 'pr#3-2', 3, 0), ('https://user-images.githubusercontent.com/69128652/118954287-93286e00-b998-11eb-8df0-25ec18f10002.png', - 'pr#3-3', 3), + 'pr#3-3', 3, 0), ('https://user-images.githubusercontent.com/69128652/119064380-353a6b80-ba16-11eb-9492-e6743e9f041f.png', - 'pr#4-1', 4), + 'pr#4-1', 4, 1), ('https://user-images.githubusercontent.com/69128652/119064387-37042f00-ba16-11eb-9d2a-7dfc82d8ceee.png', - 'pr#4-2', 4), + 'pr#4-2', 4, 0), ('https://user-images.githubusercontent.com/69128652/119064401-3a97b600-ba16-11eb-8bb4-caa90641cccd.png', - 'pr#4-3', 4), + 'pr#4-3', 4, 0), ('https://user-images.githubusercontent.com/69128652/119064415-3f5c6a00-ba16-11eb-85c4-bd7ee65d775e.png', - 'pr#5-1', 5), + 'pr#5-1', 5, 1), ('https://user-images.githubusercontent.com/69128652/119064421-41bec400-ba16-11eb-9c19-4aec50bb9f46.png', - 'pr#5-2', 5), + 'pr#5-2', 5, 0), ('https://user-images.githubusercontent.com/69128652/119064426-44211e00-ba16-11eb-9b70-3a7af1614031.png', - 'pr#5-3', 5), + 'pr#5-3', 5, 0), ('https://user-images.githubusercontent.com/69128652/119064436-48e5d200-ba16-11eb-9063-4c73d940a38e.png', - 'pr#6-1', 6), + 'pr#6-1', 6, 1), ('https://user-images.githubusercontent.com/69128652/119064441-4aaf9580-ba16-11eb-980f-ddbb1b679363.png', - 'pr#6-2', 6), + 'pr#6-2', 6, 0), ('https://user-images.githubusercontent.com/69128652/119064443-4c795900-ba16-11eb-8082-ef2a0ed15bd9.png', - 'pr#6-3', 6), + 'pr#6-3', 6, 0), ('https://user-images.githubusercontent.com/69128652/119064496-703c9f00-ba16-11eb-9971-f39caa42c6b7.png', - 'pr#7-1', 7), + 'pr#7-1', 7, 1), ('https://user-images.githubusercontent.com/69128652/119064490-6dda4500-ba16-11eb-9ecc-822abdf78fbd.png', - 'pr#7-2', 7), + 'pr#7-2', 7, 0), ('https://user-images.githubusercontent.com/69128652/119064498-729ef900-ba16-11eb-9aae-aed2a5773cd8.png', - 'pr#7-3', 7), + 'pr#7-3', 7, 0), ('https://user-images.githubusercontent.com/69128652/119064509-76328000-ba16-11eb-8e39-b562e19f97a5.png', - 'pr#8-1', 8), + 'pr#8-1', 8, 1), ('https://user-images.githubusercontent.com/69128652/119064517-77fc4380-ba16-11eb-9fed-e2a07869c524.png', - 'pr#8-2', 8), + 'pr#8-2', 8, 0), ('https://user-images.githubusercontent.com/69128652/119064520-7a5e9d80-ba16-11eb-9ece-97c4eaf442d4.png', - 'pr#8-3', 8), + 'pr#8-3', 8, 0), ('https://user-images.githubusercontent.com/69128652/119064535-7fbbe800-ba16-11eb-908d-707f23c5dbff.png', - 'pr#9-1', 9), + 'pr#9-1', 9, 1), ('https://user-images.githubusercontent.com/69128652/119064539-8185ab80-ba16-11eb-85be-a9090a085a9e.png', - 'pr#9-2', 9), + 'pr#9-2', 9, 0), ('https://user-images.githubusercontent.com/69128652/119064543-834f6f00-ba16-11eb-9477-766ef68db139.png', - 'pr#9-3', 9), + 'pr#9-3', 9, 0), ('https://user-images.githubusercontent.com/69128652/119064604-a712b500-ba16-11eb-9224-43274b7cbfbb.png', - 'pr#10-1', 10), + 'pr#10-1', 10, 1), ('https://user-images.githubusercontent.com/69128652/119064616-ad089600-ba16-11eb-9f9c-bae19b63d7ea.png', - 'pr#10-2', 10), + 'pr#10-2', 10, 0), ('https://user-images.githubusercontent.com/69128652/119064621-b1cd4a00-ba16-11eb-9889-b73f525f12b6.png', - 'pr#10-3', 10), + 'pr#10-3', 10, 0), ('https://user-images.githubusercontent.com/69128652/119064627-b5f96780-ba16-11eb-8dd5-ae1965c98449.png', - 'pr#11-1', 11), + 'pr#11-1', 11, 1), ('https://user-images.githubusercontent.com/69128652/119064631-b8f45800-ba16-11eb-880b-3160ae43ba07.png', - 'pr#11-2', 11), + 'pr#11-2', 11, 0), ('https://user-images.githubusercontent.com/69128652/119064638-bc87df00-ba16-11eb-98ea-6ad53b0a1fce.png', - 'pr#11-3', 11), + 'pr#11-3', 11, 0), ('https://user-images.githubusercontent.com/69128652/119064649-c1e52980-ba16-11eb-95a7-e8e73f708548.png', - 'pr#12-1', 12), + 'pr#12-1', 12, 1), ('https://user-images.githubusercontent.com/69128652/119064643-bf82cf80-ba16-11eb-907e-729d4cbdae0f.png', - 'pr#12-2', 12), + 'pr#12-2', 12, 0), ('https://user-images.githubusercontent.com/69128652/119064657-c4478380-ba16-11eb-9224-16e9c1cadc64.png', - 'pr#12-3', 12), + 'pr#12-3', 12, 0), ('https://user-images.githubusercontent.com/69128652/119067012-17700500-ba1c-11eb-99a7-405e084aa296.png', - 'pr#13-1', 13), + 'pr#13-1', 13, 1), ('https://user-images.githubusercontent.com/69128652/119067023-1ccd4f80-ba1c-11eb-8595-98aa407f8608.png', - 'pr#13-2', 13), + 'pr#13-2', 13, 0), ('https://user-images.githubusercontent.com/69128652/119067016-1a6af580-ba1c-11eb-9e15-6be5891fcb85.png', - 'pr#13-3', 13), + 'pr#13-3', 13, 0), ('https://user-images.githubusercontent.com/69128652/119067031-222a9a00-ba1c-11eb-806c-83c65ac0d36f.png', - 'pr#14-1', 14), + 'pr#14-1', 14, 1), ('https://user-images.githubusercontent.com/69128652/119067037-248cf400-ba1c-11eb-9238-02392cdda17c.png', - 'pr#14-2', 14), + 'pr#14-2', 14, 0), ('https://user-images.githubusercontent.com/69128652/119067044-28207b00-ba1c-11eb-8127-693a8d388581.png', - 'pr#14-3', 14), + 'pr#14-3', 14, 0), ('https://user-images.githubusercontent.com/69128652/119067050-2c4c9880-ba1c-11eb-8b5c-d9b264dc10d3.png', - 'pr#15-1', 15), + 'pr#15-1', 15, 1), ('https://user-images.githubusercontent.com/69128652/119067052-2eaef280-ba1c-11eb-9960-82fe87662dbc.png', - 'pr#15-2', 15), + 'pr#15-2', 15, 0), ('https://user-images.githubusercontent.com/69128652/119067096-45554980-ba1c-11eb-90ef-81abd09fac63.png', - 'pr#15-3', 15), + 'pr#15-3', 15, 0), ('https://user-images.githubusercontent.com/69128652/119067149-6322ae80-ba1c-11eb-9180-d66f7a03076e.png', - 'pr#16-1', 16), + 'pr#16-1', 16, 1), ('https://user-images.githubusercontent.com/69128652/119067153-64ec7200-ba1c-11eb-86cc-2b6533578961.png', - 'pr#16-2', 16), + 'pr#16-2', 16, 0), ('https://user-images.githubusercontent.com/69128652/119067158-674ecc00-ba1c-11eb-8308-7ae1318e3ee6.png', - 'pr#16-3', 16), + 'pr#16-3', 16, 0), ('https://user-images.githubusercontent.com/69128652/119067173-72096100-ba1c-11eb-9aed-d448f986702b.png', - 'pr#17-1', 17), + 'pr#17-1', 17, 1), ('https://user-images.githubusercontent.com/69128652/119067178-746bbb00-ba1c-11eb-9ff4-054081edaa86.png', - 'pr#17-2', 17), + 'pr#17-2', 17, 0), ('https://user-images.githubusercontent.com/69128652/119067182-759ce800-ba1c-11eb-85f1-a390efa439a8.png', - 'pr#17-3', 17), + 'pr#17-3', 17, 0), ('https://user-images.githubusercontent.com/69128652/119067196-7cc3f600-ba1c-11eb-83b8-b48ec20102b9.png', - 'pr#18-1', 18), + 'pr#18-1', 18, 1), ('https://user-images.githubusercontent.com/69128652/119067200-7f265000-ba1c-11eb-911c-1d2f4c4e56e4.png', - 'pr#18-2', 18), + 'pr#18-2', 18, 0), ('https://user-images.githubusercontent.com/69128652/119067203-80f01380-ba1c-11eb-9cb2-4c6bbad92727.png', - 'pr#18-3', 18); + 'pr#18-3', 18, 0); insert into property_detail(property_id, description, max_occupancy, cleaning_fee, occupied_date, bed_count, bath_count, diff --git a/BE/src/main/resources/schema.sql b/BE/src/main/resources/schema.sql index 97b05aebf..947901abd 100644 --- a/BE/src/main/resources/schema.sql +++ b/BE/src/main/resources/schema.sql @@ -41,6 +41,7 @@ create table image id BIGINT Primary Key auto_increment, image_url varchar(1000), name varchar(45), + thumbnail tinyint(1), property_id bigint, foreign key (property_id) references property(id) ); From 8c6d182175effc971ba870a38447118df849cb67 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 14:31:48 +0900 Subject: [PATCH 53/99] =?UTF-8?q?refactor:=20search=EC=8B=9C,=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EA=B0=80=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C,=20=EC=8D=B8=EB=84=A4=EC=9D=BC=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=EB=A7=8C=20=EB=82=98=EC=98=AC=20=EC=88=98=20?= =?UTF-8?q?=EC=9E=88=EB=8F=84=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20=EC=88=98?= =?UTF-8?q?=EC=A0=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/dao/PropertyDao.java | 16 +++++++++++++++- .../com/codesquad/airbnb/dto/PropertyDto.java | 6 +++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java index 563fbfb04..9117e3d44 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java @@ -94,7 +94,21 @@ public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDat return propertyDtos; } - private List findImageByPropertyId(Long propertyId) { + private String findImageByPropertyId(Long propertyId) { + String sql = "SELECT * FROM image " + + "WHERE image.property_id = ? " + + "and image.thumbnail = true"; + + String image = jdbcTemplate.queryForObject(sql, new RowMapper() { + @Override + public String mapRow(ResultSet rs, int rowNum) throws SQLException { + return rs.getString("image_url"); + } + }, propertyId); + return image; + } + + private List findImagesByPropertyId(Long propertyId) { String sql = "SELECT * FROM image " + "WHERE image.property_id = ?"; diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java index 0d48945a5..5c89c5191 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java @@ -10,7 +10,7 @@ public class PropertyDto { private Long propertyId; - private List images = new ArrayList<>(); + private String images; private String title; private boolean bookmark; private int pricePerNight; @@ -35,7 +35,7 @@ public static PropertyDto of(Long propertyId, String propertyTitle, boolean book reviewCount, rating); } - public void setImages(List images) { + public void setImages(String images) { this.images = images; } @@ -47,7 +47,7 @@ public Long getPropertyId() { return propertyId; } - public List getImages() { + public String getImages() { return images; } From 08aa7d6bc6f4ebb164c8a243f3563e24d99d4b44 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 16:50:01 +0900 Subject: [PATCH 54/99] =?UTF-8?q?chore:=20host=20=ED=95=AD=EB=AA=A9=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/insert.sql | 72 ++++++++++++++++++++++---------- BE/src/main/resources/schema.sql | 12 +++++- 2 files changed, 61 insertions(+), 23 deletions(-) diff --git a/BE/src/main/resources/insert.sql b/BE/src/main/resources/insert.sql index 7f92920af..0e61698bc 100644 --- a/BE/src/main/resources/insert.sql +++ b/BE/src/main/resources/insert.sql @@ -8,12 +8,16 @@ values ('서울', 'https://user-images.githubusercontent.com/59776016/118949618- ('제주', 'https://user-images.githubusercontent.com/59776016/118949756-830e8f80-b994-11eb-8e6a-273f6d875d22.png'); INSERT INTO category (name, image_url) -values ('Outdoor getaways', 'https://user-images.githubusercontent.com/59776016/118950055-ce28a280-b994-11eb-8c89-e0190cdeee68.png'), - ('Unique stays', 'https://user-images.githubusercontent.com/59776016/118950041-cb2db200-b994-11eb-8757-436f287bb805.png'), - ('Entire homes', 'https://user-images.githubusercontent.com/59776016/118950072-d1bc2980-b994-11eb-9392-e66b9b4bdd0b.png'), - ('Pets allowed', 'https://user-images.githubusercontent.com/59776016/118950087-d4b71a00-b994-11eb-9311-b7271e0fc3b3.png'); +values ('Outdoor getaways', + 'https://user-images.githubusercontent.com/59776016/118950055-ce28a280-b994-11eb-8c89-e0190cdeee68.png'), + ('Unique stays', + 'https://user-images.githubusercontent.com/59776016/118950041-cb2db200-b994-11eb-8757-436f287bb805.png'), + ('Entire homes', + 'https://user-images.githubusercontent.com/59776016/118950072-d1bc2980-b994-11eb-9392-e66b9b4bdd0b.png'), + ('Pets allowed', + 'https://user-images.githubusercontent.com/59776016/118950087-d4b71a00-b994-11eb-9311-b7271e0fc3b3.png'); -INSERT into property (name, price, location_id) +INSERT into property (title, price, location_id) values ('☆Netflix☆Hongdae_Sangsu sta.20sec 갬성돋는 나만의 공간♡', 300000, 1), ('#2 Hongik Univ Stn 5mins Cozy & Quiet house', 60000, 1), ('대학로 Min''s House!!401', 70000, 1), @@ -199,27 +203,51 @@ The house is clean and cozy, located in a safe and quiet residential area.', 5, 54000, null, 2, 3, 'entire house', 34, 33.447873, 126.307671, 4.1); insert into property_category(name, image_url) -values ('Outdoor getaways', 'https://user-images.githubusercontent.com/59776016/118950055-ce28a280-b994-11eb-8c89-e0190cdeee68.png'), - ('Unique stays','https://user-images.githubusercontent.com/59776016/118950041-cb2db200-b994-11eb-8757-436f287bb805.png'), - ('Entire homes','https://user-images.githubusercontent.com/59776016/118950072-d1bc2980-b994-11eb-9392-e66b9b4bdd0b.png'), - ('Pets allowed','https://user-images.githubusercontent.com/59776016/118950087-d4b71a00-b994-11eb-9311-b7271e0fc3b3.png'); +values ('Outdoor getaways', + 'https://user-images.githubusercontent.com/59776016/118950055-ce28a280-b994-11eb-8c89-e0190cdeee68.png'), + ('Unique stays', + 'https://user-images.githubusercontent.com/59776016/118950041-cb2db200-b994-11eb-8757-436f287bb805.png'), + ('Entire homes', + 'https://user-images.githubusercontent.com/59776016/118950072-d1bc2980-b994-11eb-9392-e66b9b4bdd0b.png'), + ('Pets allowed', + 'https://user-images.githubusercontent.com/59776016/118950087-d4b71a00-b994-11eb-9311-b7271e0fc3b3.png'); insert into wish_list(property_id, bookmark) values (1, false), - (2,false), - (3,false), - (4,false), + (2, false), + (3, false), + (4, false), (5, false), - (6,false), - (7,false), - (8,false), + (6, false), + (7, false), + (8, false), (9, false), - (10,false), - (11,false), - (12,false), + (10, false), + (11, false), + (12, false), (13, false), - (14,false), - (15,false), - (16,false), + (14, false), + (15, false), + (16, false), (17, false), - (18,false); + (18, false); + +insert into host(property_id, name, email, image_url) +values (1, '새리', 'sally@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452644-8bd6db00-bd71-11eb-83fa-0a67447ce0f2.png'), + (2, '스타브', 'starve@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452674-92655280-bd71-11eb-9d32-38563a72f3ce.png'), + (3, '민', 'min@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452687-95f8d980-bd71-11eb-9ab6-28479a52105e.png'), + (4, '지지', 'zg@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452702-9b562400-bd71-11eb-95b0-83b471a990fa.png'), + (5, '케이', 'k@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452711-9e511480-bd71-11eb-8585-98a8d02680eb.png'), + (6, '펭도리', 'dong@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452722-a14c0500-bd71-11eb-970d-0fc3b6de020c.png'), + (7, '제이슨', 'json@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452729-a446f580-bd71-11eb-8d86-5fea7a5ca153.png'), + (8, '잭슨', 'jackson@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452894-d5bfc100-bd71-11eb-99d5-11065a6450e2.png'), + (9, '호눅스', 'honux@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452913-d9ebde80-bd71-11eb-9f50-169b942c58d3.png'), + (10, '큐', 'kyu@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452922-dce6cf00-bd71-11eb-86b3-814318ea91a0.png'), + (11, '비비', 'bibi@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452936-e07a5600-bd71-11eb-8c43-c4702730a799.png'), + (12, '마르코', 'marco@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452947-e3754680-bd71-11eb-977a-3bc575db71a7.png'), + (13, '프레디', 'freddie@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452971-e839fa80-bd71-11eb-930c-f00becaa8725.png'), + (14, '동', 'dong@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452987-ecfeae80-bd71-11eb-814e-f6b38f95140b.png'), + (15, '연', 'yeon@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452978-ea03be00-bd71-11eb-9b83-3b3e6d8e22fb.png'), + (16, '크롱', 'crong@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119453018-f38d2600-bd71-11eb-935a-12d78cc2b887.png'), + (17, '제이케이', 'jk@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119453031-f6881680-bd71-11eb-9456-8e26cfcf2a80.png'), + (18, '제인', 'jane@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119453042-f8ea7080-bd71-11eb-9a9d-d76ee1c6a08f.png'); diff --git a/BE/src/main/resources/schema.sql b/BE/src/main/resources/schema.sql index 39eb2eb83..1409572b9 100644 --- a/BE/src/main/resources/schema.sql +++ b/BE/src/main/resources/schema.sql @@ -18,7 +18,7 @@ create table if not exists category create table if not exists property ( id bigint primary key auto_increment, - name varchar(255), + title varchar(255), price int, location_id BIGINT, foreign key (location_id) references location (id) @@ -87,4 +87,14 @@ create table if not exists property_category image_url varchar(1000) ); +create table if not exists host +( + id bigint primary key auto_increment, + name varchar(45), + email varchar(255), + image_url varchar(1000), + property_id bigint, + foreign key (property_id) references property (id) +); + # drop table wish_list, reservation, user, property_detail, image, property, location; From 99b2930befa9c72e09b99d4e240a52e3f902f550 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 17:05:26 +0900 Subject: [PATCH 55/99] =?UTF-8?q?feat:=20PropertyDetail=EC=9D=84=20?= =?UTF-8?q?=EC=B0=BE=EC=95=84=EC=98=A4=EB=8A=94=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EC=99=80=20DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit findPropertyDetailByPropertyId 메서드를 생성하여 PropertiesDetailResponseDto에 매핑하는 기능을 추가했다. --- .../com/codesquad/airbnb/dao/PropertyDao.java | 70 +++++++--- .../com/codesquad/airbnb/dto/HostDto.java | 28 ++++ .../dto/PropertiesDetailResponseDto.java | 31 +++++ .../airbnb/dto/PropertyDetailDto.java | 123 ++++++++++++++++++ .../codesquad/airbnb/dao/PropertyDaoTest.java | 18 ++- 5 files changed, 246 insertions(+), 24 deletions(-) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/HostDto.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/PropertiesDetailResponseDto.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDto.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java index 47b12c041..55e0d1cc8 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java @@ -1,8 +1,7 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Property; -import com.codesquad.airbnb.dto.PropertiesResponseDto; -import com.codesquad.airbnb.dto.PropertyDto; +import com.codesquad.airbnb.dto.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @@ -35,19 +34,8 @@ public Property mapRow(ResultSet rs, int rowNum) throws SQLException { } } - public class PropertyDetailRowMapper implements RowMapper { - - // interface method - @Override - public PropertyDto mapRow(ResultSet rs, int rowNum) throws SQLException { - return PropertyDto.of(rs.getLong("id"), rs.getString("name"), - rs.getBoolean("bookmark"), rs.getInt("price"), - rs.getInt("review_count"), rs.getDouble("rating")); - } - } - public Property findById(Long id) { - String sql = "SELECT p.id, p.name, p.price FROM property as p WHERE id = ?"; + String sql = "SELECT p.id, p.title, p.price FROM property as p WHERE id = ?"; return jdbcTemplate.queryForObject(sql, new PropertyRowMapper(), id); } @@ -61,8 +49,8 @@ public List findAll() { public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { - int maxOccupancy = adult+children+infant; - String sql = "select p.id, p.name, wl.bookmark, p.price, pd.review_count, pd.rating " + + int maxOccupancy = adult + children + infant; + String sql = "select p.id, p.title, wl.bookmark, p.price, pd.review_count, pd.rating " + "from property as p, " + "property_detail as pd, " + "wish_list as wl " + @@ -76,7 +64,15 @@ public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDat long diff = ChronoUnit.DAYS.between(checkIn, checkOut); - List propertyDto = jdbcTemplate.query(sql, new PropertyDetailRowMapper(), + List propertyDto = jdbcTemplate.query(sql, new RowMapper() { + // interface method + @Override + public PropertyDto mapRow(ResultSet rs, int rowNum) throws SQLException { + return PropertyDto.of(rs.getLong("id"), rs.getString("name"), + rs.getBoolean("bookmark"), rs.getInt("price"), + rs.getInt("review_count"), rs.getDouble("rating")); + } + }, new SqlParameterValue(Types.BIGINT, locationId), new SqlParameterValue(Types.INTEGER, maxOccupancy), new SqlParameterValue(Types.INTEGER, minPrice), @@ -84,9 +80,9 @@ public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDat propertyDto.stream() .forEach(propertyDto1 -> { - propertyDto1.setImages(findImageByPropertyId(propertyDto1.getPropertyId())); - propertyDto1.setTotalPrice(diff); - } + propertyDto1.setImages(findImageByPropertyId(propertyDto1.getPropertyId())); + propertyDto1.setTotalPrice(diff); + } ); PropertiesResponseDto propertyDtos = new PropertiesResponseDto(propertyDto); @@ -94,6 +90,40 @@ public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDat return propertyDtos; } + public PropertiesDetailResponseDto findPropertyDetailByPropertyId(Long propertyId) { + + String sql = "SELECT p.id, p.title, pd.description, l.name, pd.room_type, pd.max_occupancy," + + "pd.max_occupancy, pd.cleaning_fee, pd.bed_count, pd.bath_count, pd.review_count," + + "p.price, pd.latitude, pd.longitude, pd.rating, h.name, h.image_url " + + "from property as p, " + + "property_detail as pd, " + + "location as l , host as h " + + "where p.id = pd.property_id " + + "and l.id = p.location_id " + + "and h.property_id = p.id " + + "and p.id = ? "; + + PropertiesDetailResponseDto propertyDetailDto = + jdbcTemplate.queryForObject(sql, new RowMapper() { + @Override + public PropertiesDetailResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException { + + List imageUrls = findImagesByPropertyId(rs.getLong("id")); + PropertyDetailDto propertyDetailDto1 = PropertyDetailDto.of( + rs.getString("title"), rs.getString("description"), + rs.getString("l.name"), rs.getString("room_type"), rs.getInt("max_occupancy"), + rs.getInt("cleaning_fee"), rs.getInt("bed_count"), rs.getInt("bath_count"), + rs.getInt("review_count"), rs.getInt("price"), + rs.getDouble("latitude"), rs.getDouble("longitude"), rs.getDouble("rating"), + new HostDto(rs.getString("h.name"), rs.getString("image_url"))); + + return new PropertiesDetailResponseDto(imageUrls, propertyDetailDto1); + } + }, propertyId); + + return propertyDetailDto; + } + private String findImageByPropertyId(Long propertyId) { String sql = "SELECT * FROM image " + "WHERE image.property_id = ? " + diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/HostDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/HostDto.java new file mode 100644 index 000000000..fa7fe2423 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dto/HostDto.java @@ -0,0 +1,28 @@ +package com.codesquad.airbnb.dto; + +public class HostDto { + + private String name; + private String imageUrl; + + public HostDto(String name, String imageUrl) { + this.name = name; + this.imageUrl = imageUrl; + } + + public String getName() { + return name; + } + + public String getImageUrl() { + return imageUrl; + } + + @Override + public String toString() { + return "HostDto{" + + "name='" + name + '\'' + + ", imageUrl='" + imageUrl + '\'' + + '}'; + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesDetailResponseDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesDetailResponseDto.java new file mode 100644 index 000000000..2cf4c251f --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesDetailResponseDto.java @@ -0,0 +1,31 @@ +package com.codesquad.airbnb.dto; + +import java.util.ArrayList; +import java.util.List; + +public class PropertiesDetailResponseDto { + + private List imageUrls = new ArrayList<>(); + private PropertyDetailDto property; + + public PropertiesDetailResponseDto(List imageUrls, PropertyDetailDto property) { + this.imageUrls = imageUrls; + this.property = property; + } + + public List getImageUrls() { + return imageUrls; + } + + public PropertyDetailDto getProperty() { + return property; + } + + @Override + public String toString() { + return "PropertiesDetailResponseDto{" + + "imageUrls=" + imageUrls + + ", property=" + property + + '}'; + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDto.java new file mode 100644 index 000000000..bc9a4102f --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDto.java @@ -0,0 +1,123 @@ +package com.codesquad.airbnb.dto; + +public class PropertyDetailDto { + + private String title; + private String description; + private String locationName; + private String propertyType; + private int maxOccupancy; + private int cleaningFee; + private int bedCount; + private int bathCount; + private int reviewCount; + private int pricePerNight; + private double latitude; + private double longitude; + private double rating; + private HostDto host; + + public PropertyDetailDto(String title, String description, String locationName, + String propertyType, int maxOccupancy, int cleaningFee, + int bedCount, int bathCount, int reviewCount, int pricePerNight, + double latitude, double longitude, double rating, HostDto host) { + this.title = title; + this.description = description; + this.locationName = locationName; + this.propertyType = propertyType; + this.maxOccupancy = maxOccupancy; + this.cleaningFee = cleaningFee; + this.bedCount = bedCount; + this.bathCount = bathCount; + this.reviewCount = reviewCount; + this.pricePerNight = pricePerNight; + this.latitude = latitude; + this.longitude = longitude; + this.rating = rating; + this.host = host; + } + + public static PropertyDetailDto of (String title, String description, String locationName, + String propertyType, int maxOccupancy, int cleaningFee, + int bedCount, int bathCount, int reviewCount, int pricePerNight, + double latitude, double longitude, double rating, HostDto host) { + return new PropertyDetailDto(title, description, locationName, propertyType, maxOccupancy, + cleaningFee, bedCount, bathCount, reviewCount, pricePerNight, latitude, longitude, rating, host); + } + + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public String getLocationName() { + return locationName; + } + + public String getPropertyType() { + return propertyType; + } + + public int getMaxOccupancy() { + return maxOccupancy; + } + + public int getCleaningFee() { + return cleaningFee; + } + + public int getBedCount() { + return bedCount; + } + + public int getBathCount() { + return bathCount; + } + + public int getReviewCount() { + return reviewCount; + } + + public int getPricePerNight() { + return pricePerNight; + } + + public double getLatitude() { + return latitude; + } + + public double getLongitude() { + return longitude; + } + + public double getRating() { + return rating; + } + + public HostDto getHost() { + return host; + } + + @Override + public String toString() { + return "{" + + "title='" + title + '\'' + + ", description='" + description + '\'' + + ", locationName='" + locationName + '\'' + + ", propertyType='" + propertyType + '\'' + + ", maxOccupancy=" + maxOccupancy + + ", cleaningFee=" + cleaningFee + + ", bedCount=" + bedCount + + ", bathCount=" + bathCount + + ", reviewCount=" + reviewCount + + ", pricePerNight=" + pricePerNight + + ", latitude=" + latitude + + ", longitude=" + longitude + + ", rating=" + rating + + ", host=" + host + + "}"; + } +} diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java index 9cd84f1d5..1f6645ac5 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java @@ -1,6 +1,7 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Property; +import com.codesquad.airbnb.dto.PropertiesDetailResponseDto; import com.codesquad.airbnb.dto.PropertiesResponseDto; import com.codesquad.airbnb.dto.PropertyDto; import org.junit.jupiter.api.Test; @@ -33,7 +34,7 @@ void propertyDao_findById() { @Test void propertyDao_findByAll() { List properties = propertyDao.findAll(); - for(Property property : properties){ + for (Property property : properties) { assertThat(property).isNotNull(); logger.info("Find property by propertyDao: {}", property); @@ -42,9 +43,9 @@ void propertyDao_findByAll() { @Test void propertyDao_findBy() { - PropertiesResponseDto properties = propertyDao.findBy(1L, LocalDate.of(2021,5,20),LocalDate.of(2021,5,23), - 10000, 100000, 2,0,0); - for(PropertyDto property : properties.getProperties()){ + PropertiesResponseDto properties = propertyDao.findBy(1L, LocalDate.of(2021, 5, 20), LocalDate.of(2021, 5, 23), + 10000, 100000, 2, 0, 0); + for (PropertyDto property : properties.getProperties()) { assertThat(property).isNotNull(); logger.info("Find property by propertyDao: {}", property); @@ -59,4 +60,13 @@ void propertyDao_findPricesTest() { assertThat(prices.get(0)).isEqualTo(300000); assertThat(prices.get(1)).isEqualTo(60000); } + + @Test + void propertyDao_findPropertyDetailByPropertyId() { + PropertiesDetailResponseDto property = propertyDao.findPropertyDetailByPropertyId(1L); + assertThat(property).isNotNull(); + logger.info("Find property by propertyDao: {}", + property); + + } } From e9a943ffd3af2e23ef703f7bc3d433ba82a9c021 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 17:07:04 +0900 Subject: [PATCH 56/99] =?UTF-8?q?chore:=20findBy=EB=B6=80=EB=B6=84?= =?UTF-8?q?=EC=9D=84=20Service=EB=A1=9C=20=EC=9D=B4=EB=8F=99.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Controller에서 Dao로 바로 진입해, findBy 메서드를 사용하던 것을 서비스 클래스로 이동하였다. --- .../{ => controller}/SearchController.java | 21 ++++++++++++------- .../airbnb/service/PropertyService.java | 6 ++++++ 2 files changed, 19 insertions(+), 8 deletions(-) rename BE/src/main/java/com/codesquad/airbnb/{ => controller}/SearchController.java (60%) diff --git a/BE/src/main/java/com/codesquad/airbnb/SearchController.java b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java similarity index 60% rename from BE/src/main/java/com/codesquad/airbnb/SearchController.java rename to BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java index 75f827d20..5876bcfec 100644 --- a/BE/src/main/java/com/codesquad/airbnb/SearchController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java @@ -1,8 +1,8 @@ -package com.codesquad.airbnb; +package com.codesquad.airbnb.controller; -import com.codesquad.airbnb.dao.PropertyDao; +import com.codesquad.airbnb.dto.PriceSearchDTO; import com.codesquad.airbnb.dto.PropertiesResponseDto; -import com.codesquad.airbnb.dto.PropertyDto; +import com.codesquad.airbnb.service.PropertyService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -12,14 +12,14 @@ @RequestMapping("/search") public class SearchController { - PropertyDao propertyDao; + PropertyService propertyService; - public SearchController(PropertyDao propertyDao) { - this.propertyDao = propertyDao; + public SearchController(PropertyService propertyService) { + this.propertyService = propertyService; } @GetMapping() - public ResponseEntity search( + public ResponseEntity propertiesSearch( @RequestParam(value = "locationId", required = false) Long locationId, @RequestParam(value = "checkIn" , required = false)LocalDate checkIn, @RequestParam(value = "checkOut" , required = false)LocalDate checkOut, @@ -29,8 +29,13 @@ public ResponseEntity search( @RequestParam(value = "children" , required = false, defaultValue = "0")int children, @RequestParam(value = "infant" , required = false, defaultValue = "0")int infant ) { - PropertiesResponseDto propertiesResponseDto = propertyDao.findBy(locationId,checkIn,checkOut,minPrice,maxPrice,adult,children,infant); + PropertiesResponseDto propertiesResponseDto = propertyService.findBy(locationId,checkIn,checkOut,minPrice,maxPrice,adult,children,infant); return ResponseEntity.ok().body(propertiesResponseDto); } + @GetMapping("/{locationId}") + public ResponseEntity propertiesAverageValue(@PathVariable Long locationId) { + return ResponseEntity.ok().body(propertyService.priceSearch(locationId)); + } + } diff --git a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java index 2e2636fc5..8e3ee762a 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java @@ -2,9 +2,11 @@ import com.codesquad.airbnb.dao.PropertyDao; import com.codesquad.airbnb.dto.PriceSearchDTO; +import com.codesquad.airbnb.dto.PropertiesResponseDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.util.List; @Service @@ -46,4 +48,8 @@ public PriceSearchDTO priceSearch(Long locationId) { return priceSearchDTO; } + + public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { + return propertyDao.findBy(locationId, checkIn, checkOut, minPrice, maxPrice, adult, children, infant); + } } From 9e7b61a03b00f848db94fd416d4bb4e5cea49194 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 17:13:44 +0900 Subject: [PATCH 57/99] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=95=AD=EB=AA=A9=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/codesquad/airbnb/dao/ReservationDAO.java | 1 - BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java | 7 ------- 2 files changed, 8 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java index d82c93c71..7526e7cc1 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java @@ -10,7 +10,6 @@ import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; -import java.time.LocalDate; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java index 5c89c5191..d1bf0314f 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java @@ -1,12 +1,5 @@ package com.codesquad.airbnb.dto; -import com.codesquad.airbnb.domain.*; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - public class PropertyDto { private Long propertyId; From d7286a6598da81b39f5a2fff07b00c110b1f061f Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 17:14:18 +0900 Subject: [PATCH 58/99] =?UTF-8?q?refactor:=20name=EC=97=90=EC=84=9C=20titl?= =?UTF-8?q?e=EB=A1=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/codesquad/airbnb/domain/Property.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Property.java b/BE/src/main/java/com/codesquad/airbnb/domain/Property.java index c1ecfdb6e..c4d6dc4e9 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/Property.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Property.java @@ -7,15 +7,15 @@ public class Property { @Id private Long id; - private String name; + private String title; private int price; public Property() { } - public Property(Long id, String name, int price) { + public Property(Long id, String title, int price) { this.id = id; - this.name = name; + this.title = title; this.price = price; } @@ -23,8 +23,8 @@ public Long getId() { return id; } - public String getName() { - return name; + public String getTitle() { + return title; } public int getPrice() { @@ -35,7 +35,7 @@ public int getPrice() { public String toString() { return "Property{" + "id=" + id + - ", name='" + name + '\'' + + ", name='" + title + '\'' + ", price=" + price + '}'; } From 33ebf6d39ff1af74402bf8f0a6817a100c697c91 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 25 May 2021 17:41:20 +0900 Subject: [PATCH 59/99] =?UTF-8?q?style:=20=EC=BD=94=EB=93=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/controller/SearchController.java | 18 +++---- .../airbnb/domain/PropertyDetail.java | 2 - .../com/codesquad/airbnb/domain/User.java | 5 +- .../com/codesquad/airbnb/domain/WishList.java | 1 + .../airbnb/dto/PropertyDetailDto.java | 8 +-- BE/src/main/resources/application.properties | 2 +- BE/src/main/resources/insert.sql | 54 ++++++++++++------- BE/src/main/resources/schema.sql | 20 +++---- 8 files changed, 64 insertions(+), 46 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java index 5876bcfec..b9b569f65 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java @@ -21,15 +21,15 @@ public SearchController(PropertyService propertyService) { @GetMapping() public ResponseEntity propertiesSearch( @RequestParam(value = "locationId", required = false) Long locationId, - @RequestParam(value = "checkIn" , required = false)LocalDate checkIn, - @RequestParam(value = "checkOut" , required = false)LocalDate checkOut, - @RequestParam(value = "minPrice" , required = false, defaultValue = "0")int minPrice, - @RequestParam(value = "maxPrice" , required = false, defaultValue = "1000000")int maxPrice, - @RequestParam(value = "adult" , required = false, defaultValue = "0")int adult, - @RequestParam(value = "children" , required = false, defaultValue = "0")int children, - @RequestParam(value = "infant" , required = false, defaultValue = "0")int infant - ) { - PropertiesResponseDto propertiesResponseDto = propertyService.findBy(locationId,checkIn,checkOut,minPrice,maxPrice,adult,children,infant); + @RequestParam(value = "checkIn", required = false) LocalDate checkIn, + @RequestParam(value = "checkOut", required = false) LocalDate checkOut, + @RequestParam(value = "minPrice", required = false, defaultValue = "0") int minPrice, + @RequestParam(value = "maxPrice", required = false, defaultValue = "1000000") int maxPrice, + @RequestParam(value = "adult", required = false, defaultValue = "0") int adult, + @RequestParam(value = "children", required = false, defaultValue = "0") int children, + @RequestParam(value = "infant", required = false, defaultValue = "0") int infant + ) { + PropertiesResponseDto propertiesResponseDto = propertyService.findBy(locationId, checkIn, checkOut, minPrice, maxPrice, adult, children, infant); return ResponseEntity.ok().body(propertiesResponseDto); } diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java b/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java index 78d373374..a47246b6b 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java @@ -2,8 +2,6 @@ import org.springframework.data.annotation.Id; -import java.time.LocalDate; - public class PropertyDetail { @Id diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/User.java b/BE/src/main/java/com/codesquad/airbnb/domain/User.java index 39874f284..69c555607 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/User.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/User.java @@ -3,12 +3,13 @@ public class User { private Long id; - + private String name; private String email; - public User() {} + public User() { + } public User(String name, String email) { this.name = name; diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java b/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java index 30758d739..c4aa23be3 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java @@ -3,6 +3,7 @@ public class WishList { private boolean bookmark; + public boolean isBookmark() { return bookmark; } diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDto.java index bc9a4102f..ed07ade4f 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDto.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDto.java @@ -37,10 +37,10 @@ public PropertyDetailDto(String title, String description, String locationName, this.host = host; } - public static PropertyDetailDto of (String title, String description, String locationName, - String propertyType, int maxOccupancy, int cleaningFee, - int bedCount, int bathCount, int reviewCount, int pricePerNight, - double latitude, double longitude, double rating, HostDto host) { + public static PropertyDetailDto of(String title, String description, String locationName, + String propertyType, int maxOccupancy, int cleaningFee, + int bedCount, int bathCount, int reviewCount, int pricePerNight, + double latitude, double longitude, double rating, HostDto host) { return new PropertyDetailDto(title, description, locationName, propertyType, maxOccupancy, cleaningFee, bedCount, bathCount, reviewCount, pricePerNight, latitude, longitude, rating, host); } diff --git a/BE/src/main/resources/application.properties b/BE/src/main/resources/application.properties index 20a92f671..f0ef4e61d 100644 --- a/BE/src/main/resources/application.properties +++ b/BE/src/main/resources/application.properties @@ -4,4 +4,4 @@ spring.datasource.username=root spring.datasource.password=codesquad1 logging.level.com.codesquad.airbnb.*=debug -logging.level.org.springframework.jdbc.*=trace \ No newline at end of file +logging.level.org.springframework.jdbc.*=trace diff --git a/BE/src/main/resources/insert.sql b/BE/src/main/resources/insert.sql index 0e61698bc..98ebd01a1 100644 --- a/BE/src/main/resources/insert.sql +++ b/BE/src/main/resources/insert.sql @@ -233,21 +233,39 @@ values (1, false), (18, false); insert into host(property_id, name, email, image_url) -values (1, '새리', 'sally@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452644-8bd6db00-bd71-11eb-83fa-0a67447ce0f2.png'), - (2, '스타브', 'starve@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452674-92655280-bd71-11eb-9d32-38563a72f3ce.png'), - (3, '민', 'min@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452687-95f8d980-bd71-11eb-9ab6-28479a52105e.png'), - (4, '지지', 'zg@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452702-9b562400-bd71-11eb-95b0-83b471a990fa.png'), - (5, '케이', 'k@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452711-9e511480-bd71-11eb-8585-98a8d02680eb.png'), - (6, '펭도리', 'dong@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452722-a14c0500-bd71-11eb-970d-0fc3b6de020c.png'), - (7, '제이슨', 'json@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452729-a446f580-bd71-11eb-8d86-5fea7a5ca153.png'), - (8, '잭슨', 'jackson@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452894-d5bfc100-bd71-11eb-99d5-11065a6450e2.png'), - (9, '호눅스', 'honux@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452913-d9ebde80-bd71-11eb-9f50-169b942c58d3.png'), - (10, '큐', 'kyu@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452922-dce6cf00-bd71-11eb-86b3-814318ea91a0.png'), - (11, '비비', 'bibi@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452936-e07a5600-bd71-11eb-8c43-c4702730a799.png'), - (12, '마르코', 'marco@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452947-e3754680-bd71-11eb-977a-3bc575db71a7.png'), - (13, '프레디', 'freddie@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452971-e839fa80-bd71-11eb-930c-f00becaa8725.png'), - (14, '동', 'dong@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452987-ecfeae80-bd71-11eb-814e-f6b38f95140b.png'), - (15, '연', 'yeon@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119452978-ea03be00-bd71-11eb-9b83-3b3e6d8e22fb.png'), - (16, '크롱', 'crong@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119453018-f38d2600-bd71-11eb-935a-12d78cc2b887.png'), - (17, '제이케이', 'jk@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119453031-f6881680-bd71-11eb-9456-8e26cfcf2a80.png'), - (18, '제인', 'jane@codesquad.com', 'https://user-images.githubusercontent.com/69128652/119453042-f8ea7080-bd71-11eb-9a9d-d76ee1c6a08f.png'); +values (1, '새리', 'sally@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452644-8bd6db00-bd71-11eb-83fa-0a67447ce0f2.png'), + (2, '스타브', 'starve@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452674-92655280-bd71-11eb-9d32-38563a72f3ce.png'), + (3, '민', 'min@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452687-95f8d980-bd71-11eb-9ab6-28479a52105e.png'), + (4, '지지', 'zg@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452702-9b562400-bd71-11eb-95b0-83b471a990fa.png'), + (5, '케이', 'k@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452711-9e511480-bd71-11eb-8585-98a8d02680eb.png'), + (6, '펭도리', 'dong@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452722-a14c0500-bd71-11eb-970d-0fc3b6de020c.png'), + (7, '제이슨', 'json@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452729-a446f580-bd71-11eb-8d86-5fea7a5ca153.png'), + (8, '잭슨', 'jackson@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452894-d5bfc100-bd71-11eb-99d5-11065a6450e2.png'), + (9, '호눅스', 'honux@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452913-d9ebde80-bd71-11eb-9f50-169b942c58d3.png'), + (10, '큐', 'kyu@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452922-dce6cf00-bd71-11eb-86b3-814318ea91a0.png'), + (11, '비비', 'bibi@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452936-e07a5600-bd71-11eb-8c43-c4702730a799.png'), + (12, '마르코', 'marco@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452947-e3754680-bd71-11eb-977a-3bc575db71a7.png'), + (13, '프레디', 'freddie@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452971-e839fa80-bd71-11eb-930c-f00becaa8725.png'), + (14, '동', 'dong@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452987-ecfeae80-bd71-11eb-814e-f6b38f95140b.png'), + (15, '연', 'yeon@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119452978-ea03be00-bd71-11eb-9b83-3b3e6d8e22fb.png'), + (16, '크롱', 'crong@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119453018-f38d2600-bd71-11eb-935a-12d78cc2b887.png'), + (17, '제이케이', 'jk@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119453031-f6881680-bd71-11eb-9456-8e26cfcf2a80.png'), + (18, '제인', 'jane@codesquad.com', + 'https://user-images.githubusercontent.com/69128652/119453042-f8ea7080-bd71-11eb-9a9d-d76ee1c6a08f.png'); diff --git a/BE/src/main/resources/schema.sql b/BE/src/main/resources/schema.sql index 1409572b9..8bb62f3a0 100644 --- a/BE/src/main/resources/schema.sql +++ b/BE/src/main/resources/schema.sql @@ -18,7 +18,7 @@ create table if not exists category create table if not exists property ( id bigint primary key auto_increment, - title varchar(255), + title varchar(255), price int, location_id BIGINT, foreign key (location_id) references location (id) @@ -43,10 +43,10 @@ create table if not exists property_detail create table if not exists image ( - id BIGINT Primary Key auto_increment, - image_url varchar(1000), - name varchar(45), - thumbnail tinyint(1), + id BIGINT Primary Key auto_increment, + image_url varchar(1000), + name varchar(45), + thumbnail tinyint(1), property_id bigint, foreign key (property_id) references property (id) ); @@ -89,11 +89,11 @@ create table if not exists property_category create table if not exists host ( - id bigint primary key auto_increment, - name varchar(45), - email varchar(255), - image_url varchar(1000), - property_id bigint, + id bigint primary key auto_increment, + name varchar(45), + email varchar(255), + image_url varchar(1000), + property_id bigint, foreign key (property_id) references property (id) ); From d78f83c6c36933353e4a5fc1ed453a13404c7a1b Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 17:46:51 +0900 Subject: [PATCH 60/99] =?UTF-8?q?refactor:=20PropertyController=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=ED=95=98=EC=97=AC=20=EB=B0=A9=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=EB=B3=B4=EA=B8=B0=20=EC=A7=80=EC=9B=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/controller/PropertyController.java | 23 +++++++++++++++++++ .../com/codesquad/airbnb/dao/PropertyDao.java | 10 ++++---- ...to.java => PropertyDetailResponseDto.java} | 4 ++-- .../airbnb/service/PropertyService.java | 5 ++++ .../codesquad/airbnb/dao/PropertyDaoTest.java | 4 ++-- 5 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java rename BE/src/main/java/com/codesquad/airbnb/dto/{PropertiesDetailResponseDto.java => PropertyDetailResponseDto.java} (82%) diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java b/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java new file mode 100644 index 000000000..9cdde7d55 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java @@ -0,0 +1,23 @@ +package com.codesquad.airbnb.controller; + +import com.codesquad.airbnb.dto.PropertyDetailResponseDto; +import com.codesquad.airbnb.service.PropertyService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +@RequestMapping("/room") +public class PropertyController { + + PropertyService propertyService; + + public PropertyController(PropertyService propertyService) { + this.propertyService = propertyService; + } + + @GetMapping("/{propertyId}") + public ResponseEntity propertiesAverageValue(@PathVariable Long propertyId) { + return ResponseEntity.ok().body(propertyService.findPropertyDetailByPropertyId(propertyId)); + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java index 55e0d1cc8..90a54e7b3 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java @@ -90,7 +90,7 @@ public PropertyDto mapRow(ResultSet rs, int rowNum) throws SQLException { return propertyDtos; } - public PropertiesDetailResponseDto findPropertyDetailByPropertyId(Long propertyId) { + public PropertyDetailResponseDto findPropertyDetailByPropertyId(Long propertyId) { String sql = "SELECT p.id, p.title, pd.description, l.name, pd.room_type, pd.max_occupancy," + "pd.max_occupancy, pd.cleaning_fee, pd.bed_count, pd.bath_count, pd.review_count," + @@ -103,10 +103,10 @@ public PropertiesDetailResponseDto findPropertyDetailByPropertyId(Long propertyI "and h.property_id = p.id " + "and p.id = ? "; - PropertiesDetailResponseDto propertyDetailDto = - jdbcTemplate.queryForObject(sql, new RowMapper() { + PropertyDetailResponseDto propertyDetailDto = + jdbcTemplate.queryForObject(sql, new RowMapper() { @Override - public PropertiesDetailResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException { + public PropertyDetailResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException { List imageUrls = findImagesByPropertyId(rs.getLong("id")); PropertyDetailDto propertyDetailDto1 = PropertyDetailDto.of( @@ -117,7 +117,7 @@ public PropertiesDetailResponseDto mapRow(ResultSet rs, int rowNum) throws SQLEx rs.getDouble("latitude"), rs.getDouble("longitude"), rs.getDouble("rating"), new HostDto(rs.getString("h.name"), rs.getString("image_url"))); - return new PropertiesDetailResponseDto(imageUrls, propertyDetailDto1); + return new PropertyDetailResponseDto(imageUrls, propertyDetailDto1); } }, propertyId); diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesDetailResponseDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDto.java similarity index 82% rename from BE/src/main/java/com/codesquad/airbnb/dto/PropertiesDetailResponseDto.java rename to BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDto.java index 2cf4c251f..4ae58eb1f 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesDetailResponseDto.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDto.java @@ -3,12 +3,12 @@ import java.util.ArrayList; import java.util.List; -public class PropertiesDetailResponseDto { +public class PropertyDetailResponseDto { private List imageUrls = new ArrayList<>(); private PropertyDetailDto property; - public PropertiesDetailResponseDto(List imageUrls, PropertyDetailDto property) { + public PropertyDetailResponseDto(List imageUrls, PropertyDetailDto property) { this.imageUrls = imageUrls; this.property = property; } diff --git a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java index 8e3ee762a..d388ccaf1 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java @@ -3,6 +3,7 @@ import com.codesquad.airbnb.dao.PropertyDao; import com.codesquad.airbnb.dto.PriceSearchDTO; import com.codesquad.airbnb.dto.PropertiesResponseDto; +import com.codesquad.airbnb.dto.PropertyDetailResponseDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -52,4 +53,8 @@ public PriceSearchDTO priceSearch(Long locationId) { public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { return propertyDao.findBy(locationId, checkIn, checkOut, minPrice, maxPrice, adult, children, infant); } + + public PropertyDetailResponseDto findPropertyDetailByPropertyId (Long propertyId) { + return propertyDao.findPropertyDetailByPropertyId(propertyId); + } } diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java index 1f6645ac5..372a9a77b 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java @@ -1,7 +1,7 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Property; -import com.codesquad.airbnb.dto.PropertiesDetailResponseDto; +import com.codesquad.airbnb.dto.PropertyDetailResponseDto; import com.codesquad.airbnb.dto.PropertiesResponseDto; import com.codesquad.airbnb.dto.PropertyDto; import org.junit.jupiter.api.Test; @@ -63,7 +63,7 @@ void propertyDao_findPricesTest() { @Test void propertyDao_findPropertyDetailByPropertyId() { - PropertiesDetailResponseDto property = propertyDao.findPropertyDetailByPropertyId(1L); + PropertyDetailResponseDto property = propertyDao.findPropertyDetailByPropertyId(1L); assertThat(property).isNotNull(); logger.info("Find property by propertyDao: {}", property); From 30960659f9c5aac9dc03a443c683eda0255f26cd Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 17:53:05 +0900 Subject: [PATCH 61/99] =?UTF-8?q?style:=20Dto=20->=20DTO=EB=A1=9C=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/controller/PropertyController.java | 4 ++-- .../airbnb/controller/SearchController.java | 6 +++--- .../airbnb/dto/{HostDto.java => HostDTO.java} | 4 ++-- .../airbnb/dto/PropertiesResponseDTO.java | 17 +++++++++++++++++ .../airbnb/dto/PropertiesResponseDto.java | 17 ----------------- .../dto/{PropertyDto.java => PropertyDTO.java} | 10 +++++----- ...tyDetailDto.java => PropertyDetailDTO.java} | 16 ++++++++-------- ...Dto.java => PropertyDetailResponseDTO.java} | 8 ++++---- .../airbnb/service/PropertyService.java | 14 +++++++------- ...opertyDaoTest.java => PropertyDAOTest.java} | 18 +++++++++--------- 10 files changed, 57 insertions(+), 57 deletions(-) rename BE/src/main/java/com/codesquad/airbnb/dto/{HostDto.java => HostDTO.java} (86%) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDTO.java delete mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDto.java rename BE/src/main/java/com/codesquad/airbnb/dto/{PropertyDto.java => PropertyDTO.java} (88%) rename BE/src/main/java/com/codesquad/airbnb/dto/{PropertyDetailDto.java => PropertyDetailDTO.java} (90%) rename BE/src/main/java/com/codesquad/airbnb/dto/{PropertyDetailResponseDto.java => PropertyDetailResponseDTO.java} (71%) rename BE/src/test/java/com/codesquad/airbnb/dao/{PropertyDaoTest.java => PropertyDAOTest.java} (79%) diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java b/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java index 9cdde7d55..c520394e1 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java @@ -1,6 +1,6 @@ package com.codesquad.airbnb.controller; -import com.codesquad.airbnb.dto.PropertyDetailResponseDto; +import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; import com.codesquad.airbnb.service.PropertyService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; @@ -17,7 +17,7 @@ public PropertyController(PropertyService propertyService) { } @GetMapping("/{propertyId}") - public ResponseEntity propertiesAverageValue(@PathVariable Long propertyId) { + public ResponseEntity propertiesAverageValue(@PathVariable Long propertyId) { return ResponseEntity.ok().body(propertyService.findPropertyDetailByPropertyId(propertyId)); } } diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java index b9b569f65..c4a6366d8 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java @@ -1,7 +1,7 @@ package com.codesquad.airbnb.controller; import com.codesquad.airbnb.dto.PriceSearchDTO; -import com.codesquad.airbnb.dto.PropertiesResponseDto; +import com.codesquad.airbnb.dto.PropertiesResponseDTO; import com.codesquad.airbnb.service.PropertyService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -19,7 +19,7 @@ public SearchController(PropertyService propertyService) { } @GetMapping() - public ResponseEntity propertiesSearch( + public ResponseEntity propertiesSearch( @RequestParam(value = "locationId", required = false) Long locationId, @RequestParam(value = "checkIn", required = false) LocalDate checkIn, @RequestParam(value = "checkOut", required = false) LocalDate checkOut, @@ -29,7 +29,7 @@ public ResponseEntity propertiesSearch( @RequestParam(value = "children", required = false, defaultValue = "0") int children, @RequestParam(value = "infant", required = false, defaultValue = "0") int infant ) { - PropertiesResponseDto propertiesResponseDto = propertyService.findBy(locationId, checkIn, checkOut, minPrice, maxPrice, adult, children, infant); + PropertiesResponseDTO propertiesResponseDto = propertyService.findBy(locationId, checkIn, checkOut, minPrice, maxPrice, adult, children, infant); return ResponseEntity.ok().body(propertiesResponseDto); } diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/HostDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/HostDTO.java similarity index 86% rename from BE/src/main/java/com/codesquad/airbnb/dto/HostDto.java rename to BE/src/main/java/com/codesquad/airbnb/dto/HostDTO.java index fa7fe2423..57ddebb42 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/HostDto.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/HostDTO.java @@ -1,11 +1,11 @@ package com.codesquad.airbnb.dto; -public class HostDto { +public class HostDTO { private String name; private String imageUrl; - public HostDto(String name, String imageUrl) { + public HostDTO(String name, String imageUrl) { this.name = name; this.imageUrl = imageUrl; } diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDTO.java new file mode 100644 index 000000000..f6ab5245a --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDTO.java @@ -0,0 +1,17 @@ +package com.codesquad.airbnb.dto; + +import java.util.ArrayList; +import java.util.List; + +public class PropertiesResponseDTO { + + List properties = new ArrayList<>(); + + public PropertiesResponseDTO(List properties) { + this.properties = properties; + } + + public List getProperties() { + return properties; + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDto.java deleted file mode 100644 index 8fb7f748a..000000000 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.codesquad.airbnb.dto; - -import java.util.ArrayList; -import java.util.List; - -public class PropertiesResponseDto { - - List properties = new ArrayList<>(); - - public PropertiesResponseDto(List properties) { - this.properties = properties; - } - - public List getProperties() { - return properties; - } -} diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java similarity index 88% rename from BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java rename to BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java index d1bf0314f..9f9c6a1c1 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDto.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java @@ -1,6 +1,6 @@ package com.codesquad.airbnb.dto; -public class PropertyDto { +public class PropertyDTO { private Long propertyId; private String images; @@ -11,10 +11,10 @@ public class PropertyDto { private int reviewCount; private double rating; - public PropertyDto() { + public PropertyDTO() { } - public PropertyDto(Long propertyId, String title, boolean bookmark, int pricePerNight, int reviewCount, double rating) { + public PropertyDTO(Long propertyId, String title, boolean bookmark, int pricePerNight, int reviewCount, double rating) { this.propertyId = propertyId; this.title = title; this.bookmark = bookmark; @@ -23,8 +23,8 @@ public PropertyDto(Long propertyId, String title, boolean bookmark, int pricePer this.rating = rating; } - public static PropertyDto of(Long propertyId, String propertyTitle, boolean bookmark, int price, int reviewCount, double rating) { - return new PropertyDto(propertyId, propertyTitle, bookmark, price, + public static PropertyDTO of(Long propertyId, String propertyTitle, boolean bookmark, int price, int reviewCount, double rating) { + return new PropertyDTO(propertyId, propertyTitle, bookmark, price, reviewCount, rating); } diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDTO.java similarity index 90% rename from BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDto.java rename to BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDTO.java index ed07ade4f..d2ef16f16 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDto.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDTO.java @@ -1,6 +1,6 @@ package com.codesquad.airbnb.dto; -public class PropertyDetailDto { +public class PropertyDetailDTO { private String title; private String description; @@ -15,12 +15,12 @@ public class PropertyDetailDto { private double latitude; private double longitude; private double rating; - private HostDto host; + private HostDTO host; - public PropertyDetailDto(String title, String description, String locationName, + public PropertyDetailDTO(String title, String description, String locationName, String propertyType, int maxOccupancy, int cleaningFee, int bedCount, int bathCount, int reviewCount, int pricePerNight, - double latitude, double longitude, double rating, HostDto host) { + double latitude, double longitude, double rating, HostDTO host) { this.title = title; this.description = description; this.locationName = locationName; @@ -37,11 +37,11 @@ public PropertyDetailDto(String title, String description, String locationName, this.host = host; } - public static PropertyDetailDto of(String title, String description, String locationName, + public static PropertyDetailDTO of(String title, String description, String locationName, String propertyType, int maxOccupancy, int cleaningFee, int bedCount, int bathCount, int reviewCount, int pricePerNight, - double latitude, double longitude, double rating, HostDto host) { - return new PropertyDetailDto(title, description, locationName, propertyType, maxOccupancy, + double latitude, double longitude, double rating, HostDTO host) { + return new PropertyDetailDTO(title, description, locationName, propertyType, maxOccupancy, cleaningFee, bedCount, bathCount, reviewCount, pricePerNight, latitude, longitude, rating, host); } @@ -97,7 +97,7 @@ public double getRating() { return rating; } - public HostDto getHost() { + public HostDTO getHost() { return host; } diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDto.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDTO.java similarity index 71% rename from BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDto.java rename to BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDTO.java index 4ae58eb1f..fdb9b1c34 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDto.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDTO.java @@ -3,12 +3,12 @@ import java.util.ArrayList; import java.util.List; -public class PropertyDetailResponseDto { +public class PropertyDetailResponseDTO { private List imageUrls = new ArrayList<>(); - private PropertyDetailDto property; + private PropertyDetailDTO property; - public PropertyDetailResponseDto(List imageUrls, PropertyDetailDto property) { + public PropertyDetailResponseDTO(List imageUrls, PropertyDetailDTO property) { this.imageUrls = imageUrls; this.property = property; } @@ -17,7 +17,7 @@ public List getImageUrls() { return imageUrls; } - public PropertyDetailDto getProperty() { + public PropertyDetailDTO getProperty() { return property; } diff --git a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java index d388ccaf1..cd7be9b0a 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java @@ -1,9 +1,9 @@ package com.codesquad.airbnb.service; -import com.codesquad.airbnb.dao.PropertyDao; +import com.codesquad.airbnb.dao.PropertyDAO; import com.codesquad.airbnb.dto.PriceSearchDTO; -import com.codesquad.airbnb.dto.PropertiesResponseDto; -import com.codesquad.airbnb.dto.PropertyDetailResponseDto; +import com.codesquad.airbnb.dto.PropertiesResponseDTO; +import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -13,10 +13,10 @@ @Service public class PropertyService { - private PropertyDao propertyDao; + private PropertyDAO propertyDao; @Autowired - public PropertyService(PropertyDao propertyDao) { + public PropertyService(PropertyDAO propertyDao) { this.propertyDao = propertyDao; } @@ -50,11 +50,11 @@ public PriceSearchDTO priceSearch(Long locationId) { return priceSearchDTO; } - public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { + public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { return propertyDao.findBy(locationId, checkIn, checkOut, minPrice, maxPrice, adult, children, infant); } - public PropertyDetailResponseDto findPropertyDetailByPropertyId (Long propertyId) { + public PropertyDetailResponseDTO findPropertyDetailByPropertyId (Long propertyId) { return propertyDao.findPropertyDetailByPropertyId(propertyId); } } diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java similarity index 79% rename from BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java rename to BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java index 372a9a77b..9cabfea4e 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDaoTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java @@ -1,9 +1,9 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Property; -import com.codesquad.airbnb.dto.PropertyDetailResponseDto; -import com.codesquad.airbnb.dto.PropertiesResponseDto; -import com.codesquad.airbnb.dto.PropertyDto; +import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; +import com.codesquad.airbnb.dto.PropertiesResponseDTO; +import com.codesquad.airbnb.dto.PropertyDTO; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,11 +17,11 @@ import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest -public class PropertyDaoTest { - private Logger logger = LoggerFactory.getLogger(PropertyDaoTest.class); +public class PropertyDAOTest { + private Logger logger = LoggerFactory.getLogger(PropertyDAOTest.class); @Autowired - PropertyDao propertyDao; + PropertyDAO propertyDao; @Test void propertyDao_findById() { @@ -43,9 +43,9 @@ void propertyDao_findByAll() { @Test void propertyDao_findBy() { - PropertiesResponseDto properties = propertyDao.findBy(1L, LocalDate.of(2021, 5, 20), LocalDate.of(2021, 5, 23), + PropertiesResponseDTO properties = propertyDao.findBy(1L, LocalDate.of(2021, 5, 20), LocalDate.of(2021, 5, 23), 10000, 100000, 2, 0, 0); - for (PropertyDto property : properties.getProperties()) { + for (PropertyDTO property : properties.getProperties()) { assertThat(property).isNotNull(); logger.info("Find property by propertyDao: {}", property); @@ -63,7 +63,7 @@ void propertyDao_findPricesTest() { @Test void propertyDao_findPropertyDetailByPropertyId() { - PropertyDetailResponseDto property = propertyDao.findPropertyDetailByPropertyId(1L); + PropertyDetailResponseDTO property = propertyDao.findPropertyDetailByPropertyId(1L); assertThat(property).isNotNull(); logger.info("Find property by propertyDao: {}", property); From 9fd1ef3b974db935ccaad57304ac38d2d87e5f30 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 17:53:27 +0900 Subject: [PATCH 62/99] =?UTF-8?q?style:=20Dao=20->=20DAO=EB=A1=9C=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{PropertyDao.java => PropertyDAO.java} | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) rename BE/src/main/java/com/codesquad/airbnb/dao/{PropertyDao.java => PropertyDAO.java} (83%) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java similarity index 83% rename from BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java rename to BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index 90a54e7b3..099c39114 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDao.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -17,12 +17,12 @@ import java.util.List; @Repository -public class PropertyDao { +public class PropertyDAO { private final JdbcTemplate jdbcTemplate; @Autowired - public PropertyDao(DataSource dataSource) { + public PropertyDAO(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); } @@ -47,7 +47,7 @@ public List findAll() { return properties; } - public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, + public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { int maxOccupancy = adult + children + infant; String sql = "select p.id, p.title, wl.bookmark, p.price, pd.review_count, pd.rating " + @@ -64,11 +64,11 @@ public PropertiesResponseDto findBy(Long locationId, LocalDate checkIn, LocalDat long diff = ChronoUnit.DAYS.between(checkIn, checkOut); - List propertyDto = jdbcTemplate.query(sql, new RowMapper() { + List propertyDto = jdbcTemplate.query(sql, new RowMapper() { // interface method @Override - public PropertyDto mapRow(ResultSet rs, int rowNum) throws SQLException { - return PropertyDto.of(rs.getLong("id"), rs.getString("name"), + public PropertyDTO mapRow(ResultSet rs, int rowNum) throws SQLException { + return PropertyDTO.of(rs.getLong("id"), rs.getString("name"), rs.getBoolean("bookmark"), rs.getInt("price"), rs.getInt("review_count"), rs.getDouble("rating")); } @@ -79,18 +79,18 @@ public PropertyDto mapRow(ResultSet rs, int rowNum) throws SQLException { new SqlParameterValue(Types.INTEGER, maxPrice)); propertyDto.stream() - .forEach(propertyDto1 -> { - propertyDto1.setImages(findImageByPropertyId(propertyDto1.getPropertyId())); - propertyDto1.setTotalPrice(diff); + .forEach(propertyDTO1 -> { + propertyDTO1.setImages(findImageByPropertyId(propertyDTO1.getPropertyId())); + propertyDTO1.setTotalPrice(diff); } ); - PropertiesResponseDto propertyDtos = new PropertiesResponseDto(propertyDto); + PropertiesResponseDTO propertyDtos = new PropertiesResponseDTO(propertyDto); return propertyDtos; } - public PropertyDetailResponseDto findPropertyDetailByPropertyId(Long propertyId) { + public PropertyDetailResponseDTO findPropertyDetailByPropertyId(Long propertyId) { String sql = "SELECT p.id, p.title, pd.description, l.name, pd.room_type, pd.max_occupancy," + "pd.max_occupancy, pd.cleaning_fee, pd.bed_count, pd.bath_count, pd.review_count," + @@ -103,21 +103,21 @@ public PropertyDetailResponseDto findPropertyDetailByPropertyId(Long propertyId) "and h.property_id = p.id " + "and p.id = ? "; - PropertyDetailResponseDto propertyDetailDto = - jdbcTemplate.queryForObject(sql, new RowMapper() { + PropertyDetailResponseDTO propertyDetailDto = + jdbcTemplate.queryForObject(sql, new RowMapper() { @Override - public PropertyDetailResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException { + public PropertyDetailResponseDTO mapRow(ResultSet rs, int rowNum) throws SQLException { List imageUrls = findImagesByPropertyId(rs.getLong("id")); - PropertyDetailDto propertyDetailDto1 = PropertyDetailDto.of( + PropertyDetailDTO propertyDetailDTO1 = PropertyDetailDTO.of( rs.getString("title"), rs.getString("description"), rs.getString("l.name"), rs.getString("room_type"), rs.getInt("max_occupancy"), rs.getInt("cleaning_fee"), rs.getInt("bed_count"), rs.getInt("bath_count"), rs.getInt("review_count"), rs.getInt("price"), rs.getDouble("latitude"), rs.getDouble("longitude"), rs.getDouble("rating"), - new HostDto(rs.getString("h.name"), rs.getString("image_url"))); + new HostDTO(rs.getString("h.name"), rs.getString("image_url"))); - return new PropertyDetailResponseDto(imageUrls, propertyDetailDto1); + return new PropertyDetailResponseDTO(imageUrls, propertyDetailDTO1); } }, propertyId); From 44a99bfe92bc8a003b5c3bb47b32d1afd0aae16c Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 25 May 2021 18:37:09 +0900 Subject: [PATCH 63/99] =?UTF-8?q?refactor:=20PropertyController=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=82=A0=EC=A7=9C=20=ED=98=95=EC=8B=9D=20=EC=9D=B8?= =?UTF-8?q?=EC=8B=9D=20=EB=AA=BB=ED=95=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=EB=95=8C=EB=AC=B8=EC=97=90=20=EC=88=98=EC=A0=95=20=EC=A7=84?= =?UTF-8?q?=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/controller/PropertyController.java | 4 +++- .../codesquad/airbnb/controller/SearchController.java | 5 +++-- .../java/com/codesquad/airbnb/dao/PropertyDAO.java | 10 +++++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java b/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java index c520394e1..38f6805d2 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java @@ -6,8 +6,10 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; -@RequestMapping("/room") +@RequestMapping("/rooms") +@RestController public class PropertyController { PropertyService propertyService; diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java index c4a6366d8..c7171d84a 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java @@ -3,6 +3,7 @@ import com.codesquad.airbnb.dto.PriceSearchDTO; import com.codesquad.airbnb.dto.PropertiesResponseDTO; import com.codesquad.airbnb.service.PropertyService; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -21,8 +22,8 @@ public SearchController(PropertyService propertyService) { @GetMapping() public ResponseEntity propertiesSearch( @RequestParam(value = "locationId", required = false) Long locationId, - @RequestParam(value = "checkIn", required = false) LocalDate checkIn, - @RequestParam(value = "checkOut", required = false) LocalDate checkOut, + @RequestParam(value = "checkIn", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate checkIn, + @RequestParam(value = "checkOut", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate checkOut, @RequestParam(value = "minPrice", required = false, defaultValue = "0") int minPrice, @RequestParam(value = "maxPrice", required = false, defaultValue = "1000000") int maxPrice, @RequestParam(value = "adult", required = false, defaultValue = "0") int adult, diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index 099c39114..9ec76de12 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -61,14 +61,17 @@ public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDat "and p.price >= ? " + "and p.price <= ?"; // TODO: userid도 함께 확인해서 wishList를 찾는것이 좋을 것 같음... + long diff = 1; + if(checkIn != null || checkOut != null) { + diff = ChronoUnit.DAYS.between(checkIn, checkOut); + } - long diff = ChronoUnit.DAYS.between(checkIn, checkOut); List propertyDto = jdbcTemplate.query(sql, new RowMapper() { // interface method @Override public PropertyDTO mapRow(ResultSet rs, int rowNum) throws SQLException { - return PropertyDTO.of(rs.getLong("id"), rs.getString("name"), + return PropertyDTO.of(rs.getLong("id"), rs.getString("title"), rs.getBoolean("bookmark"), rs.getInt("price"), rs.getInt("review_count"), rs.getDouble("rating")); } @@ -78,10 +81,11 @@ public PropertyDTO mapRow(ResultSet rs, int rowNum) throws SQLException { new SqlParameterValue(Types.INTEGER, minPrice), new SqlParameterValue(Types.INTEGER, maxPrice)); + long finalDiff = diff; propertyDto.stream() .forEach(propertyDTO1 -> { propertyDTO1.setImages(findImageByPropertyId(propertyDTO1.getPropertyId())); - propertyDTO1.setTotalPrice(diff); + propertyDTO1.setTotalPrice(finalDiff); } ); From d3bb75da979fa93733472865fb3dcacf589a8165 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Wed, 26 May 2021 00:07:17 +0900 Subject: [PATCH 64/99] =?UTF-8?q?feat:=20=EC=83=81=EC=84=B8=20=EC=98=88?= =?UTF-8?q?=EC=95=BD=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=B0=9B=EC=95=84?= =?UTF-8?q?=EB=82=B4=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C,=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ReservationDetailDTO 타입을 이용 --- .../codesquad/airbnb/dao/ReservationDAO.java | 26 ++++++ .../airbnb/dto/ReservationDetailDTO.java | 79 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/ReservationDetailDTO.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java index 7526e7cc1..23a2a6cc4 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java @@ -1,6 +1,7 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Reservation; +import com.codesquad.airbnb.dto.ReservationDetailDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; @@ -70,4 +71,29 @@ public List findAllReservationsByPropertyId(Long propertyId) { return jdbcTemplate.query(sql, new ReservationMapper(), propertyId); } + + public ReservationDetailDTO findDetailedReservation(Long id) { + String sql = "SELECT r.id, p.title, l.name, r.check_in_date, r.check_out_date, h.name as host_name, r.total_price, r.guest_count " + + "FROM reservation as r " + + "LEFT JOIN property as p " + + "on r.property_id = p.id " + + "LEFT JOIN location as l " + + "on l.id = p.location_id " + + "LEFT JOIN host as h " + + "on h.property_id = p.id " + + "where r.id = ?"; + + return jdbcTemplate.queryForObject(sql, ((rs, rowNum) -> { + ReservationDetailDTO reservationDetailDTO = new ReservationDetailDTO(); + reservationDetailDTO.setId(rs.getLong("id")); + reservationDetailDTO.setLocation(rs.getString("name")); + reservationDetailDTO.setPropertyTitle(rs.getString("title")); + reservationDetailDTO.setCheckIn(rs.getDate("check_in_date").toLocalDate()); + reservationDetailDTO.setCheckOut(rs.getDate("check_out_date").toLocalDate()); + reservationDetailDTO.setHostName(rs.getString("host_name")); + reservationDetailDTO.setTotalPrice(rs.getInt("total_price")); + reservationDetailDTO.setGuestCount(rs.getInt("guest_count")); + return reservationDetailDTO; + }), id); + } } diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/ReservationDetailDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/ReservationDetailDTO.java new file mode 100644 index 000000000..b85186ddb --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dto/ReservationDetailDTO.java @@ -0,0 +1,79 @@ +package com.codesquad.airbnb.dto; + +import java.time.LocalDate; + +public class ReservationDetailDTO { + + private Long id; + private String location; + private String propertyTitle; + private LocalDate checkIn; + private LocalDate checkOut; + private String hostName; + private int totalPrice; + private int guestCount; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getPropertyTitle() { + return propertyTitle; + } + + public void setPropertyTitle(String propertyTitle) { + this.propertyTitle = propertyTitle; + } + + public LocalDate getCheckIn() { + return checkIn; + } + + public void setCheckIn(LocalDate checkIn) { + this.checkIn = checkIn; + } + + public LocalDate getCheckOut() { + return checkOut; + } + + public void setCheckOut(LocalDate checkOut) { + this.checkOut = checkOut; + } + + public String getHostName() { + return hostName; + } + + public void setHostName(String hostName) { + this.hostName = hostName; + } + + public int getTotalPrice() { + return totalPrice; + } + + public void setTotalPrice(int totalPrice) { + this.totalPrice = totalPrice; + } + + public int getGuestCount() { + return guestCount; + } + + public void setGuestCount(int guestCount) { + this.guestCount = guestCount; + } +} From dfe816c529874b23e6bf0c8cb55e444c042cf1f4 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Wed, 26 May 2021 00:07:47 +0900 Subject: [PATCH 65/99] =?UTF-8?q?test:=20=EC=83=81=EC=84=B8=20=EC=98=88?= =?UTF-8?q?=EC=95=BD=EC=A0=95=EB=B3=B4=20=EB=B0=9B=EC=95=84=EC=98=A4?= =?UTF-8?q?=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/dao/ReservationDAOTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java index dd9cc8a91..04e6cf5ba 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java @@ -1,6 +1,7 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Reservation; +import com.codesquad.airbnb.dto.ReservationDetailDTO; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -41,4 +42,12 @@ void setReservationDAO_findByUserIdTest() { assertThat(reservation.get(0).getUserId()).isEqualTo(1L); } + + @Test + void reservationDAO_findDetailedReservationTest() { + ReservationDetailDTO reservationDetailDTO = reservationDAO.findDetailedReservation(1L); + + assertThat(reservationDetailDTO.getHostName()).isEqualTo("새리"); + assertThat(reservationDetailDTO.getGuestCount()).isEqualTo(4); + } } From feddf766cb960dab030456f1c2dcc63e611eb773 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Wed, 26 May 2021 00:09:08 +0900 Subject: [PATCH 66/99] =?UTF-8?q?feat:=20=EC=98=88=EC=95=BD=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EC=97=90=20=EA=B4=80=ED=95=9C=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4,=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 26 +++++++++++++++++++ .../airbnb/service/ReservationService.java | 25 ++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java new file mode 100644 index 000000000..bd45f4d9b --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java @@ -0,0 +1,26 @@ +package com.codesquad.airbnb.controller; + +import com.codesquad.airbnb.dao.ReservationDAO; +import com.codesquad.airbnb.dto.ReservationDetailDTO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/reservation") +public class ReservationController { + + private ReservationDAO reservationDAO; + + @Autowired + public ReservationController(ReservationDAO reservationDAO) { + this.reservationDAO = reservationDAO; + } + + @GetMapping("/{reservationId}") + public ReservationDetailDTO browseDetailedReservationById(@PathVariable Long reservationId) { + return reservationDAO.findDetailedReservation(reservationId); + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java b/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java new file mode 100644 index 000000000..86eed43cc --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java @@ -0,0 +1,25 @@ +package com.codesquad.airbnb.service; + +import com.codesquad.airbnb.dao.ReservationDAO; +import com.codesquad.airbnb.domain.Reservation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ReservationService { + + private ReservationDAO reservationDAO; + + @Autowired + public ReservationService(ReservationDAO reservationDAO) { + this.reservationDAO = reservationDAO; + } + + public void createReservation(Reservation reservation) { + reservationDAO.insertReservation(reservation); + } + + public Reservation browseReservationById(Long reservationId) { + return reservationDAO.findReservationById(reservationId); + } +} From e4c3623f3540835cb93b07824942877bc7159f69 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Wed, 26 May 2021 16:59:07 +0900 Subject: [PATCH 67/99] =?UTF-8?q?refactor:=20=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=98=88=EC=95=BD=EC=A0=95=EB=B3=B4=20DTO=EC=97=90=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=ED=95=84=EB=93=9C=EC=99=80=20=EA=B2=8C?= =?UTF-8?q?=ED=84=B0,=20=EC=84=B8=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/dto/ReservationDetailDTO.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/ReservationDetailDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/ReservationDetailDTO.java index b85186ddb..231aead31 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/ReservationDetailDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/ReservationDetailDTO.java @@ -6,6 +6,7 @@ public class ReservationDetailDTO { private Long id; private String location; + private String image; private String propertyTitle; private LocalDate checkIn; private LocalDate checkOut; @@ -29,6 +30,14 @@ public void setLocation(String location) { this.location = location; } + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + public String getPropertyTitle() { return propertyTitle; } @@ -76,4 +85,19 @@ public int getGuestCount() { public void setGuestCount(int guestCount) { this.guestCount = guestCount; } + + @Override + public String toString() { + return "ReservationDetailDTO{" + + "id=" + id + + ", location='" + location + '\'' + + ", image='" + image + '\'' + + ", propertyTitle='" + propertyTitle + '\'' + + ", checkIn=" + checkIn + + ", checkOut=" + checkOut + + ", hostName='" + hostName + '\'' + + ", totalPrice=" + totalPrice + + ", guestCount=" + guestCount + + '}'; + } } From 449601c7190b096dfbfa3aa20828878f86978af8 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Wed, 26 May 2021 17:05:18 +0900 Subject: [PATCH 68/99] =?UTF-8?q?refactor:=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=20=EB=A7=A4=ED=95=91=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/codesquad/airbnb/dao/ReservationDAO.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java index 23a2a6cc4..e934ba4cf 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java @@ -59,7 +59,7 @@ public Reservation findReservationById(Long id) { } public List findAllReservationsByUserId(Long userId) { - String sql = "SELECT id, check_in_date, check_out_date, total_price, guest_count " + + String sql = "SELECT id, check_in_date, check_out_date, total_price, guest_count, user_id, property_id " + "FROM reservation WHERE user_id = ?"; return jdbcTemplate.query(sql, new ReservationMapper(), userId); @@ -73,7 +73,7 @@ public List findAllReservationsByPropertyId(Long propertyId) { } public ReservationDetailDTO findDetailedReservation(Long id) { - String sql = "SELECT r.id, p.title, l.name, r.check_in_date, r.check_out_date, h.name as host_name, r.total_price, r.guest_count " + + String sql = "SELECT r.id, p.title, i.image_url, l.name, r.check_in_date, r.check_out_date, h.name as host_name, r.total_price, r.guest_count " + "FROM reservation as r " + "LEFT JOIN property as p " + "on r.property_id = p.id " + @@ -81,12 +81,15 @@ public ReservationDetailDTO findDetailedReservation(Long id) { "on l.id = p.location_id " + "LEFT JOIN host as h " + "on h.property_id = p.id " + - "where r.id = ?"; + "LEFT JOIN image as i " + + "on i.property_id = p.id " + + "where r.id = ? and i.thumbnail = true"; return jdbcTemplate.queryForObject(sql, ((rs, rowNum) -> { ReservationDetailDTO reservationDetailDTO = new ReservationDetailDTO(); reservationDetailDTO.setId(rs.getLong("id")); reservationDetailDTO.setLocation(rs.getString("name")); + reservationDetailDTO.setImage(rs.getString("image_url")); reservationDetailDTO.setPropertyTitle(rs.getString("title")); reservationDetailDTO.setCheckIn(rs.getDate("check_in_date").toLocalDate()); reservationDetailDTO.setCheckOut(rs.getDate("check_out_date").toLocalDate()); From cc405bfd203194ab18d29febbb647cbb14a0ffaf Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Wed, 26 May 2021 17:05:43 +0900 Subject: [PATCH 69/99] =?UTF-8?q?test:=20=EB=A1=9C=EA=B1=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EB=A1=9C=20=EC=95=8C=EB=A7=9E=EC=9D=80=20=EB=94=94?= =?UTF-8?q?=ED=85=8C=EC=9D=BC=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=B0=9B?= =?UTF-8?q?=EC=95=84=EC=99=94=EB=8A=94=EC=A7=80=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/codesquad/airbnb/dao/ReservationDAOTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java index 04e6cf5ba..b47048381 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java @@ -3,6 +3,8 @@ import com.codesquad.airbnb.domain.Reservation; import com.codesquad.airbnb.dto.ReservationDetailDTO; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; @@ -16,6 +18,8 @@ @Transactional class ReservationDAOTest { + private Logger logger = LoggerFactory.getLogger(ReservationDAOTest.class); + @Autowired ReservationDAO reservationDAO; @@ -49,5 +53,7 @@ void reservationDAO_findDetailedReservationTest() { assertThat(reservationDetailDTO.getHostName()).isEqualTo("새리"); assertThat(reservationDetailDTO.getGuestCount()).isEqualTo(4); + + logger.info(reservationDetailDTO.toString()); } } From b145beaa9b2e909b1266b38ebaea52c1c25aadf5 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Thu, 27 May 2021 16:09:05 +0900 Subject: [PATCH 70/99] =?UTF-8?q?refactor:=20PropertyDetailDTO=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=ED=9B=84,=20ResponseDTO=EB=A1=9C=20=ED=95=A9?= =?UTF-8?q?=EC=B9=A8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PropertyDetailDTO의 항목을 PropertyDetailResponseDTO에 합쳐, 하나로 수정. --- .../airbnb/dto/PropertyDetailDTO.java | 123 ------------------ .../airbnb/dto/PropertyDetailResponseDTO.java | 119 ++++++++++++++++- 2 files changed, 112 insertions(+), 130 deletions(-) delete mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDTO.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDTO.java deleted file mode 100644 index d2ef16f16..000000000 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailDTO.java +++ /dev/null @@ -1,123 +0,0 @@ -package com.codesquad.airbnb.dto; - -public class PropertyDetailDTO { - - private String title; - private String description; - private String locationName; - private String propertyType; - private int maxOccupancy; - private int cleaningFee; - private int bedCount; - private int bathCount; - private int reviewCount; - private int pricePerNight; - private double latitude; - private double longitude; - private double rating; - private HostDTO host; - - public PropertyDetailDTO(String title, String description, String locationName, - String propertyType, int maxOccupancy, int cleaningFee, - int bedCount, int bathCount, int reviewCount, int pricePerNight, - double latitude, double longitude, double rating, HostDTO host) { - this.title = title; - this.description = description; - this.locationName = locationName; - this.propertyType = propertyType; - this.maxOccupancy = maxOccupancy; - this.cleaningFee = cleaningFee; - this.bedCount = bedCount; - this.bathCount = bathCount; - this.reviewCount = reviewCount; - this.pricePerNight = pricePerNight; - this.latitude = latitude; - this.longitude = longitude; - this.rating = rating; - this.host = host; - } - - public static PropertyDetailDTO of(String title, String description, String locationName, - String propertyType, int maxOccupancy, int cleaningFee, - int bedCount, int bathCount, int reviewCount, int pricePerNight, - double latitude, double longitude, double rating, HostDTO host) { - return new PropertyDetailDTO(title, description, locationName, propertyType, maxOccupancy, - cleaningFee, bedCount, bathCount, reviewCount, pricePerNight, latitude, longitude, rating, host); - } - - public String getTitle() { - return title; - } - - public String getDescription() { - return description; - } - - public String getLocationName() { - return locationName; - } - - public String getPropertyType() { - return propertyType; - } - - public int getMaxOccupancy() { - return maxOccupancy; - } - - public int getCleaningFee() { - return cleaningFee; - } - - public int getBedCount() { - return bedCount; - } - - public int getBathCount() { - return bathCount; - } - - public int getReviewCount() { - return reviewCount; - } - - public int getPricePerNight() { - return pricePerNight; - } - - public double getLatitude() { - return latitude; - } - - public double getLongitude() { - return longitude; - } - - public double getRating() { - return rating; - } - - public HostDTO getHost() { - return host; - } - - @Override - public String toString() { - return "{" + - "title='" + title + '\'' + - ", description='" + description + '\'' + - ", locationName='" + locationName + '\'' + - ", propertyType='" + propertyType + '\'' + - ", maxOccupancy=" + maxOccupancy + - ", cleaningFee=" + cleaningFee + - ", bedCount=" + bedCount + - ", bathCount=" + bathCount + - ", reviewCount=" + reviewCount + - ", pricePerNight=" + pricePerNight + - ", latitude=" + latitude + - ", longitude=" + longitude + - ", rating=" + rating + - ", host=" + host + - "}"; - } -} diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDTO.java index fdb9b1c34..75a7a5108 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDTO.java @@ -6,26 +6,131 @@ public class PropertyDetailResponseDTO { private List imageUrls = new ArrayList<>(); - private PropertyDetailDTO property; + private String title; + private String description; + private String locationName; + private String propertyType; + private int maxOccupancy; + private int cleaningFee; + private int bedCount; + private int bathCount; + private int reviewCount; + private int pricePerNight; + private double latitude; + private double longitude; + private double rating; + private HostDTO host; - public PropertyDetailResponseDTO(List imageUrls, PropertyDetailDTO property) { + public PropertyDetailResponseDTO(List imageUrls, String title, String description, String locationName, + String propertyType, int maxOccupancy, int cleaningFee, int bedCount, + int bathCount, int reviewCount, int pricePerNight, double latitude, + double longitude, double rating, HostDTO host) { this.imageUrls = imageUrls; - this.property = property; + this.title = title; + this.description = description; + this.locationName = locationName; + this.propertyType = propertyType; + this.maxOccupancy = maxOccupancy; + this.cleaningFee = cleaningFee; + this.bedCount = bedCount; + this.bathCount = bathCount; + this.reviewCount = reviewCount; + this.pricePerNight = pricePerNight; + this.latitude = latitude; + this.longitude = longitude; + this.rating = rating; + this.host = host; + } + + public static PropertyDetailResponseDTO of(List imageUrls, String title, String description, + String locationName, String propertyType, int maxOccupancy, + int cleaningFee, int bedCount, int bathCount, int reviewCount, + int pricePerNight, double latitude, double longitude, double rating, + HostDTO host) { + return new PropertyDetailResponseDTO (imageUrls, title, description, locationName, propertyType, maxOccupancy, + cleaningFee, bedCount, bathCount, reviewCount, pricePerNight, latitude, longitude, rating, host); } public List getImageUrls() { return imageUrls; } - public PropertyDetailDTO getProperty() { - return property; + public String getTitle() { + return title; + } + + public String getDescription() { + return description; + } + + public String getLocationName() { + return locationName; + } + + public String getPropertyType() { + return propertyType; + } + + public int getMaxOccupancy() { + return maxOccupancy; + } + + public int getCleaningFee() { + return cleaningFee; + } + + public int getBedCount() { + return bedCount; + } + + public int getBathCount() { + return bathCount; + } + + public int getReviewCount() { + return reviewCount; + } + + public int getPricePerNight() { + return pricePerNight; + } + + public double getLatitude() { + return latitude; + } + + public double getLongitude() { + return longitude; + } + + public double getRating() { + return rating; + } + + public HostDTO getHost() { + return host; } @Override public String toString() { - return "PropertiesDetailResponseDto{" + + return "PropertyDetailResponseDTO{" + "imageUrls=" + imageUrls + - ", property=" + property + + " Property{" + + " title='" + title + '\'' + + ", description='" + description + '\'' + + ", locationName='" + locationName + '\'' + + ", propertyType='" + propertyType + '\'' + + ", maxOccupancy=" + maxOccupancy + + ", cleaningFee=" + cleaningFee + + ", bedCount=" + bedCount + + ", bathCount=" + bathCount + + ", reviewCount=" + reviewCount + + ", pricePerNight=" + pricePerNight + + ", latitude=" + latitude + + ", longitude=" + longitude + + ", rating=" + rating + + ", host=" + host + + '}' + '}'; } } From d410c67b99040bd5cbf3055f5e2ac354df13d381 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Thu, 27 May 2021 16:09:44 +0900 Subject: [PATCH 71/99] =?UTF-8?q?refactor:=20PropertyDTO=EC=97=90=20?= =?UTF-8?q?=EC=9C=84=EB=8F=84,=20=EA=B2=BD=EB=8F=84=20=ED=95=AD=EB=AA=A9?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/dto/PropertyDTO.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java index 9f9c6a1c1..0ccc50eaa 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java @@ -10,22 +10,26 @@ public class PropertyDTO { private long totalPrice; private int reviewCount; private double rating; + private double latitude; + private double longitude; public PropertyDTO() { } - public PropertyDTO(Long propertyId, String title, boolean bookmark, int pricePerNight, int reviewCount, double rating) { + public PropertyDTO(Long propertyId, String title, boolean bookmark, int pricePerNight, int reviewCount, double rating, double latitude, double longitude) { this.propertyId = propertyId; this.title = title; this.bookmark = bookmark; this.pricePerNight = pricePerNight; this.reviewCount = reviewCount; this.rating = rating; + this.latitude = latitude; + this.longitude = longitude; } - public static PropertyDTO of(Long propertyId, String propertyTitle, boolean bookmark, int price, int reviewCount, double rating) { + public static PropertyDTO of(Long propertyId, String propertyTitle, boolean bookmark, int price, int reviewCount, double rating, double latitude, double longitude) { return new PropertyDTO(propertyId, propertyTitle, bookmark, price, - reviewCount, rating); + reviewCount, rating, latitude, longitude); } public void setImages(String images) { @@ -70,15 +74,17 @@ public double getRating() { @Override public String toString() { - return "PropertyDto{" + + return "PropertyDTO{" + "propertyId=" + propertyId + - ", images=" + images + + ", images='" + images + '\'' + ", title='" + title + '\'' + ", bookmark=" + bookmark + ", pricePerNight=" + pricePerNight + ", totalPrice=" + totalPrice + ", reviewCount=" + reviewCount + ", rating=" + rating + + ", latitude=" + latitude + + ", longitude=" + longitude + '}'; } } From 0374715e05d75cccec6c09ac25654941d362fc15 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Thu, 27 May 2021 16:10:40 +0900 Subject: [PATCH 72/99] =?UTF-8?q?refactor:=20PropertyDetailDTO=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/dao/PropertyDAO.java | 62 +++++++++++++------ 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index 9ec76de12..e6aa98359 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -1,17 +1,18 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Property; -import com.codesquad.airbnb.dto.*; +import com.codesquad.airbnb.dto.HostDTO; +import com.codesquad.airbnb.dto.PropertiesResponseDTO; +import com.codesquad.airbnb.dto.PropertyDTO; +import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.core.SqlParameterValue; import org.springframework.stereotype.Repository; import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Types; import java.time.LocalDate; import java.time.temporal.ChronoUnit; import java.util.List; @@ -50,36 +51,57 @@ public List findAll() { public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { int maxOccupancy = adult + children + infant; - String sql = "select p.id, p.title, wl.bookmark, p.price, pd.review_count, pd.rating " + - "from property as p, " + - "property_detail as pd, " + - "wish_list as wl " + + String sql = "select p.id, p.title, wl.bookmark, p.price, pd.review_count, " + + "pd.rating, pd.latitude, pd.longitude, r.check_in_date, r.check_out_date " + + "from property as p " + + "left JOIN property_detail pd on pd.property_id = p.id " + + "left JOIN wish_list wl on wl.property_id = p.id " + + "left join reservation r on p.id = r.property_id " + "where p.id = pd.property_id " + "and p.id = wl.property_id " + "and p.location_id = ? " + "and pd.max_occupancy >= ? " + "and p.price >= ? " + - "and p.price <= ?"; + "and p.price <= ? " ; // TODO: userid도 함께 확인해서 wishList를 찾는것이 좋을 것 같음... long diff = 1; - if(checkIn != null || checkOut != null) { - diff = ChronoUnit.DAYS.between(checkIn, checkOut); - } + + Object[] objects = {locationId, maxOccupancy, minPrice, maxPrice}; + if (checkIn != null || checkOut != null) { + sql += "AND r.property_id NOT IN (" + + "SELECT property_id " + + "FROM reservation " + + "WHERE "; + + if (checkIn != null) { + sql += "(r.check_in_date <= ? And r.check_out_date > ? )"; + objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, checkIn, checkIn}; + } + if (checkOut != null) { + sql += "OR (r.check_in_date < ? And r.check_out_date >= ? )"; + objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, checkOut, checkOut}; + } + if (checkIn != null && checkOut != null) { + sql += "OR (? <= r.check_in_date AND r.check_in_date < ? )"; + objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, checkIn, checkIn , checkOut, checkOut, checkIn, checkOut}; + diff = ChronoUnit.DAYS.between(checkIn, checkOut); + } + sql += ")"; + } + List propertyDto = jdbcTemplate.query(sql, new RowMapper() { // interface method @Override public PropertyDTO mapRow(ResultSet rs, int rowNum) throws SQLException { return PropertyDTO.of(rs.getLong("id"), rs.getString("title"), rs.getBoolean("bookmark"), rs.getInt("price"), - rs.getInt("review_count"), rs.getDouble("rating")); + rs.getInt("review_count"), rs.getDouble("rating"), + rs.getDouble("latitude"), rs.getDouble("longitude")); } - }, - new SqlParameterValue(Types.BIGINT, locationId), - new SqlParameterValue(Types.INTEGER, maxOccupancy), - new SqlParameterValue(Types.INTEGER, minPrice), - new SqlParameterValue(Types.INTEGER, maxPrice)); + },objects + ); long finalDiff = diff; propertyDto.stream() @@ -113,15 +135,15 @@ public PropertyDetailResponseDTO findPropertyDetailByPropertyId(Long propertyId) public PropertyDetailResponseDTO mapRow(ResultSet rs, int rowNum) throws SQLException { List imageUrls = findImagesByPropertyId(rs.getLong("id")); - PropertyDetailDTO propertyDetailDTO1 = PropertyDetailDTO.of( + + return PropertyDetailResponseDTO.of( + imageUrls, rs.getString("title"), rs.getString("description"), rs.getString("l.name"), rs.getString("room_type"), rs.getInt("max_occupancy"), rs.getInt("cleaning_fee"), rs.getInt("bed_count"), rs.getInt("bath_count"), rs.getInt("review_count"), rs.getInt("price"), rs.getDouble("latitude"), rs.getDouble("longitude"), rs.getDouble("rating"), new HostDTO(rs.getString("h.name"), rs.getString("image_url"))); - - return new PropertyDetailResponseDTO(imageUrls, propertyDetailDTO1); } }, propertyId); From 30cfdae9171d06c9bba7fa927139fd1a7daff05b Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Thu, 27 May 2021 16:21:43 +0900 Subject: [PATCH 73/99] =?UTF-8?q?feat:=20=EC=83=88=EB=A1=9C=EC=9A=B4=20?= =?UTF-8?q?=EC=98=88=EC=95=BD=EC=9D=84=20=EB=A7=8C=EB=93=A4=EA=B8=B0=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20ReservationRequestDTO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 가격정보를 내보낼 때, 새로운 예약을 만들 때 사용될 DTO --- .../airbnb/dto/ReservationRequestDTO.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/ReservationRequestDTO.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/ReservationRequestDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/ReservationRequestDTO.java new file mode 100644 index 000000000..106ae6eba --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dto/ReservationRequestDTO.java @@ -0,0 +1,27 @@ +package com.codesquad.airbnb.dto; + +import java.time.LocalDate; + +public class ReservationRequestDTO { + + private LocalDate checkIn; + private LocalDate checkOut; + private int guestCount; + private int totalPrice; + + public LocalDate getCheckIn() { + return checkIn; + } + + public LocalDate getCheckOut() { + return checkOut; + } + + public int getGuestCount() { + return guestCount; + } + + public int getTotalPrice() { + return totalPrice; + } +} From 1e048c0c0ff14667a2dfec622b1bf84ef0bdb2dc Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Thu, 27 May 2021 16:23:32 +0900 Subject: [PATCH 74/99] =?UTF-8?q?feat:=20=ED=81=B4=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EC=96=B8=ED=8A=B8=EB=A1=9C=EB=B6=80=ED=84=B0=20=EB=B0=9B?= =?UTF-8?q?=EC=9D=80=20=EC=98=88=EC=95=BD=EC=A0=95=EB=B3=B4=EB=A1=9C=20?= =?UTF-8?q?=EA=B0=80=EA=B2=A9=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=ED=95=B4=EC=84=9C=20=EB=84=98=EA=B2=A8=EC=A4=84=20Pri?= =?UTF-8?q?ceInfoDTO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codesquad/airbnb/dto/PriceInfoDTO.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dto/PriceInfoDTO.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PriceInfoDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/PriceInfoDTO.java new file mode 100644 index 000000000..8dae55147 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PriceInfoDTO.java @@ -0,0 +1,55 @@ +package com.codesquad.airbnb.dto; + +public class PriceInfoDTO { + + private static final double SERVICE_FEE_RATE = .03; + private static final double TAX_RATE = .07; + + private int priceForDays; + private int cleaningFee; + + private int serviceFee; + private int tax; + + private int totalPrice; + + public int getPriceForDays() { + return priceForDays; + } + + public void setPriceForDays(int pricePerNight, int days) { + this.priceForDays = pricePerNight * days; + } + + public int getCleaningFee() { + return cleaningFee; + } + + public void setCleaningFee(int cleaningFee) { + this.cleaningFee = cleaningFee; + } + + public int getServiceFee() { + return serviceFee; + } + + public void setServiceFee() { + this.serviceFee = (int) (priceForDays * SERVICE_FEE_RATE); + } + + public int getTax() { + return tax; + } + + public void setTax() { + this.tax = (int) ((priceForDays + cleaningFee + serviceFee) * TAX_RATE); + } + + public int getTotalPrice() { + return totalPrice; + } + + public void setTotalPrice() { + this.totalPrice = priceForDays + cleaningFee + serviceFee + tax; + } +} From 31a6956b8ebecf08fa300208d3bea361ba52be76 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Thu, 27 May 2021 16:26:00 +0900 Subject: [PATCH 75/99] =?UTF-8?q?refactor:=20Reservation=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=9D=98=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/codesquad/airbnb/dao/ReservationDAO.java | 5 +++-- .../main/java/com/codesquad/airbnb/domain/Reservation.java | 3 +-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java index e934ba4cf..5d1cb5b60 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java @@ -29,13 +29,14 @@ public ReservationDAO(DataSource dataSource) { private static class ReservationMapper implements RowMapper { public Reservation mapRow(ResultSet resultSet, int rowNumber) throws SQLException { - return new Reservation(resultSet.getLong("id"), - resultSet.getDate("check_in_date").toLocalDate(), + Reservation reservation = new Reservation(resultSet.getDate("check_in_date").toLocalDate(), resultSet.getDate("check_out_date").toLocalDate(), resultSet.getInt("total_price"), resultSet.getInt("guest_count"), resultSet.getLong("user_id"), resultSet.getLong("property_id")); + reservation.setId(resultSet.getLong("id")); + return reservation; } } diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java b/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java index c2f4cbefc..3cd30b560 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java @@ -18,8 +18,7 @@ public class Reservation { public Reservation() { } - public Reservation(Long id, LocalDate checkIn, LocalDate checkOut, int totalPrice, int guestCount, Long userId, Long propertyId) { - this.id = id; + public Reservation(LocalDate checkIn, LocalDate checkOut, int totalPrice, int guestCount, Long userId, Long propertyId) { this.checkIn = checkIn; this.checkOut = checkOut; this.totalPrice = totalPrice; From 6603ef86a46d74715b7c8a29a42c0bf046142890 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Thu, 27 May 2021 16:29:31 +0900 Subject: [PATCH 76/99] =?UTF-8?q?feat:=20=EC=98=88=EC=95=BD=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=EC=A0=95=EB=B3=B4=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/controller/ReservationController.java | 10 ++++++---- .../codesquad/airbnb/service/ReservationService.java | 4 ++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java index bd45f4d9b..4c59635a1 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java @@ -2,6 +2,8 @@ import com.codesquad.airbnb.dao.ReservationDAO; import com.codesquad.airbnb.dto.ReservationDetailDTO; +import com.codesquad.airbnb.dto.ReservationRequestDTO; +import com.codesquad.airbnb.service.ReservationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -12,15 +14,15 @@ @RequestMapping("/reservation") public class ReservationController { - private ReservationDAO reservationDAO; + private ReservationService reservationService; @Autowired - public ReservationController(ReservationDAO reservationDAO) { - this.reservationDAO = reservationDAO; + public ReservationController(ReservationService reservationService) { + this.reservationService = reservationService; } @GetMapping("/{reservationId}") public ReservationDetailDTO browseDetailedReservationById(@PathVariable Long reservationId) { - return reservationDAO.findDetailedReservation(reservationId); + return reservationService.browseReservationDetailById(reservationId); } } diff --git a/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java b/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java index 86eed43cc..a3b06c71c 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java @@ -22,4 +22,8 @@ public void createReservation(Reservation reservation) { public Reservation browseReservationById(Long reservationId) { return reservationDAO.findReservationById(reservationId); } + + public ReservationDetailDTO browseReservationDetailById(Long reservationId) { + return reservationDAO.findDetailedReservation(reservationId); + } } From b087f47ff1bba02f561d248ddca8d775c0a6f6d3 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Thu, 27 May 2021 16:31:09 +0900 Subject: [PATCH 77/99] =?UTF-8?q?feat:=20=EC=83=88=EB=A1=9C=EC=9A=B4=20?= =?UTF-8?q?=EC=98=88=EC=95=BD=EC=A0=95=EB=B3=B4=EB=A1=9C=20=EA=B0=80?= =?UTF-8?q?=EA=B2=A9=EC=A0=95=EB=B3=B4=20=EB=B6=88=EB=9F=AC=EC=98=A4?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5,=20=EC=83=88=EB=A1=9C=EC=9A=B4?= =?UTF-8?q?=20=EC=98=88=EC=95=BD=EC=9D=84=20=EB=A7=8C=EB=93=A4=EC=96=B4=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReservationController.java | 17 ++++++--- .../airbnb/service/ReservationService.java | 36 +++++++++++++++++-- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java index 4c59635a1..cb6786968 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java @@ -1,14 +1,11 @@ package com.codesquad.airbnb.controller; -import com.codesquad.airbnb.dao.ReservationDAO; +import com.codesquad.airbnb.dto.PriceInfoDTO; import com.codesquad.airbnb.dto.ReservationDetailDTO; import com.codesquad.airbnb.dto.ReservationRequestDTO; import com.codesquad.airbnb.service.ReservationService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/reservation") @@ -25,4 +22,14 @@ public ReservationController(ReservationService reservationService) { public ReservationDetailDTO browseDetailedReservationById(@PathVariable Long reservationId) { return reservationService.browseReservationDetailById(reservationId); } + + @GetMapping + public PriceInfoDTO browsePriceInfo(@RequestParam Long propertyId, @RequestBody ReservationRequestDTO reservationInfo) { + return reservationService.browsePriceInfoReservation(propertyId, reservationInfo); + } + + @PostMapping("/{propertyId}") + public void createReservation(@PathVariable Long propertyId, @RequestBody ReservationRequestDTO reservationInfo) { + reservationService.createReservation(propertyId, reservationInfo); + } } diff --git a/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java b/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java index a3b06c71c..63b4cf325 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java @@ -1,21 +1,30 @@ package com.codesquad.airbnb.service; +import com.codesquad.airbnb.dao.PropertyDAO; import com.codesquad.airbnb.dao.ReservationDAO; import com.codesquad.airbnb.domain.Reservation; +import com.codesquad.airbnb.dto.PriceInfoDTO; +import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; +import com.codesquad.airbnb.dto.ReservationDetailDTO; +import com.codesquad.airbnb.dto.ReservationRequestDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.temporal.ChronoUnit; + @Service public class ReservationService { private ReservationDAO reservationDAO; + private PropertyDAO propertyDAO; @Autowired - public ReservationService(ReservationDAO reservationDAO) { + public ReservationService(ReservationDAO reservationDAO, PropertyDAO propertyDAO) { this.reservationDAO = reservationDAO; + this.propertyDAO = propertyDAO; } - public void createReservation(Reservation reservation) { + public void insertReservation(Reservation reservation) { reservationDAO.insertReservation(reservation); } @@ -26,4 +35,27 @@ public Reservation browseReservationById(Long reservationId) { public ReservationDetailDTO browseReservationDetailById(Long reservationId) { return reservationDAO.findDetailedReservation(reservationId); } + + public PriceInfoDTO browsePriceInfoReservation(Long propertyId, ReservationRequestDTO reservationRequestDTO) { + PropertyDetailResponseDTO propertyDetail = propertyDAO.findPropertyDetailByPropertyId(propertyId); + PriceInfoDTO priceInfoDTO = new PriceInfoDTO(); + + int days = (int) ChronoUnit.DAYS.between(reservationRequestDTO.getCheckIn(), reservationRequestDTO.getCheckOut()); + + priceInfoDTO.setPriceForDays(propertyDetail.getPricePerNight(), days); + priceInfoDTO.setCleaningFee(propertyDetail.getCleaningFee()); + priceInfoDTO.setServiceFee(); + priceInfoDTO.setTax(); + + return priceInfoDTO; + } + + public void createReservation(Long propertyId, ReservationRequestDTO reservationRequestDTO) { + reservationDAO.insertReservation(new Reservation(reservationRequestDTO.getCheckIn(), + reservationRequestDTO.getCheckOut(), + reservationRequestDTO.getTotalPrice(), + reservationRequestDTO.getGuestCount(), + 1L, // TODO: 유저가 제대로 구현되면 로직 입력 + propertyId)); + } } From 237f081675bea71272bfeb5eae1b1089cd484407 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Thu, 27 May 2021 16:32:40 +0900 Subject: [PATCH 78/99] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20optimize=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java | 3 +-- .../java/com/codesquad/airbnb/dao/ReservationDAOTest.java | 5 +++-- .../com/codesquad/airbnb/service/PropertyServiceTest.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java index 9cabfea4e..2690443c9 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java @@ -1,9 +1,9 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Property; -import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; import com.codesquad.airbnb.dto.PropertiesResponseDTO; import com.codesquad.airbnb.dto.PropertyDTO; +import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,7 +13,6 @@ import java.time.LocalDate; import java.util.List; - import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java index b47048381..bc891d646 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java @@ -12,7 +12,7 @@ import java.time.LocalDate; import java.util.List; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest @Transactional @@ -25,9 +25,10 @@ class ReservationDAOTest { @Test void reservationDAO_insertTest() { - Reservation reservation = new Reservation(1L, LocalDate.of(2021, 9, 13), + Reservation reservation = new Reservation(LocalDate.of(2021, 9, 13), LocalDate.of(2021, 9, 20), 200000, 4, 1L, 1L); + reservation.setId(1L); assertThat(reservationDAO.insertReservation(reservation)).isEqualTo(1); } diff --git a/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java b/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java index e7153761d..cc176fb3d 100644 --- a/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java @@ -7,7 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest class PropertyServiceTest { From b367837332edf7bc692ff109dbbb96d86c878575 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Thu, 27 May 2021 16:32:57 +0900 Subject: [PATCH 79/99] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20optimize=20import?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/test/java/com/codesquad/airbnb/dao/CategoryDAOTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/CategoryDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/CategoryDAOTest.java index 8def663b4..889a6fc01 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/CategoryDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/CategoryDAOTest.java @@ -9,7 +9,7 @@ import java.util.List; -import static org.assertj.core.api.Assertions.*; +import static org.assertj.core.api.Assertions.assertThat; @SpringBootTest class CategoryDAOTest { From 21c44374fd1980e870e7bc07f181b2584e6c1bfd Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Thu, 27 May 2021 18:10:42 +0900 Subject: [PATCH 80/99] =?UTF-8?q?feat:=20WishList=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20Controller=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/controller/WishListController.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java b/BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java new file mode 100644 index 000000000..5529f06c7 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java @@ -0,0 +1,22 @@ +package com.codesquad.airbnb.controller; + +import com.codesquad.airbnb.dto.PropertiesResponseDTO; +import com.codesquad.airbnb.service.PropertyService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class WishListController { + + PropertyService propertyService; + + public WishListController(PropertyService propertyService) { + this.propertyService = propertyService; + } + + @GetMapping("/wishlist") + public ResponseEntity wishlist() { + return ResponseEntity.ok().body(propertyService.findByWishList()); + } +} From 7661072b14e74354d77fc91e2fa3d57dbf3550bd Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Thu, 27 May 2021 18:15:55 +0900 Subject: [PATCH 81/99] =?UTF-8?q?feat:=20WishList=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20query=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/codesquad/airbnb/dao/PropertyDAO.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index e6aa98359..e8dddd7e8 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -111,9 +111,14 @@ public PropertyDTO mapRow(ResultSet rs, int rowNum) throws SQLException { } ); - PropertiesResponseDTO propertyDtos = new PropertiesResponseDTO(propertyDto); + public List findByWishList() { + String sql = "SELECT p.id, p.title, wl.bookmark, p.price, pd.review_count, " + + "pd.rating, pd.latitude, pd.longitude from property as p " + + "left JOIN property_detail pd on pd.property_id = p.id " + + "left JOIN wish_list wl on wl.property_id = p.id " + + "where wl.bookmark = true " ; - return propertyDtos; + return jdbcTemplate.query(sql, new PropertyDTORowMapper()); } public PropertyDetailResponseDTO findPropertyDetailByPropertyId(Long propertyId) { From db9459c61f547bd11cd5e9fb685ad88e546a9b7a Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Thu, 27 May 2021 18:16:34 +0900 Subject: [PATCH 82/99] =?UTF-8?q?Refactor:=20DAO=EB=82=B4=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=B2=98=EB=A6=AC=ED=95=98=EB=8D=98=20Image=20?= =?UTF-8?q?=EC=84=B8=ED=8C=85=20=EB=A1=9C=EC=A7=81=EC=9D=84=20Service?= =?UTF-8?q?=EB=A1=9C=20=EC=98=AE=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/dao/PropertyDAO.java | 58 +++++++++---------- .../airbnb/service/PropertyService.java | 37 +++++++++++- .../codesquad/airbnb/dao/PropertyDAOTest.java | 17 ++++-- 3 files changed, 75 insertions(+), 37 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index e8dddd7e8..80640d07a 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -2,29 +2,30 @@ import com.codesquad.airbnb.domain.Property; import com.codesquad.airbnb.dto.HostDTO; -import com.codesquad.airbnb.dto.PropertiesResponseDTO; import com.codesquad.airbnb.dto.PropertyDTO; import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; -import java.time.temporal.ChronoUnit; import java.util.List; @Repository public class PropertyDAO { private final JdbcTemplate jdbcTemplate; + private NamedParameterJdbcTemplate template; @Autowired public PropertyDAO(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); + this.template = new NamedParameterJdbcTemplate(dataSource); } public class PropertyRowMapper implements RowMapper { @@ -35,6 +36,17 @@ public Property mapRow(ResultSet rs, int rowNum) throws SQLException { } } + public class PropertyDTORowMapper implements RowMapper { + // interface method + public PropertyDTO mapRow(ResultSet rs, int rowNum) throws SQLException { + + return PropertyDTO.of(rs.getLong("id"), rs.getString("title"), + rs.getBoolean("bookmark"), rs.getInt("price"), + rs.getInt("review_count"), rs.getDouble("rating"), + rs.getDouble("latitude"), rs.getDouble("longitude")); + } + } + public Property findById(Long id) { String sql = "SELECT p.id, p.title, p.price FROM property as p WHERE id = ?"; @@ -48,11 +60,11 @@ public List findAll() { return properties; } - public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, - int minPrice, int maxPrice, int adult, int children, int infant) { - int maxOccupancy = adult + children + infant; + public List findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, + int minPrice, int maxPrice, int maxOccupancy) { + String sql = "select p.id, p.title, wl.bookmark, p.price, pd.review_count, " + - "pd.rating, pd.latitude, pd.longitude, r.check_in_date, r.check_out_date " + + "pd.rating, pd.latitude, pd.longitude " + "from property as p " + "left JOIN property_detail pd on pd.property_id = p.id " + "left JOIN wish_list wl on wl.property_id = p.id " + @@ -62,13 +74,11 @@ public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDat "and p.location_id = ? " + "and pd.max_occupancy >= ? " + "and p.price >= ? " + - "and p.price <= ? " ; + "and p.price <= ? "; // TODO: userid도 함께 확인해서 wishList를 찾는것이 좋을 것 같음... - long diff = 1; Object[] objects = {locationId, maxOccupancy, minPrice, maxPrice}; - if (checkIn != null || checkOut != null) { sql += "AND r.property_id NOT IN (" + "SELECT property_id " + @@ -85,31 +95,17 @@ public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDat } if (checkIn != null && checkOut != null) { sql += "OR (? <= r.check_in_date AND r.check_in_date < ? )"; - objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, checkIn, checkIn , checkOut, checkOut, checkIn, checkOut}; - diff = ChronoUnit.DAYS.between(checkIn, checkOut); + objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, + checkIn, checkIn, + checkOut, checkOut, + checkIn, checkOut}; } sql += ")"; } - List propertyDto = jdbcTemplate.query(sql, new RowMapper() { - // interface method - @Override - public PropertyDTO mapRow(ResultSet rs, int rowNum) throws SQLException { - return PropertyDTO.of(rs.getLong("id"), rs.getString("title"), - rs.getBoolean("bookmark"), rs.getInt("price"), - rs.getInt("review_count"), rs.getDouble("rating"), - rs.getDouble("latitude"), rs.getDouble("longitude")); - } - },objects - ); + return jdbcTemplate.query(sql, new PropertyDTORowMapper(), objects); + } - long finalDiff = diff; - propertyDto.stream() - .forEach(propertyDTO1 -> { - propertyDTO1.setImages(findImageByPropertyId(propertyDTO1.getPropertyId())); - propertyDTO1.setTotalPrice(finalDiff); - } - ); public List findByWishList() { String sql = "SELECT p.id, p.title, wl.bookmark, p.price, pd.review_count, " + @@ -155,7 +151,7 @@ public PropertyDetailResponseDTO mapRow(ResultSet rs, int rowNum) throws SQLExce return propertyDetailDto; } - private String findImageByPropertyId(Long propertyId) { + public String findImageByPropertyId(Long propertyId) { String sql = "SELECT * FROM image " + "WHERE image.property_id = ? " + "and image.thumbnail = true"; @@ -169,7 +165,7 @@ public String mapRow(ResultSet rs, int rowNum) throws SQLException { return image; } - private List findImagesByPropertyId(Long propertyId) { + public List findImagesByPropertyId(Long propertyId) { String sql = "SELECT * FROM image " + "WHERE image.property_id = ?"; diff --git a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java index cd7be9b0a..c07be58b7 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java @@ -3,11 +3,13 @@ import com.codesquad.airbnb.dao.PropertyDAO; import com.codesquad.airbnb.dto.PriceSearchDTO; import com.codesquad.airbnb.dto.PropertiesResponseDTO; +import com.codesquad.airbnb.dto.PropertyDTO; import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.List; @Service @@ -51,10 +53,41 @@ public PriceSearchDTO priceSearch(Long locationId) { } public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { - return propertyDao.findBy(locationId, checkIn, checkOut, minPrice, maxPrice, adult, children, infant); + long diff = 1; + + if (checkIn != null && checkOut != null) { + diff = ChronoUnit.DAYS.between(checkIn, checkOut); + } + + int maxOccupancy = adult + children + infant; + + List propertyDTOS = propertyDao.findBy(locationId, checkIn, checkOut, minPrice, + maxPrice, maxOccupancy); + + long finalDiff = diff; + + propertyDTOS.stream() + .forEach(propertyDTO1 -> { + propertyDTO1.setImages(propertyDao.findImageByPropertyId(propertyDTO1.getPropertyId())); + propertyDTO1.setTotalPrice(finalDiff); + } + ); + + PropertiesResponseDTO propertyDtos = new PropertiesResponseDTO(propertyDTOS); + return propertyDtos; + } + + public PropertiesResponseDTO findByWishList() { + List propertyDTOS = propertyDao.findByWishList(); + propertyDTOS.stream() + .forEach(propertyDTO1 -> { + propertyDTO1.setImages(propertyDao.findImageByPropertyId(propertyDTO1.getPropertyId())); + } + ); + return new PropertiesResponseDTO(propertyDTOS); } - public PropertyDetailResponseDTO findPropertyDetailByPropertyId (Long propertyId) { + public PropertyDetailResponseDTO findPropertyDetailByPropertyId(Long propertyId) { return propertyDao.findPropertyDetailByPropertyId(propertyId); } } diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java index 2690443c9..51b6f4080 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java @@ -1,7 +1,6 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Property; -import com.codesquad.airbnb.dto.PropertiesResponseDTO; import com.codesquad.airbnb.dto.PropertyDTO; import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; import org.junit.jupiter.api.Test; @@ -42,9 +41,19 @@ void propertyDao_findByAll() { @Test void propertyDao_findBy() { - PropertiesResponseDTO properties = propertyDao.findBy(1L, LocalDate.of(2021, 5, 20), LocalDate.of(2021, 5, 23), - 10000, 100000, 2, 0, 0); - for (PropertyDTO property : properties.getProperties()) { + List properties = propertyDao.findBy(1L, LocalDate.of(2021, 5, 20), LocalDate.of(2021, 5, 23), + 10000, 100000, 2); + for (PropertyDTO property : properties) { + assertThat(property).isNotNull(); + logger.info("Find property by propertyDao: {}", + property); + } + } + + @Test + void propertyDao_findByWishList() { + List properties = propertyDao.findByWishList(); + for (PropertyDTO property : properties) { assertThat(property).isNotNull(); logger.info("Find property by propertyDao: {}", property); From ad69a7335bc1088c42b5b183c2235b948b2d92f3 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 28 May 2021 14:58:06 +0900 Subject: [PATCH 83/99] =?UTF-8?q?Refactor:=20RowMapper=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EC=A0=95=EB=A6=AC?= =?UTF-8?q?=20=EC=9E=91=EC=97=85=20=EC=A7=84=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 중복된 코드 제거를 위한 리팩토링 진행 --- .../com/codesquad/airbnb/dao/PropertyDAO.java | 142 +++++++----------- .../airbnb/dao/rowMapper/ImageRowMapper.java | 13 ++ .../dao/rowMapper/PropertyDTORowMapper.java | 18 +++ .../dao/rowMapper/PropertyRowMapper.java | 15 ++ 4 files changed, 98 insertions(+), 90 deletions(-) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index 80640d07a..c5719f567 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -1,5 +1,8 @@ package com.codesquad.airbnb.dao; +import com.codesquad.airbnb.dao.rowMapper.ImageRowMapper; +import com.codesquad.airbnb.dao.rowMapper.PropertyDTORowMapper; +import com.codesquad.airbnb.dao.rowMapper.PropertyRowMapper; import com.codesquad.airbnb.domain.Property; import com.codesquad.airbnb.dto.HostDTO; import com.codesquad.airbnb.dto.PropertyDTO; @@ -7,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; import javax.sql.DataSource; @@ -20,61 +22,40 @@ public class PropertyDAO { private final JdbcTemplate jdbcTemplate; - private NamedParameterJdbcTemplate template; + private final String FIND_BY_PROPERTY_LIST_DEFAULT = "SELECT p.id, p.title, p.price, wl.bookmark, pd.review_count, " + + "pd.rating, pd.latitude, pd.longitude " + + "FROM property AS p " + + "LEFT JOIN property_detail pd ON pd.property_id = p.id " + + "LEFT JOIN wish_list wl ON wl.property_id = p.id "; @Autowired public PropertyDAO(DataSource dataSource) { jdbcTemplate = new JdbcTemplate(dataSource); - this.template = new NamedParameterJdbcTemplate(dataSource); - } - - public class PropertyRowMapper implements RowMapper { - // interface method - public Property mapRow(ResultSet rs, int rowNum) throws SQLException { - Property property = new Property(rs.getLong("id"), rs.getString("name"), rs.getInt("price")); - return property; - } - } - - public class PropertyDTORowMapper implements RowMapper { - // interface method - public PropertyDTO mapRow(ResultSet rs, int rowNum) throws SQLException { - - return PropertyDTO.of(rs.getLong("id"), rs.getString("title"), - rs.getBoolean("bookmark"), rs.getInt("price"), - rs.getInt("review_count"), rs.getDouble("rating"), - rs.getDouble("latitude"), rs.getDouble("longitude")); - } } public Property findById(Long id) { String sql = "SELECT p.id, p.title, p.price FROM property as p WHERE id = ?"; - return jdbcTemplate.queryForObject(sql, new PropertyRowMapper(), id); } public List findAll() { - String sql = "SELECT * FROM property"; + String sql = "SELECT p.id, p.title, p.price FROM property as p"; List properties = jdbcTemplate.query(sql, new PropertyRowMapper()); return properties; } public List findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, - int minPrice, int maxPrice, int maxOccupancy) { - - String sql = "select p.id, p.title, wl.bookmark, p.price, pd.review_count, " + - "pd.rating, pd.latitude, pd.longitude " + - "from property as p " + - "left JOIN property_detail pd on pd.property_id = p.id " + - "left JOIN wish_list wl on wl.property_id = p.id " + - "left join reservation r on p.id = r.property_id " + - "where p.id = pd.property_id " + - "and p.id = wl.property_id " + - "and p.location_id = ? " + - "and pd.max_occupancy >= ? " + - "and p.price >= ? " + - "and p.price <= ? "; + int minPrice, int maxPrice, int maxOccupancy) { + + String sql = FIND_BY_PROPERTY_LIST_DEFAULT + + "LEFT JOIN reservation r ON p.id = r.property_id " + + "WHERE p.id = pd.property_id " + + "AND p.id = wl.property_id " + + "AND p.location_id = ? " + + "AND pd.max_occupancy >= ? " + + "AND p.price >= ? " + + "AND p.price <= ? "; // TODO: userid도 함께 확인해서 wishList를 찾는것이 좋을 것 같음... Object[] objects = {locationId, maxOccupancy, minPrice, maxPrice}; @@ -86,11 +67,11 @@ public List findBy(Long locationId, LocalDate checkIn, LocalDate ch "WHERE "; if (checkIn != null) { - sql += "(r.check_in_date <= ? And r.check_out_date > ? )"; + sql += "(r.check_in_date <= ? AND r.check_out_date > ? )"; objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, checkIn, checkIn}; } if (checkOut != null) { - sql += "OR (r.check_in_date < ? And r.check_out_date >= ? )"; + sql += "OR (r.check_in_date < ? AND r.check_out_date >= ? )"; objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, checkOut, checkOut}; } if (checkIn != null && checkOut != null) { @@ -108,11 +89,8 @@ public List findBy(Long locationId, LocalDate checkIn, LocalDate ch public List findByWishList() { - String sql = "SELECT p.id, p.title, wl.bookmark, p.price, pd.review_count, " + - "pd.rating, pd.latitude, pd.longitude from property as p " + - "left JOIN property_detail pd on pd.property_id = p.id " + - "left JOIN wish_list wl on wl.property_id = p.id " + - "where wl.bookmark = true " ; + String sql = FIND_BY_PROPERTY_LIST_DEFAULT + + "WHERE wl.bookmark = TRUE "; return jdbcTemplate.query(sql, new PropertyDTORowMapper()); } @@ -122,65 +100,49 @@ public PropertyDetailResponseDTO findPropertyDetailByPropertyId(Long propertyId) String sql = "SELECT p.id, p.title, pd.description, l.name, pd.room_type, pd.max_occupancy," + "pd.max_occupancy, pd.cleaning_fee, pd.bed_count, pd.bath_count, pd.review_count," + "p.price, pd.latitude, pd.longitude, pd.rating, h.name, h.image_url " + - "from property as p, " + - "property_detail as pd, " + - "location as l , host as h " + - "where p.id = pd.property_id " + - "and l.id = p.location_id " + - "and h.property_id = p.id " + - "and p.id = ? "; - - PropertyDetailResponseDTO propertyDetailDto = - jdbcTemplate.queryForObject(sql, new RowMapper() { - @Override - public PropertyDetailResponseDTO mapRow(ResultSet rs, int rowNum) throws SQLException { - - List imageUrls = findImagesByPropertyId(rs.getLong("id")); - - return PropertyDetailResponseDTO.of( - imageUrls, - rs.getString("title"), rs.getString("description"), - rs.getString("l.name"), rs.getString("room_type"), rs.getInt("max_occupancy"), - rs.getInt("cleaning_fee"), rs.getInt("bed_count"), rs.getInt("bath_count"), - rs.getInt("review_count"), rs.getInt("price"), - rs.getDouble("latitude"), rs.getDouble("longitude"), rs.getDouble("rating"), - new HostDTO(rs.getString("h.name"), rs.getString("image_url"))); - } - }, propertyId); - - return propertyDetailDto; + "FROM property AS p, " + + "property_detail AS pd, " + + "location AS l , host AS h " + + "WHERE p.id = pd.property_id " + + "AND l.id = p.location_id " + + "AND h.property_id = p.id " + + "AND p.id = ? "; + + return jdbcTemplate.queryForObject(sql, new RowMapper() { + @Override + public PropertyDetailResponseDTO mapRow(ResultSet rs, int rowNum) throws SQLException { + + List imageUrls = findImagesByPropertyId(rs.getLong("id")); + + return PropertyDetailResponseDTO.of( + imageUrls, + rs.getString("title"), rs.getString("description"), + rs.getString("l.name"), rs.getString("room_type"), rs.getInt("max_occupancy"), + rs.getInt("cleaning_fee"), rs.getInt("bed_count"), rs.getInt("bath_count"), + rs.getInt("review_count"), rs.getInt("price"), + rs.getDouble("latitude"), rs.getDouble("longitude"), rs.getDouble("rating"), + new HostDTO(rs.getString("h.name"), rs.getString("image_url"))); + } + }, propertyId); } public String findImageByPropertyId(Long propertyId) { - String sql = "SELECT * FROM image " + + String sql = "SELECT image_url FROM image " + "WHERE image.property_id = ? " + - "and image.thumbnail = true"; + "AND image.thumbnail = TRUE"; - String image = jdbcTemplate.queryForObject(sql, new RowMapper() { - @Override - public String mapRow(ResultSet rs, int rowNum) throws SQLException { - return rs.getString("image_url"); - } - }, propertyId); - return image; + return jdbcTemplate.queryForObject(sql, new ImageRowMapper(), propertyId); } public List findImagesByPropertyId(Long propertyId) { - String sql = "SELECT * FROM image " + + String sql = "SELECT image_url FROM image " + "WHERE image.property_id = ?"; - List images = jdbcTemplate.query(sql, new RowMapper() { - @Override - public String mapRow(ResultSet rs, int rowNum) throws SQLException { - return rs.getString("image_url"); - } - }, propertyId); - return images; + return jdbcTemplate.query(sql, new ImageRowMapper(), propertyId); } public List findPricesByLocationId(Long locationId) { String sql = "SELECT price FROM property where location_id = ?"; - return jdbcTemplate.queryForList(sql, Integer.class, locationId); } } diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java new file mode 100644 index 000000000..d092e52e3 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java @@ -0,0 +1,13 @@ +package com.codesquad.airbnb.dao.rowMapper; + +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ImageRowMapper implements RowMapper { + // interface method + public String mapRow(ResultSet rs, int rowNum) throws SQLException { + return rs.getString("image_url"); + } +} \ No newline at end of file diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java new file mode 100644 index 000000000..48d558192 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java @@ -0,0 +1,18 @@ +package com.codesquad.airbnb.dao.rowMapper; + +import com.codesquad.airbnb.dto.PropertyDTO; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class PropertyDTORowMapper implements RowMapper { + // interface method + public PropertyDTO mapRow(ResultSet rs, int rowNum) throws SQLException { + + return PropertyDTO.of(rs.getLong("id"), rs.getString("title"), + rs.getBoolean("bookmark"), rs.getInt("price"), + rs.getInt("review_count"), rs.getDouble("rating"), + rs.getDouble("latitude"), rs.getDouble("longitude")); + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java new file mode 100644 index 000000000..525829d26 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java @@ -0,0 +1,15 @@ +package com.codesquad.airbnb.dao.rowMapper; + +import com.codesquad.airbnb.domain.Property; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class PropertyRowMapper implements RowMapper { + // interface method + public Property mapRow(ResultSet rs, int rowNum) throws SQLException { + Property property = new Property(rs.getLong("id"), rs.getString("name"), rs.getInt("price")); + return property; + } +} \ No newline at end of file From 4f64b2d3e665d5034039a209d7a700993bd1089e Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 28 May 2021 16:03:20 +0900 Subject: [PATCH 84/99] =?UTF-8?q?refactor:=20dto=20=EB=82=B4=EB=B6=80=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=B6=94=EA=B0=80=EB=A1=9C=20dto?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codesquad/airbnb/controller/PropertyController.java | 2 +- .../airbnb/controller/ReservationController.java | 6 +++--- .../com/codesquad/airbnb/controller/SearchController.java | 4 ++-- .../codesquad/airbnb/controller/WishListController.java | 2 +- .../main/java/com/codesquad/airbnb/dao/PropertyDAO.java | 4 ++-- .../java/com/codesquad/airbnb/dao/ReservationDAO.java | 2 +- .../airbnb/dao/rowMapper/PropertyDTORowMapper.java | 2 +- .../codesquad/airbnb/dto/{ => price}/PriceInfoDTO.java | 2 +- .../codesquad/airbnb/dto/{ => price}/PriceSearchDTO.java | 2 +- .../airbnb/dto/{ => property}/PropertiesResponseDTO.java | 2 +- .../codesquad/airbnb/dto/{ => property}/PropertyDTO.java | 2 +- .../dto/{ => property}/PropertyDetailResponseDTO.java | 4 +++- .../dto/{ => reservation}/ReservationDetailDTO.java | 2 +- .../dto/{ => reservation}/ReservationRequestDTO.java | 2 +- .../com/codesquad/airbnb/service/PropertyService.java | 8 ++++---- .../com/codesquad/airbnb/service/ReservationService.java | 8 ++++---- .../java/com/codesquad/airbnb/dao/PropertyDAOTest.java | 4 ++-- .../java/com/codesquad/airbnb/dao/ReservationDAOTest.java | 2 +- .../com/codesquad/airbnb/service/PropertyServiceTest.java | 2 +- 19 files changed, 32 insertions(+), 30 deletions(-) rename BE/src/main/java/com/codesquad/airbnb/dto/{ => price}/PriceInfoDTO.java (96%) rename BE/src/main/java/com/codesquad/airbnb/dto/{ => price}/PriceSearchDTO.java (94%) rename BE/src/main/java/com/codesquad/airbnb/dto/{ => property}/PropertiesResponseDTO.java (88%) rename BE/src/main/java/com/codesquad/airbnb/dto/{ => property}/PropertyDTO.java (98%) rename BE/src/main/java/com/codesquad/airbnb/dto/{ => property}/PropertyDetailResponseDTO.java (98%) rename BE/src/main/java/com/codesquad/airbnb/dto/{ => reservation}/ReservationDetailDTO.java (97%) rename BE/src/main/java/com/codesquad/airbnb/dto/{ => reservation}/ReservationRequestDTO.java (90%) diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java b/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java index 38f6805d2..982b4c0b6 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java @@ -1,6 +1,6 @@ package com.codesquad.airbnb.controller; -import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; +import com.codesquad.airbnb.dto.property.PropertyDetailResponseDTO; import com.codesquad.airbnb.service.PropertyService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java index cb6786968..40fdff4b2 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java @@ -1,8 +1,8 @@ package com.codesquad.airbnb.controller; -import com.codesquad.airbnb.dto.PriceInfoDTO; -import com.codesquad.airbnb.dto.ReservationDetailDTO; -import com.codesquad.airbnb.dto.ReservationRequestDTO; +import com.codesquad.airbnb.dto.price.PriceInfoDTO; +import com.codesquad.airbnb.dto.reservation.ReservationDetailDTO; +import com.codesquad.airbnb.dto.reservation.ReservationRequestDTO; import com.codesquad.airbnb.service.ReservationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java index c7171d84a..3e53abb4a 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java @@ -1,7 +1,7 @@ package com.codesquad.airbnb.controller; -import com.codesquad.airbnb.dto.PriceSearchDTO; -import com.codesquad.airbnb.dto.PropertiesResponseDTO; +import com.codesquad.airbnb.dto.price.PriceSearchDTO; +import com.codesquad.airbnb.dto.property.PropertiesResponseDTO; import com.codesquad.airbnb.service.PropertyService; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java b/BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java index 5529f06c7..97dcf9dcf 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java @@ -1,6 +1,6 @@ package com.codesquad.airbnb.controller; -import com.codesquad.airbnb.dto.PropertiesResponseDTO; +import com.codesquad.airbnb.dto.property.PropertiesResponseDTO; import com.codesquad.airbnb.service.PropertyService; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index c5719f567..fbfebde87 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -5,8 +5,8 @@ import com.codesquad.airbnb.dao.rowMapper.PropertyRowMapper; import com.codesquad.airbnb.domain.Property; import com.codesquad.airbnb.dto.HostDTO; -import com.codesquad.airbnb.dto.PropertyDTO; -import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; +import com.codesquad.airbnb.dto.property.PropertyDTO; +import com.codesquad.airbnb.dto.property.PropertyDetailResponseDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java index 5d1cb5b60..0fe58c9b8 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java @@ -1,7 +1,7 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Reservation; -import com.codesquad.airbnb.dto.ReservationDetailDTO; +import com.codesquad.airbnb.dto.reservation.ReservationDetailDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java index 48d558192..b4a2adf44 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java @@ -1,6 +1,6 @@ package com.codesquad.airbnb.dao.rowMapper; -import com.codesquad.airbnb.dto.PropertyDTO; +import com.codesquad.airbnb.dto.property.PropertyDTO; import org.springframework.jdbc.core.RowMapper; import java.sql.ResultSet; diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PriceInfoDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/price/PriceInfoDTO.java similarity index 96% rename from BE/src/main/java/com/codesquad/airbnb/dto/PriceInfoDTO.java rename to BE/src/main/java/com/codesquad/airbnb/dto/price/PriceInfoDTO.java index 8dae55147..e0f6a0889 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PriceInfoDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/price/PriceInfoDTO.java @@ -1,4 +1,4 @@ -package com.codesquad.airbnb.dto; +package com.codesquad.airbnb.dto.price; public class PriceInfoDTO { diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PriceSearchDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/price/PriceSearchDTO.java similarity index 94% rename from BE/src/main/java/com/codesquad/airbnb/dto/PriceSearchDTO.java rename to BE/src/main/java/com/codesquad/airbnb/dto/price/PriceSearchDTO.java index 88349c83e..cb5b8a826 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PriceSearchDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/price/PriceSearchDTO.java @@ -1,4 +1,4 @@ -package com.codesquad.airbnb.dto; +package com.codesquad.airbnb.dto.price; import java.util.Arrays; diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertiesResponseDTO.java similarity index 88% rename from BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDTO.java rename to BE/src/main/java/com/codesquad/airbnb/dto/property/PropertiesResponseDTO.java index f6ab5245a..aa3e52342 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertiesResponseDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertiesResponseDTO.java @@ -1,4 +1,4 @@ -package com.codesquad.airbnb.dto; +package com.codesquad.airbnb.dto.property; import java.util.ArrayList; import java.util.List; diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertyDTO.java similarity index 98% rename from BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java rename to BE/src/main/java/com/codesquad/airbnb/dto/property/PropertyDTO.java index 0ccc50eaa..827043235 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertyDTO.java @@ -1,4 +1,4 @@ -package com.codesquad.airbnb.dto; +package com.codesquad.airbnb.dto.property; public class PropertyDTO { diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertyDetailResponseDTO.java similarity index 98% rename from BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDTO.java rename to BE/src/main/java/com/codesquad/airbnb/dto/property/PropertyDetailResponseDTO.java index 75a7a5108..7c0ef160f 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDetailResponseDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertyDetailResponseDTO.java @@ -1,4 +1,6 @@ -package com.codesquad.airbnb.dto; +package com.codesquad.airbnb.dto.property; + +import com.codesquad.airbnb.dto.HostDTO; import java.util.ArrayList; import java.util.List; diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/ReservationDetailDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/reservation/ReservationDetailDTO.java similarity index 97% rename from BE/src/main/java/com/codesquad/airbnb/dto/ReservationDetailDTO.java rename to BE/src/main/java/com/codesquad/airbnb/dto/reservation/ReservationDetailDTO.java index 231aead31..fa1c420c8 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/ReservationDetailDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/reservation/ReservationDetailDTO.java @@ -1,4 +1,4 @@ -package com.codesquad.airbnb.dto; +package com.codesquad.airbnb.dto.reservation; import java.time.LocalDate; diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/ReservationRequestDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/reservation/ReservationRequestDTO.java similarity index 90% rename from BE/src/main/java/com/codesquad/airbnb/dto/ReservationRequestDTO.java rename to BE/src/main/java/com/codesquad/airbnb/dto/reservation/ReservationRequestDTO.java index 106ae6eba..1f06c32cf 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/ReservationRequestDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/reservation/ReservationRequestDTO.java @@ -1,4 +1,4 @@ -package com.codesquad.airbnb.dto; +package com.codesquad.airbnb.dto.reservation; import java.time.LocalDate; diff --git a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java index c07be58b7..c22411fbd 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java @@ -1,10 +1,10 @@ package com.codesquad.airbnb.service; import com.codesquad.airbnb.dao.PropertyDAO; -import com.codesquad.airbnb.dto.PriceSearchDTO; -import com.codesquad.airbnb.dto.PropertiesResponseDTO; -import com.codesquad.airbnb.dto.PropertyDTO; -import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; +import com.codesquad.airbnb.dto.price.PriceSearchDTO; +import com.codesquad.airbnb.dto.property.PropertiesResponseDTO; +import com.codesquad.airbnb.dto.property.PropertyDTO; +import com.codesquad.airbnb.dto.property.PropertyDetailResponseDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java b/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java index 63b4cf325..cb37b273e 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/ReservationService.java @@ -3,10 +3,10 @@ import com.codesquad.airbnb.dao.PropertyDAO; import com.codesquad.airbnb.dao.ReservationDAO; import com.codesquad.airbnb.domain.Reservation; -import com.codesquad.airbnb.dto.PriceInfoDTO; -import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; -import com.codesquad.airbnb.dto.ReservationDetailDTO; -import com.codesquad.airbnb.dto.ReservationRequestDTO; +import com.codesquad.airbnb.dto.price.PriceInfoDTO; +import com.codesquad.airbnb.dto.property.PropertyDetailResponseDTO; +import com.codesquad.airbnb.dto.reservation.ReservationDetailDTO; +import com.codesquad.airbnb.dto.reservation.ReservationRequestDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java index 51b6f4080..fc1667560 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java @@ -1,8 +1,8 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Property; -import com.codesquad.airbnb.dto.PropertyDTO; -import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; +import com.codesquad.airbnb.dto.property.PropertyDTO; +import com.codesquad.airbnb.dto.property.PropertyDetailResponseDTO; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java index bc891d646..96b83e0e9 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/ReservationDAOTest.java @@ -1,7 +1,7 @@ package com.codesquad.airbnb.dao; import com.codesquad.airbnb.domain.Reservation; -import com.codesquad.airbnb.dto.ReservationDetailDTO; +import com.codesquad.airbnb.dto.reservation.ReservationDetailDTO; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java b/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java index cc176fb3d..2fc248390 100644 --- a/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/service/PropertyServiceTest.java @@ -1,6 +1,6 @@ package com.codesquad.airbnb.service; -import com.codesquad.airbnb.dto.PriceSearchDTO; +import com.codesquad.airbnb.dto.price.PriceSearchDTO; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From a2734d37f2916c90fc471ac76660bbff635b1c56 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 28 May 2021 16:05:41 +0900 Subject: [PATCH 85/99] =?UTF-8?q?refactor:=20=EB=A6=AC=ED=84=B4=ED=83=80?= =?UTF-8?q?=EC=9E=85=EC=9D=84=20ResponseEntity=EB=A1=9C=20=EA=B0=90?= =?UTF-8?q?=EC=8B=B8=EC=84=9C=20=EC=9D=91=EB=8B=B5=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EA=B9=8C=EC=A7=80=20=EB=B0=98=ED=99=98=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/controller/MainController.java | 5 +++-- .../airbnb/controller/ReservationController.java | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/MainController.java b/BE/src/main/java/com/codesquad/airbnb/controller/MainController.java index 5ae6fadac..37ad5c58b 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/MainController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/MainController.java @@ -3,6 +3,7 @@ import com.codesquad.airbnb.dto.MainDTO; import com.codesquad.airbnb.service.MainService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -17,7 +18,7 @@ public MainController(MainService mainService) { } @GetMapping("/main") - public MainDTO getMain() { - return mainService.browseMainDTO(); + public ResponseEntity getMain() { + return ResponseEntity.ok().body(mainService.browseMainDTO()); } } diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java index 40fdff4b2..af4063ebd 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java @@ -5,6 +5,7 @@ import com.codesquad.airbnb.dto.reservation.ReservationRequestDTO; import com.codesquad.airbnb.service.ReservationService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController @@ -19,13 +20,13 @@ public ReservationController(ReservationService reservationService) { } @GetMapping("/{reservationId}") - public ReservationDetailDTO browseDetailedReservationById(@PathVariable Long reservationId) { - return reservationService.browseReservationDetailById(reservationId); + public ResponseEntity browseDetailedReservationById(@PathVariable Long reservationId) { + return ResponseEntity.ok().body(reservationService.browseReservationDetailById(reservationId)); } @GetMapping - public PriceInfoDTO browsePriceInfo(@RequestParam Long propertyId, @RequestBody ReservationRequestDTO reservationInfo) { - return reservationService.browsePriceInfoReservation(propertyId, reservationInfo); + public ResponseEntity browsePriceInfo(@RequestParam Long propertyId, @RequestBody ReservationRequestDTO reservationInfo) { + return ResponseEntity.ok().body(reservationService.browsePriceInfoReservation(propertyId, reservationInfo)); } @PostMapping("/{propertyId}") From 1b328012e7450e6335b83a9b7c4505d427a513d0 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 28 May 2021 16:09:12 +0900 Subject: [PATCH 86/99] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=84=B8=ED=84=B0=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codesquad/airbnb/domain/Reservation.java | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java b/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java index 3cd30b560..ca7e530ec 100644 --- a/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java +++ b/BE/src/main/java/com/codesquad/airbnb/domain/Reservation.java @@ -59,30 +59,6 @@ public void setId(Long id) { this.id = id; } - public void setCheckIn(LocalDate checkIn) { - this.checkIn = checkIn; - } - - public void setCheckOut(LocalDate checkOut) { - this.checkOut = checkOut; - } - - public void setTotalPrice(int totalPrice) { - this.totalPrice = totalPrice; - } - - public void setGuestCount(int guestCount) { - this.guestCount = guestCount; - } - - public void setUserId(Long userId) { - this.userId = userId; - } - - public void setPropertyId(Long propertyId) { - this.propertyId = propertyId; - } - @Override public String toString() { return "Reservation{" + From f07f0d3c44c87ef5b5255143233062610c231efb Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 28 May 2021 16:09:40 +0900 Subject: [PATCH 87/99] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/service/PropertyService.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java index c22411fbd..9a2a2502c 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java @@ -66,23 +66,20 @@ public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDat long finalDiff = diff; - propertyDTOS.stream() + propertyDTOS .forEach(propertyDTO1 -> { propertyDTO1.setImages(propertyDao.findImageByPropertyId(propertyDTO1.getPropertyId())); propertyDTO1.setTotalPrice(finalDiff); } ); - PropertiesResponseDTO propertyDtos = new PropertiesResponseDTO(propertyDTOS); - return propertyDtos; + return new PropertiesResponseDTO(propertyDTOS); } public PropertiesResponseDTO findByWishList() { List propertyDTOS = propertyDao.findByWishList(); - propertyDTOS.stream() - .forEach(propertyDTO1 -> { - propertyDTO1.setImages(propertyDao.findImageByPropertyId(propertyDTO1.getPropertyId())); - } + propertyDTOS + .forEach(propertyDTO1 -> propertyDTO1.setImages(propertyDao.findImageByPropertyId(propertyDTO1.getPropertyId())) ); return new PropertiesResponseDTO(propertyDTOS); } From a42d386e8a3c7dd8dbd7ff656632103c56b9b6cd Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 28 May 2021 18:39:50 +0900 Subject: [PATCH 88/99] =?UTF-8?q?Refactor:=20JdbcTemplate=20->=20NamedPara?= =?UTF-8?q?meterJdbcTemplate=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/dao/PropertyDAO.java | 61 ++++++++++--------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index c5719f567..83ae3b24e 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -8,20 +8,23 @@ import com.codesquad.airbnb.dto.PropertyDTO; import com.codesquad.airbnb.dto.PropertyDetailResponseDTO; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Repository public class PropertyDAO { - private final JdbcTemplate jdbcTemplate; + private NamedParameterJdbcTemplate jdbcTemplate; private final String FIND_BY_PROPERTY_LIST_DEFAULT = "SELECT p.id, p.title, p.price, wl.bookmark, pd.review_count, " + "pd.rating, pd.latitude, pd.longitude " + "FROM property AS p " + @@ -30,12 +33,12 @@ public class PropertyDAO { @Autowired public PropertyDAO(DataSource dataSource) { - jdbcTemplate = new JdbcTemplate(dataSource); + jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); } public Property findById(Long id) { - String sql = "SELECT p.id, p.title, p.price FROM property as p WHERE id = ?"; - return jdbcTemplate.queryForObject(sql, new PropertyRowMapper(), id); + String sql = "SELECT p.id, p.title, p.price FROM property as p WHERE id = :id"; + return jdbcTemplate.queryForObject(sql, new MapSqlParameterSource("id", id), new PropertyRowMapper()); } public List findAll() { @@ -52,13 +55,17 @@ public List findBy(Long locationId, LocalDate checkIn, LocalDate ch "LEFT JOIN reservation r ON p.id = r.property_id " + "WHERE p.id = pd.property_id " + "AND p.id = wl.property_id " + - "AND p.location_id = ? " + - "AND pd.max_occupancy >= ? " + - "AND p.price >= ? " + - "AND p.price <= ? "; + "AND p.location_id = :locationId " + + "AND pd.max_occupancy >= :maxOccupancy " + + "AND p.price >= :minPrice " + + "AND p.price <= :maxPrice "; // TODO: userid도 함께 확인해서 wishList를 찾는것이 좋을 것 같음... - Object[] objects = {locationId, maxOccupancy, minPrice, maxPrice}; + Map paramMap = new HashMap<>(); + paramMap.put("locationId", locationId); + paramMap.put("maxOccupancy", maxOccupancy); + paramMap.put("minPrice", minPrice); + paramMap.put("maxPrice", maxPrice); if (checkIn != null || checkOut != null) { sql += "AND r.property_id NOT IN (" + @@ -67,24 +74,20 @@ public List findBy(Long locationId, LocalDate checkIn, LocalDate ch "WHERE "; if (checkIn != null) { - sql += "(r.check_in_date <= ? AND r.check_out_date > ? )"; - objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, checkIn, checkIn}; + sql += "(r.check_in_date <= :checkIn AND r.check_out_date > :checkIn )"; + paramMap.put("checkIn", checkIn); } if (checkOut != null) { - sql += "OR (r.check_in_date < ? AND r.check_out_date >= ? )"; - objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, checkOut, checkOut}; + sql += "OR (r.check_in_date < :checkOut AND r.check_out_date >= :checkOut )"; + paramMap.put("checkOut", checkOut); } if (checkIn != null && checkOut != null) { - sql += "OR (? <= r.check_in_date AND r.check_in_date < ? )"; - objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, - checkIn, checkIn, - checkOut, checkOut, - checkIn, checkOut}; + sql += "OR (:checkIn <= r.check_in_date AND r.check_in_date < :checkOut )"; } sql += ")"; } - return jdbcTemplate.query(sql, new PropertyDTORowMapper(), objects); + return jdbcTemplate.query(sql, paramMap, new PropertyDTORowMapper()); } @@ -106,9 +109,9 @@ public PropertyDetailResponseDTO findPropertyDetailByPropertyId(Long propertyId) "WHERE p.id = pd.property_id " + "AND l.id = p.location_id " + "AND h.property_id = p.id " + - "AND p.id = ? "; + "AND p.id = :propertyId "; - return jdbcTemplate.queryForObject(sql, new RowMapper() { + return jdbcTemplate.queryForObject(sql, new MapSqlParameterSource("propertyId", propertyId), new RowMapper() { @Override public PropertyDetailResponseDTO mapRow(ResultSet rs, int rowNum) throws SQLException { @@ -123,27 +126,27 @@ public PropertyDetailResponseDTO mapRow(ResultSet rs, int rowNum) throws SQLExce rs.getDouble("latitude"), rs.getDouble("longitude"), rs.getDouble("rating"), new HostDTO(rs.getString("h.name"), rs.getString("image_url"))); } - }, propertyId); + }); } public String findImageByPropertyId(Long propertyId) { String sql = "SELECT image_url FROM image " + - "WHERE image.property_id = ? " + + "WHERE image.property_id = :propertyId " + "AND image.thumbnail = TRUE"; - return jdbcTemplate.queryForObject(sql, new ImageRowMapper(), propertyId); + return jdbcTemplate.queryForObject(sql, new MapSqlParameterSource("propertyId", propertyId), new ImageRowMapper()); } public List findImagesByPropertyId(Long propertyId) { String sql = "SELECT image_url FROM image " + - "WHERE image.property_id = ?"; + "WHERE image.property_id = :propertyId"; - return jdbcTemplate.query(sql, new ImageRowMapper(), propertyId); + return jdbcTemplate.query(sql, new MapSqlParameterSource("propertyId", propertyId), new ImageRowMapper()); } public List findPricesByLocationId(Long locationId) { - String sql = "SELECT price FROM property where location_id = ?"; - return jdbcTemplate.queryForList(sql, Integer.class, locationId); + String sql = "SELECT price FROM property where location_id = :locationId"; + return jdbcTemplate.queryForList(sql, new MapSqlParameterSource("locationId", locationId), Integer.class); } } From d1dc55291ea4747d79301febda957722dfbe6d44 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Tue, 1 Jun 2021 16:47:24 +0900 Subject: [PATCH 89/99] =?UTF-8?q?feat:=20getLatitude,=20getLongitude=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/codesquad/airbnb/dto/PropertyDTO.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java index 0ccc50eaa..33a9a0efc 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/PropertyDTO.java @@ -72,6 +72,14 @@ public double getRating() { return rating; } + public double getLatitude() { + return latitude; + } + + public double getLongitude() { + return longitude; + } + @Override public String toString() { return "PropertyDTO{" + From f03ccdc5290f116b07807928b21871ab6f1428ac Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Tue, 1 Jun 2021 17:20:38 +0900 Subject: [PATCH 90/99] =?UTF-8?q?chore:=20RDS=EB=A1=9C=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=84=B8=ED=8C=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main/resources/application.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BE/src/main/resources/application.properties b/BE/src/main/resources/application.properties index f0ef4e61d..b270f93a9 100644 --- a/BE/src/main/resources/application.properties +++ b/BE/src/main/resources/application.properties @@ -1,7 +1,7 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://localhost:3306/airbnb?characterEncoding=UTF-8 -spring.datasource.username=root -spring.datasource.password=codesquad1 +spring.datasource.url=jdbc:mysql://airbnb-rds-database.cpyx6pi0gdkw.ap-northeast-2.rds.amazonaws.com:3306/airbnb?characterEncoding=UTF-8 +spring.datasource.username=airbnb +spring.datasource.password=airbnb18 logging.level.com.codesquad.airbnb.*=debug logging.level.org.springframework.jdbc.*=trace From d7a45546e84cc917249e192fd4684791a096c9b1 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Wed, 2 Jun 2021 14:32:52 +0900 Subject: [PATCH 91/99] =?UTF-8?q?feat:=20getLatitude,=20getLongitude=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/dao/PropertyDAO.java | 61 ++++++++++--------- .../airbnb/dto/property/PropertyDTO.java | 8 +++ 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index fbfebde87..5bcd309b0 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -8,20 +8,23 @@ import com.codesquad.airbnb.dto.property.PropertyDTO; import com.codesquad.airbnb.dto.property.PropertyDetailResponseDTO; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; import java.time.LocalDate; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Repository public class PropertyDAO { - private final JdbcTemplate jdbcTemplate; + private NamedParameterJdbcTemplate jdbcTemplate; private final String FIND_BY_PROPERTY_LIST_DEFAULT = "SELECT p.id, p.title, p.price, wl.bookmark, pd.review_count, " + "pd.rating, pd.latitude, pd.longitude " + "FROM property AS p " + @@ -30,12 +33,12 @@ public class PropertyDAO { @Autowired public PropertyDAO(DataSource dataSource) { - jdbcTemplate = new JdbcTemplate(dataSource); + jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); } public Property findById(Long id) { - String sql = "SELECT p.id, p.title, p.price FROM property as p WHERE id = ?"; - return jdbcTemplate.queryForObject(sql, new PropertyRowMapper(), id); + String sql = "SELECT p.id, p.title, p.price FROM property as p WHERE id = :id"; + return jdbcTemplate.queryForObject(sql, new MapSqlParameterSource("id", id), new PropertyRowMapper()); } public List findAll() { @@ -52,13 +55,17 @@ public List findBy(Long locationId, LocalDate checkIn, LocalDate ch "LEFT JOIN reservation r ON p.id = r.property_id " + "WHERE p.id = pd.property_id " + "AND p.id = wl.property_id " + - "AND p.location_id = ? " + - "AND pd.max_occupancy >= ? " + - "AND p.price >= ? " + - "AND p.price <= ? "; + "AND p.location_id = :locationId " + + "AND pd.max_occupancy >= :maxOccupancy " + + "AND p.price >= :minPrice " + + "AND p.price <= :maxPrice "; // TODO: userid도 함께 확인해서 wishList를 찾는것이 좋을 것 같음... - Object[] objects = {locationId, maxOccupancy, minPrice, maxPrice}; + Map paramMap = new HashMap<>(); + paramMap.put("locationId", locationId); + paramMap.put("maxOccupancy", maxOccupancy); + paramMap.put("minPrice", minPrice); + paramMap.put("maxPrice", maxPrice); if (checkIn != null || checkOut != null) { sql += "AND r.property_id NOT IN (" + @@ -67,24 +74,20 @@ public List findBy(Long locationId, LocalDate checkIn, LocalDate ch "WHERE "; if (checkIn != null) { - sql += "(r.check_in_date <= ? AND r.check_out_date > ? )"; - objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, checkIn, checkIn}; + sql += "(r.check_in_date <= :checkIn AND r.check_out_date > :checkIn )"; + paramMap.put("checkIn", checkIn); } if (checkOut != null) { - sql += "OR (r.check_in_date < ? AND r.check_out_date >= ? )"; - objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, checkOut, checkOut}; + sql += "OR (r.check_in_date < :checkOut AND r.check_out_date >= :checkOut )"; + paramMap.put("checkOut", checkOut); } if (checkIn != null && checkOut != null) { - sql += "OR (? <= r.check_in_date AND r.check_in_date < ? )"; - objects = new Object[]{locationId, maxOccupancy, minPrice, maxPrice, - checkIn, checkIn, - checkOut, checkOut, - checkIn, checkOut}; + sql += "OR (:checkIn <= r.check_in_date AND r.check_in_date < :checkOut )"; } sql += ")"; } - return jdbcTemplate.query(sql, new PropertyDTORowMapper(), objects); + return jdbcTemplate.query(sql, paramMap, new PropertyDTORowMapper()); } @@ -106,9 +109,9 @@ public PropertyDetailResponseDTO findPropertyDetailByPropertyId(Long propertyId) "WHERE p.id = pd.property_id " + "AND l.id = p.location_id " + "AND h.property_id = p.id " + - "AND p.id = ? "; + "AND p.id = :propertyId "; - return jdbcTemplate.queryForObject(sql, new RowMapper() { + return jdbcTemplate.queryForObject(sql, new MapSqlParameterSource("propertyId", propertyId), new RowMapper() { @Override public PropertyDetailResponseDTO mapRow(ResultSet rs, int rowNum) throws SQLException { @@ -123,27 +126,27 @@ public PropertyDetailResponseDTO mapRow(ResultSet rs, int rowNum) throws SQLExce rs.getDouble("latitude"), rs.getDouble("longitude"), rs.getDouble("rating"), new HostDTO(rs.getString("h.name"), rs.getString("image_url"))); } - }, propertyId); + }); } public String findImageByPropertyId(Long propertyId) { String sql = "SELECT image_url FROM image " + - "WHERE image.property_id = ? " + + "WHERE image.property_id = :propertyId " + "AND image.thumbnail = TRUE"; - return jdbcTemplate.queryForObject(sql, new ImageRowMapper(), propertyId); + return jdbcTemplate.queryForObject(sql, new MapSqlParameterSource("propertyId", propertyId), new ImageRowMapper()); } public List findImagesByPropertyId(Long propertyId) { String sql = "SELECT image_url FROM image " + - "WHERE image.property_id = ?"; + "WHERE image.property_id = :propertyId"; - return jdbcTemplate.query(sql, new ImageRowMapper(), propertyId); + return jdbcTemplate.query(sql, new MapSqlParameterSource("propertyId", propertyId), new ImageRowMapper()); } public List findPricesByLocationId(Long locationId) { - String sql = "SELECT price FROM property where location_id = ?"; - return jdbcTemplate.queryForList(sql, Integer.class, locationId); + String sql = "SELECT price FROM property where location_id = :locationId"; + return jdbcTemplate.queryForList(sql, new MapSqlParameterSource("locationId", locationId), Integer.class); } } diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertyDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertyDTO.java index 827043235..8a47da1aa 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertyDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertyDTO.java @@ -72,6 +72,14 @@ public double getRating() { return rating; } + public double getLatitude() { + return latitude; + } + + public double getLongitude() { + return longitude; + } + @Override public String toString() { return "PropertyDTO{" + From 6815f0ae790fe2759791573e984e86147b649110 Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Thu, 3 Jun 2021 11:16:50 +0900 Subject: [PATCH 92/99] =?UTF-8?q?feat:=20jastpyConfig=EB=A5=BC=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20application.properties=20=EC=95=94?= =?UTF-8?q?=ED=98=B8=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/build.gradle | 2 ++ .../com/codesquad/airbnb/JasyptConfig.java | 27 +++++++++++++++++++ BE/src/main/resources/application.properties | 7 ++--- 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 BE/src/main/java/com/codesquad/airbnb/JasyptConfig.java diff --git a/BE/build.gradle b/BE/build.gradle index 785a636cc..ab65b7cdd 100644 --- a/BE/build.gradle +++ b/BE/build.gradle @@ -17,6 +17,8 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' runtimeOnly 'mysql:mysql-connector-java' + implementation("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3") + implementation("org.bouncycastle:bcprov-jdk15on:1.64") } test { diff --git a/BE/src/main/java/com/codesquad/airbnb/JasyptConfig.java b/BE/src/main/java/com/codesquad/airbnb/JasyptConfig.java new file mode 100644 index 000000000..96377df70 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/JasyptConfig.java @@ -0,0 +1,27 @@ +package com.codesquad.airbnb; + +import org.jasypt.encryption.StringEncryptor; +import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; +import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JasyptConfig { + + @Bean("jasyptStringEncryptor") + public StringEncryptor stringEncryptor() { + PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); + SimpleStringPBEConfig config = new SimpleStringPBEConfig(); + config.setPassword(System.getProperty("jasypt.encryptor.password")); + config.setAlgorithm("PBEWithMD5AndDES"); + config.setKeyObtentionIterations("1000"); + config.setPoolSize("1"); + config.setProviderName("SunJCE"); + config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); + config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator"); + config.setStringOutputType("base64"); + encryptor.setConfig(config); + return encryptor; + } +} \ No newline at end of file diff --git a/BE/src/main/resources/application.properties b/BE/src/main/resources/application.properties index f0ef4e61d..212197e86 100644 --- a/BE/src/main/resources/application.properties +++ b/BE/src/main/resources/application.properties @@ -1,7 +1,8 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://localhost:3306/airbnb?characterEncoding=UTF-8 -spring.datasource.username=root -spring.datasource.password=codesquad1 +spring.datasource.url=ENC(wrHBVYStRb/3B9IFlgsmIMjbzM2xgVvr3kZDHAoVlpa/RGVeFg+cgIUoFIfKVVN16I4TTS/vWo30ELKXH6DsPwDQ5h3dVV6QQrZnjIGALgNPzoz4vqluVdcPpLA6I7qAOrMoqvYjph+CPAE5I3vjc5rXsDoHp/M57QWjVrsrN2c=) +spring.datasource.username=ENC(pcgD0MFZrUY0s4x2A0iKLA==) +spring.datasource.password=ENC(6PezMiqxU3+/sNiNXSmMI0ivwFZDrLWL6PezMiqxU3+/sNiNXSmMI0ivwFZDrLWL) logging.level.com.codesquad.airbnb.*=debug logging.level.org.springframework.jdbc.*=trace + From e1258092206e81efdb05482281d3406ede6fc6dc Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Thu, 3 Jun 2021 14:53:21 +0900 Subject: [PATCH 93/99] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/codesquad/airbnb/domain/Host.java | 29 ------ .../com/codesquad/airbnb/domain/Image.java | 21 ----- .../airbnb/domain/PropertyDetail.java | 93 ------------------- .../com/codesquad/airbnb/domain/WishList.java | 16 ---- 4 files changed, 159 deletions(-) delete mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/Host.java delete mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/Image.java delete mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java delete mode 100644 BE/src/main/java/com/codesquad/airbnb/domain/WishList.java diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Host.java b/BE/src/main/java/com/codesquad/airbnb/domain/Host.java deleted file mode 100644 index a47e83359..000000000 --- a/BE/src/main/java/com/codesquad/airbnb/domain/Host.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.codesquad.airbnb.domain; - -import org.springframework.data.annotation.Id; - -public class Host { - - @Id - private Long id; - - private String name; - private String email; - - public Host(String name, String email) { - this.name = name; - this.email = email; - } - - public Long getId() { - return id; - } - - public String getName() { - return name; - } - - public String getEmail() { - return email; - } -} diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/Image.java b/BE/src/main/java/com/codesquad/airbnb/domain/Image.java deleted file mode 100644 index 1564108f7..000000000 --- a/BE/src/main/java/com/codesquad/airbnb/domain/Image.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.codesquad.airbnb.domain; - -public class Image { - - private String imageUrl; - - public Image(String imageUrl) { - this.imageUrl = imageUrl; - } - - public String getImageUrl() { - return imageUrl; - } - - @Override - public String toString() { - return "Image{" + - "imageUrl='" + imageUrl + '\'' + - '}'; - } -} diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java b/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java deleted file mode 100644 index a47246b6b..000000000 --- a/BE/src/main/java/com/codesquad/airbnb/domain/PropertyDetail.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.codesquad.airbnb.domain; - -import org.springframework.data.annotation.Id; - -public class PropertyDetail { - - @Id - private Long property_id; - - private String description; - private int maxOccupancy; - private int cleaningFee; - private int bedCount; - private int bathCount; - private String roomType; - private int reviewCount; - private double latitude; - private double longitude; - private double rating; - - public PropertyDetail(Long property_id, String description, int maxOccupancy, int cleaningFee, int bedCount, int bathCount, String roomType, int reviewCount, double latitude, double longitude) { - this.property_id = property_id; - this.description = description; - this.maxOccupancy = maxOccupancy; - this.cleaningFee = cleaningFee; - this.bedCount = bedCount; - this.bathCount = bathCount; - this.roomType = roomType; - this.reviewCount = reviewCount; - this.latitude = latitude; - this.longitude = longitude; - } - - public Long getProperty_id() { - return property_id; - } - - public String getDescription() { - return description; - } - - public int getMaxOccupancy() { - return maxOccupancy; - } - - public int getCleaningFee() { - return cleaningFee; - } - - public int getBedCount() { - return bedCount; - } - - public int getBathCount() { - return bathCount; - } - - public String getRoomType() { - return roomType; - } - - public int getReviewCount() { - return reviewCount; - } - - public double getLatitude() { - return latitude; - } - - public double getLongitude() { - return longitude; - } - - public double getRating() { - return rating; - } - - @Override - public String toString() { - return "PropertyDetail{" + - "property_id=" + property_id + - ", description='" + description + '\'' + - ", maxOccupancy=" + maxOccupancy + - ", cleaningFee=" + cleaningFee + - ", bedCount=" + bedCount + - ", bathCount=" + bathCount + - ", roomType='" + roomType + '\'' + - ", reviewCount=" + reviewCount + - ", latitude=" + latitude + - ", longitude=" + longitude + - '}'; - } -} diff --git a/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java b/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java deleted file mode 100644 index c4aa23be3..000000000 --- a/BE/src/main/java/com/codesquad/airbnb/domain/WishList.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.codesquad.airbnb.domain; - -public class WishList { - - private boolean bookmark; - - public boolean isBookmark() { - return bookmark; - } - - public WishList(boolean bookmark) { - this.bookmark = bookmark; - } - - -} From e312bbc8ee0a930ab60390dd33804e434b3489df Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Thu, 3 Jun 2021 14:56:12 +0900 Subject: [PATCH 94/99] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ResponseEntity 사용 지양 - 접근제어자 설정 - 메서드 네이밍 변경 - 어노테이션 추가 --- .../airbnb/controller/MainController.java | 9 +++------ .../airbnb/controller/PropertyController.java | 7 +++---- .../airbnb/controller/ReservationController.java | 15 +++++++-------- .../airbnb/controller/SearchController.java | 11 +++++------ .../airbnb/controller/WishListController.java | 7 +++---- .../com/codesquad/airbnb/dao/CategoryDAO.java | 10 ++-------- .../com/codesquad/airbnb/dao/PropertyDAO.java | 2 +- .../airbnb/dao/rowMapper/ImageRowMapper.java | 3 ++- .../dao/rowMapper/PropertyDTORowMapper.java | 1 - .../airbnb/dao/rowMapper/PropertyRowMapper.java | 5 ++--- .../dto/property/PropertiesResponseDTO.java | 2 +- .../codesquad/airbnb/service/PropertyService.java | 8 +++++--- .../com/codesquad/airbnb/dao/PropertyDAOTest.java | 2 +- 13 files changed, 35 insertions(+), 47 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/MainController.java b/BE/src/main/java/com/codesquad/airbnb/controller/MainController.java index 37ad5c58b..e2244146a 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/MainController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/MainController.java @@ -2,23 +2,20 @@ import com.codesquad.airbnb.dto.MainDTO; import com.codesquad.airbnb.service.MainService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MainController { - private MainService mainService; + private final MainService mainService; - @Autowired public MainController(MainService mainService) { this.mainService = mainService; } @GetMapping("/main") - public ResponseEntity getMain() { - return ResponseEntity.ok().body(mainService.browseMainDTO()); + public MainDTO getMain() { + return mainService.browseMainDTO(); } } diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java b/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java index 982b4c0b6..e28a24c44 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/PropertyController.java @@ -2,7 +2,6 @@ import com.codesquad.airbnb.dto.property.PropertyDetailResponseDTO; import com.codesquad.airbnb.service.PropertyService; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -12,14 +11,14 @@ @RestController public class PropertyController { - PropertyService propertyService; + private final PropertyService propertyService; public PropertyController(PropertyService propertyService) { this.propertyService = propertyService; } @GetMapping("/{propertyId}") - public ResponseEntity propertiesAverageValue(@PathVariable Long propertyId) { - return ResponseEntity.ok().body(propertyService.findPropertyDetailByPropertyId(propertyId)); + public PropertyDetailResponseDTO findDetailedPropertyById(@PathVariable Long propertyId) { + return propertyService.findPropertyDetailByPropertyId(propertyId); } } diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java index af4063ebd..0e1dcbbc6 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/ReservationController.java @@ -4,32 +4,31 @@ import com.codesquad.airbnb.dto.reservation.ReservationDetailDTO; import com.codesquad.airbnb.dto.reservation.ReservationRequestDTO; import com.codesquad.airbnb.service.ReservationService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/reservation") public class ReservationController { - private ReservationService reservationService; + private final ReservationService reservationService; - @Autowired public ReservationController(ReservationService reservationService) { this.reservationService = reservationService; } @GetMapping("/{reservationId}") - public ResponseEntity browseDetailedReservationById(@PathVariable Long reservationId) { - return ResponseEntity.ok().body(reservationService.browseReservationDetailById(reservationId)); + public ReservationDetailDTO browseDetailedReservationById(@PathVariable Long reservationId) { + return reservationService.browseReservationDetailById(reservationId); } @GetMapping - public ResponseEntity browsePriceInfo(@RequestParam Long propertyId, @RequestBody ReservationRequestDTO reservationInfo) { - return ResponseEntity.ok().body(reservationService.browsePriceInfoReservation(propertyId, reservationInfo)); + public PriceInfoDTO browsePriceInfo(@RequestParam Long propertyId, @RequestBody ReservationRequestDTO reservationInfo) { + return reservationService.browsePriceInfoReservation(propertyId, reservationInfo); } @PostMapping("/{propertyId}") + @ResponseStatus(HttpStatus.CREATED) public void createReservation(@PathVariable Long propertyId, @RequestBody ReservationRequestDTO reservationInfo) { reservationService.createReservation(propertyId, reservationInfo); } diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java index 3e53abb4a..97672092d 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java @@ -4,7 +4,6 @@ import com.codesquad.airbnb.dto.property.PropertiesResponseDTO; import com.codesquad.airbnb.service.PropertyService; import org.springframework.format.annotation.DateTimeFormat; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.time.LocalDate; @@ -13,14 +12,14 @@ @RequestMapping("/search") public class SearchController { - PropertyService propertyService; + private final PropertyService propertyService; public SearchController(PropertyService propertyService) { this.propertyService = propertyService; } @GetMapping() - public ResponseEntity propertiesSearch( + public PropertiesResponseDTO propertiesSearch( @RequestParam(value = "locationId", required = false) Long locationId, @RequestParam(value = "checkIn", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate checkIn, @RequestParam(value = "checkOut", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate checkOut, @@ -31,12 +30,12 @@ public ResponseEntity propertiesSearch( @RequestParam(value = "infant", required = false, defaultValue = "0") int infant ) { PropertiesResponseDTO propertiesResponseDto = propertyService.findBy(locationId, checkIn, checkOut, minPrice, maxPrice, adult, children, infant); - return ResponseEntity.ok().body(propertiesResponseDto); + return propertiesResponseDto; } @GetMapping("/{locationId}") - public ResponseEntity propertiesAverageValue(@PathVariable Long locationId) { - return ResponseEntity.ok().body(propertyService.priceSearch(locationId)); + public PriceSearchDTO propertiesAverageValue(@PathVariable Long locationId) { + return propertyService.priceSearch(locationId); } } diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java b/BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java index 97dcf9dcf..30c364f6b 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/WishListController.java @@ -2,21 +2,20 @@ import com.codesquad.airbnb.dto.property.PropertiesResponseDTO; import com.codesquad.airbnb.service.PropertyService; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class WishListController { - PropertyService propertyService; + private final PropertyService propertyService; public WishListController(PropertyService propertyService) { this.propertyService = propertyService; } @GetMapping("/wishlist") - public ResponseEntity wishlist() { - return ResponseEntity.ok().body(propertyService.findByWishList()); + public PropertiesResponseDTO wishlist() { + return propertyService.findBookmarkTrue(); } } diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java index f8ef3c87a..5a97841bf 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/CategoryDAO.java @@ -7,8 +7,6 @@ import org.springframework.stereotype.Repository; import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.List; @Repository @@ -23,12 +21,8 @@ public CategoryDAO(DataSource dataSource) { public List findAll() { String sql = "SELECT id, name, image_url FROM category"; - RowMapper categoryMapper = new RowMapper() { - @Override - public Category mapRow(ResultSet rs, int rowNum) throws SQLException { - return new Category(rs.getLong("id"), rs.getString("name"), rs.getString("image_url")); - } - }; + // TODO: 메서드 실행 시 RowMapper 인스턴스가 매번 생성된다. + RowMapper categoryMapper = (rs, rowNum) -> new Category(rs.getLong("id"), rs.getString("name"), rs.getString("image_url")); return jdbcTemplate.query(sql, categoryMapper); } } diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index 5bcd309b0..778e28223 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -91,7 +91,7 @@ public List findBy(Long locationId, LocalDate checkIn, LocalDate ch } - public List findByWishList() { + public List findBookmarkTrue() { String sql = FIND_BY_PROPERTY_LIST_DEFAULT + "WHERE wl.bookmark = TRUE "; diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java index d092e52e3..57e2d71c9 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java @@ -7,7 +7,8 @@ public class ImageRowMapper implements RowMapper { // interface method + @Override public String mapRow(ResultSet rs, int rowNum) throws SQLException { return rs.getString("image_url"); } -} \ No newline at end of file +} diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java index b4a2adf44..7984dd9da 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java @@ -9,7 +9,6 @@ public class PropertyDTORowMapper implements RowMapper { // interface method public PropertyDTO mapRow(ResultSet rs, int rowNum) throws SQLException { - return PropertyDTO.of(rs.getLong("id"), rs.getString("title"), rs.getBoolean("bookmark"), rs.getInt("price"), rs.getInt("review_count"), rs.getDouble("rating"), diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java index 525829d26..f7eb00f74 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java @@ -9,7 +9,6 @@ public class PropertyRowMapper implements RowMapper { // interface method public Property mapRow(ResultSet rs, int rowNum) throws SQLException { - Property property = new Property(rs.getLong("id"), rs.getString("name"), rs.getInt("price")); - return property; + return new Property(rs.getLong("id"), rs.getString("name"), rs.getInt("price")); } -} \ No newline at end of file +} diff --git a/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertiesResponseDTO.java b/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertiesResponseDTO.java index aa3e52342..9dbeb3ced 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertiesResponseDTO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dto/property/PropertiesResponseDTO.java @@ -5,7 +5,7 @@ public class PropertiesResponseDTO { - List properties = new ArrayList<>(); + private List properties = new ArrayList<>(); public PropertiesResponseDTO(List properties) { this.properties = properties; diff --git a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java index 9a2a2502c..42e430a1a 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java @@ -15,6 +15,8 @@ @Service public class PropertyService { + private final int DEFAULT_DIFF = 1; + private PropertyDAO propertyDao; @Autowired @@ -53,7 +55,7 @@ public PriceSearchDTO priceSearch(Long locationId) { } public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { - long diff = 1; + long diff = DEFAULT_DIFF; if (checkIn != null && checkOut != null) { diff = ChronoUnit.DAYS.between(checkIn, checkOut); @@ -76,8 +78,8 @@ public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDat return new PropertiesResponseDTO(propertyDTOS); } - public PropertiesResponseDTO findByWishList() { - List propertyDTOS = propertyDao.findByWishList(); + public PropertiesResponseDTO findBookmarkTrue() { + List propertyDTOS = propertyDao.findBookmarkTrue(); propertyDTOS .forEach(propertyDTO1 -> propertyDTO1.setImages(propertyDao.findImageByPropertyId(propertyDTO1.getPropertyId())) ); diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java index fc1667560..94c2d530b 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java @@ -52,7 +52,7 @@ void propertyDao_findBy() { @Test void propertyDao_findByWishList() { - List properties = propertyDao.findByWishList(); + List properties = propertyDao.findBookmarkTrue(); for (PropertyDTO property : properties) { assertThat(property).isNotNull(); logger.info("Find property by propertyDao: {}", From 81d22aea64d3b599e3b3572971eb92b672a89b48 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 4 Jun 2021 12:21:52 +0900 Subject: [PATCH 95/99] =?UTF-8?q?feat:=20=EC=9C=84=EC=B9=98=EC=99=80=20?= =?UTF-8?q?=EC=98=88=EC=95=BD=20=EB=A1=9C=EC=9A=B0=EB=A7=A4=ED=8D=BC=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/rowMapper/LocationRowMapper.java | 23 ++++++++++++++ .../dao/rowMapper/ReservationRowMapper.java | 30 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/LocationRowMapper.java create mode 100644 BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ReservationRowMapper.java diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/LocationRowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/LocationRowMapper.java new file mode 100644 index 000000000..d80f55c85 --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/LocationRowMapper.java @@ -0,0 +1,23 @@ +package com.codesquad.airbnb.dao.rowMapper; + +import com.codesquad.airbnb.domain.Location; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class LocationRowMapper implements RowMapper { + + private static LocationRowMapper locationMapper = new LocationRowMapper(); + + private LocationRowMapper() {} + + public static LocationRowMapper getInstance() { + return LocationRowMapper.locationMapper; + } + + @Override + public Location mapRow(ResultSet rs, int rowNum) throws SQLException { + return new Location(rs.getLong("id"), rs.getString("name"), rs.getString("image_url")); + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ReservationRowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ReservationRowMapper.java new file mode 100644 index 000000000..82bc984be --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ReservationRowMapper.java @@ -0,0 +1,30 @@ +package com.codesquad.airbnb.dao.rowMapper; + +import com.codesquad.airbnb.domain.Reservation; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ReservationRowMapper implements RowMapper { + + private static ReservationRowMapper reservationMapper = new ReservationRowMapper(); + + public static ReservationRowMapper getInstance() { + return reservationMapper; + } + + private ReservationRowMapper() {} + + @Override + public Reservation mapRow(ResultSet rs, int rowNum) throws SQLException { + Reservation reservation = new Reservation(rs.getDate("check_in_date").toLocalDate(), + rs.getDate("check_out_date").toLocalDate(), + rs.getInt("total_price"), + rs.getInt("guest_count"), + rs.getLong("user_id"), + rs.getLong("property_id")); + reservation.setId(rs.getLong("id")); + return reservation; + } +} From f32d1a7411332b89dfe7eb3a2f9fbfae65768558 Mon Sep 17 00:00:00 2001 From: Sally Oh Date: Fri, 4 Jun 2021 12:23:51 +0900 Subject: [PATCH 96/99] =?UTF-8?q?refactor:=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 로우매퍼 분리 - 로우매퍼를 싱글턴으로 - DAO에서 싱글턴 매퍼의 getInstance() 이용 --- .../com/codesquad/airbnb/dao/LocationDAO.java | 18 +++------------ .../com/codesquad/airbnb/dao/PropertyDAO.java | 9 ++++---- .../codesquad/airbnb/dao/ReservationDAO.java | 23 ++++--------------- .../airbnb/dao/rowMapper/ImageRowMapper.java | 10 +++++++- .../dao/rowMapper/PropertyDTORowMapper.java | 2 +- .../dao/rowMapper/PropertyRowMapper.java | 11 ++++++++- 6 files changed, 31 insertions(+), 42 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java index beff7ba38..d746c8ac1 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/LocationDAO.java @@ -1,14 +1,12 @@ package com.codesquad.airbnb.dao; +import com.codesquad.airbnb.dao.rowMapper.LocationRowMapper; import com.codesquad.airbnb.domain.Location; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.List; @Repository @@ -21,24 +19,14 @@ public LocationDAO(DataSource dataSource) { this.jdbcTemplate = new JdbcTemplate(dataSource); } - private static class LocationMapper implements RowMapper { - public Location mapRow(ResultSet resultSet, int rowNumber) throws SQLException { - Location location = new Location(resultSet.getLong("id"), - resultSet.getString("name"), - resultSet.getString("image_url")); - - return location; - } - } - public Location findById(Long id) { String sql = "Select id, name, image_url FROM location WHERE id = ?"; - return jdbcTemplate.queryForObject(sql, new LocationMapper(), id); + return jdbcTemplate.queryForObject(sql, LocationRowMapper.getInstance(), id); } public List findAll() { String sql = "SELECT id, name, image_url FROM location"; - return jdbcTemplate.query(sql, new LocationMapper()); + return jdbcTemplate.query(sql, LocationRowMapper.getInstance()); } } diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index 778e28223..f0a629d4b 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -38,14 +38,13 @@ public PropertyDAO(DataSource dataSource) { public Property findById(Long id) { String sql = "SELECT p.id, p.title, p.price FROM property as p WHERE id = :id"; - return jdbcTemplate.queryForObject(sql, new MapSqlParameterSource("id", id), new PropertyRowMapper()); + return jdbcTemplate.queryForObject(sql, new MapSqlParameterSource("id", id), PropertyRowMapper.getInstance()); } public List findAll() { String sql = "SELECT p.id, p.title, p.price FROM property as p"; - List properties = jdbcTemplate.query(sql, new PropertyRowMapper()); - return properties; + return jdbcTemplate.query(sql, PropertyRowMapper.getInstance()); } public List findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, @@ -134,14 +133,14 @@ public String findImageByPropertyId(Long propertyId) { "WHERE image.property_id = :propertyId " + "AND image.thumbnail = TRUE"; - return jdbcTemplate.queryForObject(sql, new MapSqlParameterSource("propertyId", propertyId), new ImageRowMapper()); + return jdbcTemplate.queryForObject(sql, new MapSqlParameterSource("propertyId", propertyId), ImageRowMapper.getInstance()); } public List findImagesByPropertyId(Long propertyId) { String sql = "SELECT image_url FROM image " + "WHERE image.property_id = :propertyId"; - return jdbcTemplate.query(sql, new MapSqlParameterSource("propertyId", propertyId), new ImageRowMapper()); + return jdbcTemplate.query(sql, new MapSqlParameterSource("propertyId", propertyId), ImageRowMapper.getInstance()); } public List findPricesByLocationId(Long locationId) { diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java index 0fe58c9b8..f01e29e0e 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/ReservationDAO.java @@ -1,16 +1,14 @@ package com.codesquad.airbnb.dao; +import com.codesquad.airbnb.dao.rowMapper.ReservationRowMapper; import com.codesquad.airbnb.domain.Reservation; import com.codesquad.airbnb.dto.reservation.ReservationDetailDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.simple.SimpleJdbcInsert; import org.springframework.stereotype.Repository; import javax.sql.DataSource; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -27,19 +25,6 @@ public ReservationDAO(DataSource dataSource) { this.simpleJdbcInsert = new SimpleJdbcInsert(dataSource).withTableName("reservation"); } - private static class ReservationMapper implements RowMapper { - public Reservation mapRow(ResultSet resultSet, int rowNumber) throws SQLException { - Reservation reservation = new Reservation(resultSet.getDate("check_in_date").toLocalDate(), - resultSet.getDate("check_out_date").toLocalDate(), - resultSet.getInt("total_price"), - resultSet.getInt("guest_count"), - resultSet.getLong("user_id"), - resultSet.getLong("property_id")); - reservation.setId(resultSet.getLong("id")); - return reservation; - } - } - public int insertReservation(Reservation reservation) { Map parameters = new HashMap<>(); parameters.put("check_in_date", reservation.getCheckIn()); @@ -56,21 +41,21 @@ public Reservation findReservationById(Long id) { String sql = "SELECT id, check_in_date, check_out_date, total_price, guest_count, user_id, property_id " + "FROM reservation WHERE id = ?"; - return jdbcTemplate.queryForObject(sql, new ReservationMapper(), id); + return jdbcTemplate.queryForObject(sql, ReservationRowMapper.getInstance(), id); } public List findAllReservationsByUserId(Long userId) { String sql = "SELECT id, check_in_date, check_out_date, total_price, guest_count, user_id, property_id " + "FROM reservation WHERE user_id = ?"; - return jdbcTemplate.query(sql, new ReservationMapper(), userId); + return jdbcTemplate.query(sql, ReservationRowMapper.getInstance(), userId); } public List findAllReservationsByPropertyId(Long propertyId) { String sql = "SELECT id, check_in_date, check_out_date, total_price, guest_count " + "FROM reservation WHERE property_id = ?"; - return jdbcTemplate.query(sql, new ReservationMapper(), propertyId); + return jdbcTemplate.query(sql, ReservationRowMapper.getInstance(), propertyId); } public ReservationDetailDTO findDetailedReservation(Long id) { diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java index 57e2d71c9..ba2dbeedc 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/ImageRowMapper.java @@ -6,7 +6,15 @@ import java.sql.SQLException; public class ImageRowMapper implements RowMapper { - // interface method + + private static ImageRowMapper imageRowMapper = new ImageRowMapper(); + + public static ImageRowMapper getInstance() { + return imageRowMapper; + } + + private ImageRowMapper() {} + @Override public String mapRow(ResultSet rs, int rowNum) throws SQLException { return rs.getString("image_url"); diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java index 7984dd9da..8e4e360b2 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyDTORowMapper.java @@ -7,7 +7,7 @@ import java.sql.SQLException; public class PropertyDTORowMapper implements RowMapper { - // interface method + @Override public PropertyDTO mapRow(ResultSet rs, int rowNum) throws SQLException { return PropertyDTO.of(rs.getLong("id"), rs.getString("title"), rs.getBoolean("bookmark"), rs.getInt("price"), diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java index f7eb00f74..253310183 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/rowMapper/PropertyRowMapper.java @@ -7,7 +7,16 @@ import java.sql.SQLException; public class PropertyRowMapper implements RowMapper { - // interface method + + private static PropertyRowMapper propertyRowMapper = new PropertyRowMapper(); + + public static PropertyRowMapper getInstance() { + return propertyRowMapper; + } + + private PropertyRowMapper() {} + + @Override public Property mapRow(ResultSet rs, int rowNum) throws SQLException { return new Property(rs.getLong("id"), rs.getString("name"), rs.getInt("price")); } From 30287dcf8bfef0e874104b31a06c03929bf4fdcf Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 4 Jun 2021 13:59:48 +0900 Subject: [PATCH 97/99] =?UTF-8?q?refactor:=20RequestParam=20=EC=9D=84=20Cl?= =?UTF-8?q?ass=EB=A1=9C=20Mapping=20=ED=95=98=EC=97=AC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../airbnb/controller/SearchController.java | 22 +++---- .../airbnb/dao/GetPropertyModel.java | 58 +++++++++++++++++++ .../com/codesquad/airbnb/dao/PropertyDAO.java | 22 ++++--- .../airbnb/service/PropertyService.java | 12 ++-- .../codesquad/airbnb/dao/PropertyDAOTest.java | 20 +++---- 5 files changed, 92 insertions(+), 42 deletions(-) create mode 100644 BE/src/main/java/com/codesquad/airbnb/dao/GetPropertyModel.java diff --git a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java index 97672092d..a539048eb 100644 --- a/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java +++ b/BE/src/main/java/com/codesquad/airbnb/controller/SearchController.java @@ -1,12 +1,13 @@ package com.codesquad.airbnb.controller; +import com.codesquad.airbnb.dao.GetPropertyModel; import com.codesquad.airbnb.dto.price.PriceSearchDTO; import com.codesquad.airbnb.dto.property.PropertiesResponseDTO; import com.codesquad.airbnb.service.PropertyService; -import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.web.bind.annotation.*; -import java.time.LocalDate; +import java.util.Map; @RestController @RequestMapping("/search") @@ -19,18 +20,11 @@ public SearchController(PropertyService propertyService) { } @GetMapping() - public PropertiesResponseDTO propertiesSearch( - @RequestParam(value = "locationId", required = false) Long locationId, - @RequestParam(value = "checkIn", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate checkIn, - @RequestParam(value = "checkOut", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate checkOut, - @RequestParam(value = "minPrice", required = false, defaultValue = "0") int minPrice, - @RequestParam(value = "maxPrice", required = false, defaultValue = "1000000") int maxPrice, - @RequestParam(value = "adult", required = false, defaultValue = "0") int adult, - @RequestParam(value = "children", required = false, defaultValue = "0") int children, - @RequestParam(value = "infant", required = false, defaultValue = "0") int infant - ) { - PropertiesResponseDTO propertiesResponseDto = propertyService.findBy(locationId, checkIn, checkOut, minPrice, maxPrice, adult, children, infant); - return propertiesResponseDto; + public PropertiesResponseDTO propertiesSearch(@RequestParam Map parameterMap) { + ObjectMapper objectMapper = new ObjectMapper(); + GetPropertyModel getPropertyModel = objectMapper.convertValue(parameterMap, GetPropertyModel.class); + + return propertyService.findBy(getPropertyModel); } @GetMapping("/{locationId}") diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/GetPropertyModel.java b/BE/src/main/java/com/codesquad/airbnb/dao/GetPropertyModel.java new file mode 100644 index 000000000..eb36faadf --- /dev/null +++ b/BE/src/main/java/com/codesquad/airbnb/dao/GetPropertyModel.java @@ -0,0 +1,58 @@ +package com.codesquad.airbnb.dao; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; + +import java.time.LocalDate; + +public class GetPropertyModel { + + private Long locationId; + + @JsonDeserialize(using = LocalDateDeserializer.class) + private LocalDate checkIn; + + @JsonDeserialize(using = LocalDateDeserializer.class) + private LocalDate checkOut; + + private int minPrice; + private int maxPrice; + private int adult; + private int children; + private int infant; + + public GetPropertyModel() { + } + + public Long getLocationId() { + return locationId; + } + + public LocalDate getCheckIn() { + return checkIn; + } + + public LocalDate getCheckOut() { + return checkOut; + } + + public int getMinPrice() { + return minPrice; + } + + public int getMaxPrice() { + return maxPrice; + } + + public int getAdult() { + return adult; + } + + public int getChildren() { + return children; + } + + public int getInfant() { + return infant; + } +} diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java index 778e28223..edeba2b39 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/PropertyDAO.java @@ -16,7 +16,6 @@ import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; -import java.time.LocalDate; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -48,8 +47,7 @@ public List findAll() { return properties; } - public List findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, - int minPrice, int maxPrice, int maxOccupancy) { + public List findBy(GetPropertyModel getPropertyModel, int maxOccupancy) { String sql = FIND_BY_PROPERTY_LIST_DEFAULT + "LEFT JOIN reservation r ON p.id = r.property_id " + @@ -62,26 +60,26 @@ public List findBy(Long locationId, LocalDate checkIn, LocalDate ch // TODO: userid도 함께 확인해서 wishList를 찾는것이 좋을 것 같음... Map paramMap = new HashMap<>(); - paramMap.put("locationId", locationId); + paramMap.put("locationId", getPropertyModel.getLocationId()); paramMap.put("maxOccupancy", maxOccupancy); - paramMap.put("minPrice", minPrice); - paramMap.put("maxPrice", maxPrice); + paramMap.put("minPrice", getPropertyModel.getMinPrice()); + paramMap.put("maxPrice", getPropertyModel.getMaxPrice()); - if (checkIn != null || checkOut != null) { + if (getPropertyModel.getCheckIn() != null || getPropertyModel.getCheckOut() != null) { sql += "AND r.property_id NOT IN (" + "SELECT property_id " + "FROM reservation " + "WHERE "; - if (checkIn != null) { + if (getPropertyModel.getCheckIn() != null) { sql += "(r.check_in_date <= :checkIn AND r.check_out_date > :checkIn )"; - paramMap.put("checkIn", checkIn); + paramMap.put("checkIn", getPropertyModel.getCheckIn()); } - if (checkOut != null) { + if (getPropertyModel.getCheckOut() != null) { sql += "OR (r.check_in_date < :checkOut AND r.check_out_date >= :checkOut )"; - paramMap.put("checkOut", checkOut); + paramMap.put("checkOut", getPropertyModel.getCheckOut()); } - if (checkIn != null && checkOut != null) { + if (getPropertyModel.getCheckIn() != null && getPropertyModel.getCheckOut() != null) { sql += "OR (:checkIn <= r.check_in_date AND r.check_in_date < :checkOut )"; } sql += ")"; diff --git a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java index 42e430a1a..b40a838e6 100644 --- a/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java +++ b/BE/src/main/java/com/codesquad/airbnb/service/PropertyService.java @@ -1,5 +1,6 @@ package com.codesquad.airbnb.service; +import com.codesquad.airbnb.dao.GetPropertyModel; import com.codesquad.airbnb.dao.PropertyDAO; import com.codesquad.airbnb.dto.price.PriceSearchDTO; import com.codesquad.airbnb.dto.property.PropertiesResponseDTO; @@ -54,17 +55,16 @@ public PriceSearchDTO priceSearch(Long locationId) { return priceSearchDTO; } - public PropertiesResponseDTO findBy(Long locationId, LocalDate checkIn, LocalDate checkOut, int minPrice, int maxPrice, int adult, int children, int infant) { + public PropertiesResponseDTO findBy(GetPropertyModel getPropertyModel) { long diff = DEFAULT_DIFF; - if (checkIn != null && checkOut != null) { - diff = ChronoUnit.DAYS.between(checkIn, checkOut); + if (getPropertyModel.getCheckIn() != null && getPropertyModel.getCheckOut() != null) { + diff = ChronoUnit.DAYS.between(getPropertyModel.getCheckIn(), getPropertyModel.getCheckOut()); } - int maxOccupancy = adult + children + infant; + int maxOccupancy = getPropertyModel.getAdult() + getPropertyModel.getChildren() + getPropertyModel.getInfant(); - List propertyDTOS = propertyDao.findBy(locationId, checkIn, checkOut, minPrice, - maxPrice, maxOccupancy); + List propertyDTOS = propertyDao.findBy(getPropertyModel, maxOccupancy); long finalDiff = diff; diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java index 94c2d530b..c90430c4f 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java @@ -39,16 +39,16 @@ void propertyDao_findByAll() { } } - @Test - void propertyDao_findBy() { - List properties = propertyDao.findBy(1L, LocalDate.of(2021, 5, 20), LocalDate.of(2021, 5, 23), - 10000, 100000, 2); - for (PropertyDTO property : properties) { - assertThat(property).isNotNull(); - logger.info("Find property by propertyDao: {}", - property); - } - } +// @Test +// void propertyDao_findBy() { +// List properties = propertyDao.findBy(1L, LocalDate.of(2021, 5, 20), LocalDate.of(2021, 5, 23), +// 10000, 100000, 2); +// for (PropertyDTO property : properties) { +// assertThat(property).isNotNull(); +// logger.info("Find property by propertyDao: {}", +// property); +// } +// } @Test void propertyDao_findByWishList() { From 8916508b658b21150dcdc6bd02530440df4beaea Mon Sep 17 00:00:00 2001 From: Starve <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 4 Jun 2021 14:07:10 +0900 Subject: [PATCH 98/99] Update PropertyDAOTest.java --- .../com/codesquad/airbnb/dao/PropertyDAOTest.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java index c90430c4f..7186b68e0 100644 --- a/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java +++ b/BE/src/test/java/com/codesquad/airbnb/dao/PropertyDAOTest.java @@ -39,17 +39,6 @@ void propertyDao_findByAll() { } } -// @Test -// void propertyDao_findBy() { -// List properties = propertyDao.findBy(1L, LocalDate.of(2021, 5, 20), LocalDate.of(2021, 5, 23), -// 10000, 100000, 2); -// for (PropertyDTO property : properties) { -// assertThat(property).isNotNull(); -// logger.info("Find property by propertyDao: {}", -// property); -// } -// } - @Test void propertyDao_findByWishList() { List properties = propertyDao.findBookmarkTrue(); From ceef85e523ecddbf3d376791a13c17d6065f735c Mon Sep 17 00:00:00 2001 From: Jiwon-JJW <69128652+Jiwon-JJW@users.noreply.github.com> Date: Fri, 4 Jun 2021 14:17:17 +0900 Subject: [PATCH 99/99] =?UTF-8?q?chore:=20Default=20=EA=B0=92=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/codesquad/airbnb/dao/GetPropertyModel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BE/src/main/java/com/codesquad/airbnb/dao/GetPropertyModel.java b/BE/src/main/java/com/codesquad/airbnb/dao/GetPropertyModel.java index eb36faadf..0f59fde93 100644 --- a/BE/src/main/java/com/codesquad/airbnb/dao/GetPropertyModel.java +++ b/BE/src/main/java/com/codesquad/airbnb/dao/GetPropertyModel.java @@ -15,8 +15,8 @@ public class GetPropertyModel { @JsonDeserialize(using = LocalDateDeserializer.class) private LocalDate checkOut; - private int minPrice; - private int maxPrice; + private int minPrice = 0; + private int maxPrice = 1000000; private int adult; private int children; private int infant;