Skip to content

Commit

Permalink
feature(#45): 유저 아이디 찾기 기능 추가
Browse files Browse the repository at this point in the history
- 테스트 코드 아직 작성하지 않았습니다.
- "이름, 생년월일" 을 통해 유저 아이디 찾기를 진행합니다.
- "생년월일"이 아이디 찾기에서 사용되기 때문에, 회원가입시 "생년월일" 데이터를 필수적으로 넘겨야 하는 식으로 변경하였습니다.
  • Loading branch information
memoer committed Jul 29, 2022
1 parent c892eb4 commit c41b9a8
Show file tree
Hide file tree
Showing 30 changed files with 133 additions and 80 deletions.
4 changes: 2 additions & 2 deletions src/main/java/com/airjnc/common/advice/ExceptionAdvice.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.MessageSource;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
Expand Down Expand Up @@ -45,7 +45,7 @@ public ErrorResponse handleDefaultException(DefaultException ex) {
}

// 400 - Bean Validation, BAD REQUEST
@ExceptionHandler({MethodArgumentNotValidException.class, BadRequestException.class})
@ExceptionHandler({BindException.class, BadRequestException.class})
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResponse handleBadRequestException(Exception ex) {
return ErrorResponseFactory.create(ex, messageSource);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.airjnc.common.exception;


import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import com.airjnc.common.util.factory.ErrorsFactory;
import org.springframework.validation.Errors;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.airjnc.common.exception;

import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import com.airjnc.common.util.factory.ErrorsFactory;
import org.springframework.validation.Errors;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.airjnc.common.exception;


import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import com.airjnc.common.util.factory.ErrorsFactory;
import org.springframework.validation.Errors;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.airjnc.common.exception;


import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import com.airjnc.common.util.factory.ErrorsFactory;
import org.springframework.validation.Errors;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.airjnc.common.exception;


import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import com.airjnc.common.util.factory.ErrorsFactory;
import org.springframework.validation.Errors;

Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/airjnc/common/util/CommonRegex.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.airjnc.common.util;

public interface CommonRegex {

String localDate = "\\d{4}-\\d{2}-\\d{2}";
}
5 changes: 0 additions & 5 deletions src/main/java/com/airjnc/common/util/constant/SessionKey.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.airjnc.common.util.constant;
package com.airjnc.common.util.enumerate;

public enum ErrorCode {
INTERNAL,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.airjnc.common.util.enumerate;

public enum SessionKey {
USER,
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.airjnc.common.util.factory;

import com.airjnc.common.util.constant.ErrorCode;
import com.airjnc.common.util.enumerate.ErrorCode;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Errors;

Expand Down
9 changes: 8 additions & 1 deletion src/main/java/com/airjnc/user/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@
import com.airjnc.common.annotation.CheckAuth;
import com.airjnc.common.annotation.CurrentUserId;
import com.airjnc.user.dto.request.CreateDTO;
import com.airjnc.user.dto.request.FindEmailDTO;
import com.airjnc.user.dto.response.UserDTO;
import com.airjnc.user.service.UserService;
import com.airjnc.user.service.UserStateService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
Expand All @@ -25,6 +28,11 @@ public class UserController {

private final UserStateService userStateService;

@GetMapping("/findEmail")
public String findEmail(@Validated @ModelAttribute FindEmailDTO findEmailDTO) {
return userService.findEmail(findEmailDTO);
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public UserDTO create(@RequestBody @Validated CreateDTO createDTO) {
Expand All @@ -33,7 +41,6 @@ public UserDTO create(@RequestBody @Validated CreateDTO createDTO) {
return userDTO;
}


@DeleteMapping("/me")
@ResponseStatus(HttpStatus.NO_CONTENT)
@CheckAuth
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/airjnc/user/dao/UserRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@

import com.airjnc.user.domain.UserEntity;
import com.airjnc.user.dto.request.CreateDTO;
import com.airjnc.user.dto.request.FindEmailDTO;

public interface UserRepository {

UserEntity findById(Long id);

UserEntity findByEmail(String email);

String getEmail(FindEmailDTO findEmailDTO);

UserEntity save(CreateDTO createDTO);


void remove(Long id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.airjnc.user.dao.mapper.UserMapper;
import com.airjnc.user.domain.UserEntity;
import com.airjnc.user.dto.request.CreateDTO;
import com.airjnc.user.dto.request.FindEmailDTO;
import com.airjnc.user.util.UserModelMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
Expand All @@ -30,6 +31,11 @@ public UserEntity findByEmail(String email) {
return userMapper.findByEmail(email).orElseThrow(NotFoundException::new);
}

@Override
public String getEmail(FindEmailDTO findEmailDTO) {
return userMapper.getEmail(findEmailDTO);
}

@Override
public UserEntity save(CreateDTO createDTO) {
int affect = userMapper.save(createDTO);
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/airjnc/user/dao/mapper/UserMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.airjnc.user.domain.UserEntity;
import com.airjnc.user.dto.request.CreateDTO;
import com.airjnc.user.dto.request.FindEmailDTO;
import java.util.Optional;
import org.apache.ibatis.annotations.Mapper;

Expand All @@ -12,6 +13,8 @@ public interface UserMapper {

Optional<UserEntity> findByEmail(String email);

String getEmail(FindEmailDTO findEmailDTO);

int save(CreateDTO createDTO);

int remove(Long id);
Expand Down
13 changes: 10 additions & 3 deletions src/main/java/com/airjnc/user/dto/request/CreateDTO.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.airjnc.user.dto.request;

import com.airjnc.common.util.BCryptHashEncrypter;
import com.airjnc.common.util.CommonRegex;
import com.airjnc.user.domain.Gender;
import com.airjnc.user.util.Regex;
import com.airjnc.user.util.UserRegex;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
Expand All @@ -28,16 +29,22 @@ public class CreateDTO {
private Gender gender;

@NotNull
@Pattern(regexp = Regex.Password.format)
@Pattern(regexp = UserRegex.password)
private String password;

@NotNull
@Pattern(regexp = CommonRegex.localDate)
private String birthDate;

@Builder
public CreateDTO(Long id, String email, String password, String name, Gender gender) {
public CreateDTO(Long id, String email, String password, String name, Gender gender,
String birthDate) {
this.id = id;
this.email = email;
this.password = password;
this.name = name;
this.gender = gender;
this.birthDate = birthDate;
}

public void changePasswordToHash() {
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/airjnc/user/dto/request/FindEmailDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.airjnc.user.dto.request;

import com.airjnc.common.util.CommonRegex;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class FindEmailDTO {

@NotNull
private final String name;

@Pattern(regexp = CommonRegex.localDate)
private final String birthDate;
}
4 changes: 2 additions & 2 deletions src/main/java/com/airjnc/user/dto/request/LogInDTO.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.airjnc.user.dto.request;

import com.airjnc.user.util.Regex;
import com.airjnc.user.util.UserRegex;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
Expand All @@ -18,7 +18,7 @@ public class LogInDTO {
private String email;

@NotNull
@Pattern(regexp = Regex.Password.format)
@Pattern(regexp = UserRegex.password)
private String password;

@Builder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.airjnc.user.service;

import com.airjnc.common.util.constant.SessionKey;
import com.airjnc.common.util.enumerate.SessionKey;
import javax.servlet.http.HttpSession;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/airjnc/user/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.airjnc.user.dao.UserRepository;
import com.airjnc.user.domain.UserEntity;
import com.airjnc.user.dto.request.CreateDTO;
import com.airjnc.user.dto.request.FindEmailDTO;
import com.airjnc.user.dto.response.UserDTO;
import com.airjnc.user.util.UserModelMapper;
import lombok.RequiredArgsConstructor;
Expand All @@ -28,4 +29,8 @@ public UserDTO create(CreateDTO createDTO) {
public void remove(Long id) {
userRepository.remove(id);
}

public String findEmail(FindEmailDTO findEmailDTO) {
return userRepository.getEmail(findEmailDTO);
}
}
10 changes: 0 additions & 10 deletions src/main/java/com/airjnc/user/util/Regex.java

This file was deleted.

7 changes: 7 additions & 0 deletions src/main/java/com/airjnc/user/util/UserRegex.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.airjnc.user.util;

public interface UserRegex {

String password = "^(?=.*[0-9])(?=.*[a-z])(?=.*[@#!~$%^&-+=()])(?=\\S+$).{8,16}$";
}

2 changes: 0 additions & 2 deletions src/main/resources/application-local.properties
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,3 @@ spring.datasource.password=q1w2e3
logging.level.org.springframework.jdbc=debug
# MessageSource
spring.messages.basename=errors
# Session
session.expire=86400
2 changes: 1 addition & 1 deletion src/main/resources/messages/errors.properties
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ Pattern.password=\uC601\uC5B4 \uC18C\uBB38\uC790, \uC22B\uC790, \uD2B9\uC218\uBB
### Mine
UserCheckService.emailIsDuplicated=\uC774\uBBF8 \uC874\uC7AC\uD558\uB294 \uC774\uBA54\uC77C\uC785\uB2C8\uB2E4.
UserCheckService.passwordIsNotMatch=\uBE44\uBC00\uBC88\uD638\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
CommonCheckService.isNotMatch=actual: {0}, but expected: {1}
CommonInternalCheckService.isNotMatch=actual: {0}, but expected: {1}
51 changes: 29 additions & 22 deletions src/main/resources/mybatis/mapper/user.xml
Original file line number Diff line number Diff line change
@@ -1,25 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.airjnc.user.dao.mapper.UserMapper">
<select id="findById" resultType="UserEntity">
SELECT *
FROM user
WHERE id = #{id}
AND deleted_at IS NULL;
</select>
<select id="findByEmail" resultType="UserEntity">
SELECT *
FROM user
WHERE email = #{email};
</select>
<insert id="save" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (email, password, name, gender)
VALUES (#{email}, #{password}, #{name}, #{gender});
</insert>
<delete id="remove">
UPDATE user
set deleted_at = now()
WHERE id = #{id}
AND deleted_at IS NULL
</delete>
<delete id="remove">
UPDATE user
set deleted_at = now()
WHERE id = #{id}
AND deleted_at IS NULL
</delete>
<insert id="save" keyProperty="id" useGeneratedKeys="true">
INSERT INTO user (email, password, name, gender)
VALUES (#{email}, #{password}, #{name}, #{gender});
</insert>
<select id="getEmail" resultType="String">
SELECT email
FROM user
WHERE name = #{name}
AND birthdate = ${birthDate};
</select>
<select id="findById" resultType="UserEntity">
SELECT *
FROM user
WHERE id = #{id}
AND deleted_at IS NULL;
</select>
<select id="findByEmail" resultType="UserEntity">
SELECT *
FROM user
WHERE email = #{email};
</select>
</mapper>
Loading

0 comments on commit c41b9a8

Please sign in to comment.