diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..7454180f2 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..69a971507 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c78733..744e882ed 100644 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/bin/sh +#!/usr/bin/env sh # -# Copyright © 2015-2021 the original authors. +# 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. @@ -17,101 +17,67 @@ # ############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# +## +## Gradle start up script for UN*X +## ############################################################################## # Attempt to set APP_HOME - # Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac +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 - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} +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 +MAX_FD="maximum" warn () { echo "$*" -} >&2 +} die () { echo echo "$*" echo exit 1 -} >&2 +} # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MSYS* | MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -121,9 +87,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 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 + JAVACMD="$JAVA_HOME/jre/sh/java" else - JAVACMD=$JAVA_HOME/bin/java + JAVACMD="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -132,7 +98,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD=java + 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 @@ -140,95 +106,80 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac +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 -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. +# For 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" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - +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 - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) + 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 - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg + 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 -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' +# 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/src/main/java/com/kakao/cafe/config/MvcConfig.java b/src/main/java/com/kakao/cafe/config/MvcConfig.java index 19f1b3ae0..e52d175f9 100644 --- a/src/main/java/com/kakao/cafe/config/MvcConfig.java +++ b/src/main/java/com/kakao/cafe/config/MvcConfig.java @@ -1,18 +1,11 @@ package com.kakao.cafe.config; import org.springframework.context.annotation.Configuration; -import org.springframework.core.Ordered; -import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class MvcConfig implements WebMvcConfigurer { - @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.setOrder(Ordered.HIGHEST_PRECEDENCE); - registry.addViewController("/users/login").setViewName("user/login"); - } } diff --git a/src/main/java/com/kakao/cafe/controller/ArticleController.java b/src/main/java/com/kakao/cafe/controller/ArticleController.java index 4f7bf10e9..67ca23164 100644 --- a/src/main/java/com/kakao/cafe/controller/ArticleController.java +++ b/src/main/java/com/kakao/cafe/controller/ArticleController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import javax.servlet.http.HttpSession; import javax.validation.Valid; import java.util.List; @@ -49,7 +50,7 @@ public String create(@Valid ArticleDto articleDto, BindingResult bindingResult, } @GetMapping("/") - public String showArticles(Model model) { + public String showArticles(Model model, HttpSession session) { List
articles = articleService.findArticles(); model.addAttribute("articles", articles); return "index"; diff --git a/src/main/java/com/kakao/cafe/controller/LoginController.java b/src/main/java/com/kakao/cafe/controller/LoginController.java new file mode 100644 index 000000000..e89169900 --- /dev/null +++ b/src/main/java/com/kakao/cafe/controller/LoginController.java @@ -0,0 +1,53 @@ +package com.kakao.cafe.controller; + +import com.kakao.cafe.controller.dto.LoginDto; +import com.kakao.cafe.domain.User; +import com.kakao.cafe.service.UserService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; + +import javax.servlet.http.HttpSession; +import javax.validation.Valid; + +@Controller +public class LoginController { + + private final UserService userService; + private final Logger logger = LoggerFactory.getLogger(getClass()); + + public LoginController(UserService userService) { + this.userService = userService; + } + + @GetMapping("/login") + public String loginForm(Model model) { + model.addAttribute("loginDto", new LoginDto()); + return "user/login"; + } + + @PostMapping("/login") + public String login(@Valid LoginDto loginDto, BindingResult bindingResult, HttpSession session) { + if (bindingResult.hasErrors()) { + return "user/login"; + } + + User user = userService.loginUser(loginDto.getUserId(), loginDto.getPassword()); + if (user == null) { + bindingResult.reject("loginErrorMessage", "존재하지 않는 회원입니다."); + return "user/login"; + } + session.setAttribute("loginUser", user); + return "redirect:/"; + } + + @GetMapping("/logout") + public String logout(HttpSession session) { + session.invalidate(); + return "redirect:/"; + } +} diff --git a/src/main/java/com/kakao/cafe/controller/UserController.java b/src/main/java/com/kakao/cafe/controller/UserController.java index b332bd6ec..f26b2c96d 100644 --- a/src/main/java/com/kakao/cafe/controller/UserController.java +++ b/src/main/java/com/kakao/cafe/controller/UserController.java @@ -11,7 +11,10 @@ import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; import javax.validation.Valid; +import java.io.IOException; import java.util.List; @RequestMapping("/users") @@ -56,10 +59,17 @@ public String showProfile(@PathVariable String userId, Model model) { } @GetMapping("/{userId}/form") - public String updateForm(@PathVariable String userId, Model model) { - User user = userService.findOne(userId); - UserUpdateDto userUpdateDto = new UserUpdateDto(user); - model.addAttribute("userUpdateDto", userUpdateDto); + public String updateForm(@PathVariable String userId, HttpSession session, Model model, HttpServletResponse response) throws IOException { + User loginUser = (User) session.getAttribute("loginUser"); + if (loginUser == null) { + return "redirect:/login"; + } + + if (loginUser.isNotEqualsUserId(userId)) { + response.sendError(403, "다른 사용자의 정보를 수정할 수 없습니다."); + } + + model.addAttribute("userUpdateDto", new UserUpdateDto(loginUser)); return "user/updateForm"; } @@ -69,7 +79,13 @@ public String update(@Valid UserUpdateDto userUpdateDto, BindingResult bindingRe logger.error("errors={}", bindingResult); return "user/updateForm"; } - userService.update(userUpdateDto); - return "redirect:/users"; + + boolean checkUpdate = userService.update(userUpdateDto); + if (!checkUpdate) { + bindingResult.reject("isNotCorrectUserInfo", "회원 정보가 일치하지 않습니다."); + return "user/updateForm"; + } + + return "redirect:/users/" + userUpdateDto.getUserId(); } } diff --git a/src/main/java/com/kakao/cafe/controller/dto/LoginDto.java b/src/main/java/com/kakao/cafe/controller/dto/LoginDto.java new file mode 100644 index 000000000..9bd8b0de1 --- /dev/null +++ b/src/main/java/com/kakao/cafe/controller/dto/LoginDto.java @@ -0,0 +1,28 @@ +package com.kakao.cafe.controller.dto; + +import javax.validation.constraints.NotEmpty; + +public class LoginDto { + + @NotEmpty + private String userId; + + @NotEmpty + private String password; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/src/main/java/com/kakao/cafe/controller/dto/UserUpdateDto.java b/src/main/java/com/kakao/cafe/controller/dto/UserUpdateDto.java index 143722261..9ccad1a1c 100644 --- a/src/main/java/com/kakao/cafe/controller/dto/UserUpdateDto.java +++ b/src/main/java/com/kakao/cafe/controller/dto/UserUpdateDto.java @@ -11,10 +11,7 @@ public class UserUpdateDto { private String userId; @NotBlank - private String currentPassword; - - @NotBlank - private String newPassword; + private String password; @NotBlank private String name; @@ -25,22 +22,10 @@ public class UserUpdateDto { public UserUpdateDto() { } - public UserUpdateDto(User user) { - userId = user.getUserId(); - name = user.getName(); - email = user.getEmail(); - } - - public UserUpdateDto(String userId, String currentPassword, String newPassword, String name, String email) { - this.userId = userId; - this.currentPassword = currentPassword; - this.newPassword = newPassword; - this.name = name; - this.email = email; - } - - public User toEntity() { - return new User(userId, newPassword, name, email); + public UserUpdateDto(User loginUser) { + this.userId = loginUser.getUserId(); + this.name = loginUser.getName(); + this.email = loginUser.getEmail(); } public void setUserId(String userId) { @@ -51,20 +36,12 @@ public String getUserId() { return userId; } - public String getCurrentPassword() { - return currentPassword; - } - - public void setCurrentPassword(String currentPassword) { - this.currentPassword = currentPassword; - } - - public String getNewPassword() { - return newPassword; + public String getPassword() { + return password; } - public void setNewPassword(String newPassword) { - this.newPassword = newPassword; + public void setPassword(String password) { + this.password = password; } public String getName() { @@ -82,4 +59,8 @@ public String getEmail() { public void setEmail(String email) { this.email = email; } + + public User toEntity() { + return new User(userId, password, name, email); + } } diff --git a/src/main/java/com/kakao/cafe/domain/User.java b/src/main/java/com/kakao/cafe/domain/User.java index 968e62327..dbd3bd5e7 100644 --- a/src/main/java/com/kakao/cafe/domain/User.java +++ b/src/main/java/com/kakao/cafe/domain/User.java @@ -20,8 +20,16 @@ public boolean isEqualsUserId(String userId) { return this.userId.equals(userId); } + public boolean isNotEqualsUserId(String userId) { + return !isEqualsUserId(userId); + } + + public boolean isEqualsPassword(String password) { + return this.password.equals(password); + } + public boolean isNotEqualsPassword(String password) { - return !this.password.equals(password); + return !isEqualsPassword(password); } public boolean isEqualsEmail(String email) { diff --git a/src/main/java/com/kakao/cafe/repository/UserRepository.java b/src/main/java/com/kakao/cafe/repository/UserRepository.java index 92a4fbd25..3d5a1f1bf 100644 --- a/src/main/java/com/kakao/cafe/repository/UserRepository.java +++ b/src/main/java/com/kakao/cafe/repository/UserRepository.java @@ -12,7 +12,11 @@ public interface UserRepository { List findAll(); + User findByUserIdAndPassword(String userId, String password); + boolean isExistUserId(String userId); boolean isExistEmail(String email); + + void update(User user); } diff --git a/src/main/java/com/kakao/cafe/repository/jdbctemplate/JdbcTemplateUserRepository.java b/src/main/java/com/kakao/cafe/repository/jdbctemplate/JdbcTemplateUserRepository.java index 9a7d79527..e9dce0229 100644 --- a/src/main/java/com/kakao/cafe/repository/jdbctemplate/JdbcTemplateUserRepository.java +++ b/src/main/java/com/kakao/cafe/repository/jdbctemplate/JdbcTemplateUserRepository.java @@ -20,15 +20,8 @@ public JdbcTemplateUserRepository(JdbcTemplate jdbcTemplate) { @Override public User save(User user) { - boolean existUserId = isExistUserId(user.getUserId()); - if (existUserId) { - jdbcTemplate.update( - "update USER set PASSWORD = ?, NAME = ?, EMAIL = ? where USER_ID = ?", - user.getPassword(), user.getName(), user.getEmail(), user.getUserId()); - } else { - jdbcTemplate.update("insert into USER(USER_ID, PASSWORD, NAME, EMAIL) values (?, ?, ?, ?)", - user.getUserId(), user.getPassword(), user.getName(), user.getEmail()); - } + jdbcTemplate.update("insert into USER(USER_ID, PASSWORD, NAME, EMAIL) values (?, ?, ?, ?)", + user.getUserId(), user.getPassword(), user.getName(), user.getEmail()); return user; } @@ -46,6 +39,15 @@ public List findAll() { return jdbcTemplate.query("select * from USER", userRowMapper()); } + @Override + public User findByUserIdAndPassword(String userId, String password) { + try { + return jdbcTemplate.queryForObject("select * from USER where USER_ID = ? and PASSWORD = ?", userRowMapper(), userId, password); + } catch (EmptyResultDataAccessException e) { + return null; + } + } + @Override public boolean isExistUserId(String userId) { return jdbcTemplate.queryForObject("select EXISTS (SELECT * FROM USER where USER_ID = ?)", boolean.class, userId); @@ -56,6 +58,13 @@ public boolean isExistEmail(String email) { return jdbcTemplate.queryForObject("select EXISTS (SELECT * FROM USER where EMAIL = ?)", boolean.class, email); } + @Override + public void update(User user) { + jdbcTemplate.update( + "update USER set NAME = ?, EMAIL = ? where USER_ID = ?", + user.getName(), user.getEmail(), user.getUserId()); + } + private RowMapper userRowMapper() { return (rs, rowNum) -> { String userId = rs.getString("USER_ID"); diff --git a/src/main/java/com/kakao/cafe/repository/memory/MemoryUserRepository.java b/src/main/java/com/kakao/cafe/repository/memory/MemoryUserRepository.java index 40de73ac1..c19248b25 100644 --- a/src/main/java/com/kakao/cafe/repository/memory/MemoryUserRepository.java +++ b/src/main/java/com/kakao/cafe/repository/memory/MemoryUserRepository.java @@ -11,11 +11,7 @@ public class MemoryUserRepository implements UserRepository { @Override public User save(User user) { - if (isExistUserId(user.getUserId())) { - updateUser(user); - } else { - users.add(user); - } + users.add(user); return user; } @@ -32,6 +28,15 @@ public List findAll() { return users; } + @Override + public User findByUserIdAndPassword(String userId, String password) { + User user = findByUserId(userId); + if (user.isEqualsPassword(password)) { + return user; + } + return null; + } + @Override public boolean isExistUserId(String userId) { return users.stream() @@ -44,12 +49,12 @@ public boolean isExistEmail(String email) { .anyMatch(user -> user.isEqualsEmail(email)); } - public void updateUser(User user) { + @Override + public void update(User user) { for (int i = 0; i < users.size(); i++) { if (user.isEqualsUserId(users.get(i).getUserId())) { users.set(i, user); } } } - } diff --git a/src/main/java/com/kakao/cafe/service/UserService.java b/src/main/java/com/kakao/cafe/service/UserService.java index bec3c7a91..884bc75d2 100644 --- a/src/main/java/com/kakao/cafe/service/UserService.java +++ b/src/main/java/com/kakao/cafe/service/UserService.java @@ -30,10 +30,8 @@ public List findUsers() { return userRepository.findAll(); } - public void update(UserUpdateDto userUpdateDto) { - validateUserUpdateDto(userUpdateDto); - User user = userUpdateDto.toEntity(); - userRepository.save(user); + public User loginUser(String userId, String password) { + return userRepository.findByUserIdAndPassword(userId, password); } private void validateUserSaveDto(UserSaveDto userSaveDto) { @@ -41,13 +39,6 @@ private void validateUserSaveDto(UserSaveDto userSaveDto) { validateEmail(userSaveDto.getEmail()); } - private void validateUserUpdateDto(UserUpdateDto userUpdateDto) { - User findUser = userRepository.findByUserId(userUpdateDto.getUserId()); - if (findUser.isNotEqualsPassword(userUpdateDto.getCurrentPassword())) { - throw new IllegalArgumentException("비밀번호가 틀렸습니다."); - } - } - private void validateUserId(String userId) { boolean isExistUserId = userRepository.isExistUserId(userId); if (isExistUserId) { @@ -61,4 +52,14 @@ private void validateEmail(String email) { throw new IllegalArgumentException("이미 존재하는 이메일입니다."); } } + + public boolean update(UserUpdateDto userUpdateDto) { + User user = userRepository.findByUserIdAndPassword(userUpdateDto.getUserId(), userUpdateDto.getPassword()); + if (user == null) { + return false; + } + + userRepository.update(userUpdateDto.toEntity()); + return true; + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b27e3a634..124e222f8 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -21,3 +21,8 @@ spring: messages: basename: errors + +server: + servlet: + session: + tracking-modes: cookie diff --git a/src/main/resources/templates/error/403.html b/src/main/resources/templates/error/403.html new file mode 100644 index 000000000..653c669aa --- /dev/null +++ b/src/main/resources/templates/error/403.html @@ -0,0 +1,16 @@ + + + + + 403 Error Page + + +
+

403 오류 화면 입니다.

+
+
    +
  • +
  • +
+ + diff --git a/src/main/resources/templates/layout/header.html b/src/main/resources/templates/layout/header.html index 2b9ee7eae..e6e6e7832 100644 --- a/src/main/resources/templates/layout/header.html +++ b/src/main/resources/templates/layout/header.html @@ -12,6 +12,7 @@ @@ -67,13 +68,21 @@ diff --git a/src/main/resources/templates/user/login.html b/src/main/resources/templates/user/login.html index 66c598e11..0cef15be0 100644 --- a/src/main/resources/templates/user/login.html +++ b/src/main/resources/templates/user/login.html @@ -9,14 +9,25 @@
-
+ +
+

+ 글로벌 오류 메시지 +

+
- + +

+ 아이디 오류입니다. +

- + +

+ 비밀번호 오류입니다. +

diff --git a/src/main/resources/templates/user/updateForm.html b/src/main/resources/templates/user/updateForm.html index e8cda0245..645d1804d 100644 --- a/src/main/resources/templates/user/updateForm.html +++ b/src/main/resources/templates/user/updateForm.html @@ -11,29 +11,15 @@
-
+
+

+

- 사용자 아이디 오류 -

-
-
- - -

- 현재 비밀번호 오류 -

-
-
- - -

- 새 비밀번호 오류 + 아이디 오류

@@ -52,7 +38,15 @@ 이메일 오류

- +
+ + +

+ 현재 비밀번호 오류 +

+
+
diff --git a/src/test/java/com/kakao/cafe/repository/UserRepositoryTest.java b/src/test/java/com/kakao/cafe/repository/UserRepositoryTest.java index a7a90e225..49bf41e45 100644 --- a/src/test/java/com/kakao/cafe/repository/UserRepositoryTest.java +++ b/src/test/java/com/kakao/cafe/repository/UserRepositoryTest.java @@ -7,8 +7,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.*; @SpringBootTest @Transactional @@ -43,6 +42,19 @@ void ifUserNotFoundThrowException() { .hasMessage("사용자가 존재하지 않습니다."); } + @Test + @DisplayName("아이디와 비밀번호가 일치하면 True를 반환한다.") + void loginUser() { + User user = new User("userId1", "password1", "name", "find@gmail.com"); + userRepository.save(user); + + User result1 = userRepository.findByUserIdAndPassword("userId1", "password1"); + User result2 = userRepository.findByUserIdAndPassword("userId1", "password11"); + + assertThat(result1).isNotNull(); + assertThat(result2).isNull(); + } + @Test void isExistUserId() { User user = new User("existUserId", "password", "name", null); diff --git a/src/test/java/com/kakao/cafe/service/UserServiceTest.java b/src/test/java/com/kakao/cafe/service/UserServiceTest.java index 2f5d62889..21ee33be8 100644 --- a/src/test/java/com/kakao/cafe/service/UserServiceTest.java +++ b/src/test/java/com/kakao/cafe/service/UserServiceTest.java @@ -1,7 +1,6 @@ package com.kakao.cafe.service; import com.kakao.cafe.controller.dto.UserSaveDto; -import com.kakao.cafe.controller.dto.UserUpdateDto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -43,16 +42,5 @@ void validateEmail() { .hasMessage("이미 존재하는 이메일입니다."); } - @Test - @DisplayName("사용자 정보를 수정할 때 비밀번호가 틀렸다면 예외가 발생한다.") - void validateUserUpdateDto() { - UserSaveDto userSaveDto = new UserSaveDto("validUserUpdateDto", "password", "name", "validUserUpdateDto1@gamil.com"); - UserUpdateDto userUpdateDto = new UserUpdateDto(userSaveDto.getUserId(), "isNotCurrentPassword", "newPassword", "name", "validUserUpdateDto2@gmail.com"); - - userService.save(userSaveDto); - assertThatThrownBy(() -> userService.update(userUpdateDto)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("비밀번호가 틀렸습니다."); - } }