지금까지 공통적으로 느끼고 있는 점은
@Valid를 통해서 유효성 검사를 했을 때 이 error 값을 뷰 폼파일에서 표현하는데에서 지속적으로 오류가 발생함.
아마도 타임리프 문법을 완벽하게 숙지하지 않은 상태에서 사용해서 그런듯 하다.
과제
1. 타임리프 문법 숙지
2. 기본적인 HTML, CSS 사용법 공부
3. 추후 리액트 공부.
1.FindPasswordController
package com.example.bravobra.controller;
import com.example.bravobra.dto.request.FindPasswordDto;
import com.example.bravobra.dto.request.resetPasswordDto;
import com.example.bravobra.service.PasswordService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
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 org.springframework.web.bind.annotation.RequestMapping;
import java.util.NoSuchElementException;
@Controller
@RequiredArgsConstructor
@RequestMapping("/members")
public class FindPasswordController {
private final PasswordService passwordService;
@GetMapping("/find-password")
public String showFindPasswordForm(FindPasswordDto findPwDto, Model model) {
model.addAttribute("findPasswordDto", findPwDto);
return "login/findPasswordForm";
}
@PostMapping("/find-password")
public String findPassword(@Valid FindPasswordDto findPwDto, BindingResult result, Model model) {
// 입력 도중에 에러가생기면 다시 폼으로 이동,
if(result.hasErrors()){
return "login/findPasswordForm";
}
// 에러가 없으면 회원이 있는지 부터 확인
try{
String email = passwordService.verifyMember(findPwDto);
model.addAttribute("email", email);
return "login/resetPasswordForm";
}catch(NoSuchElementException e){
result.reject("globalError", "입력하신 정보와 일치하는 회원이 없습니다.");
return "login/findPasswordForm";
}
}
@PostMapping("/reset-password")
public String resetPassword(@Valid resetPasswordDto resetPwDto, BindingResult result, Model model){
if(result.hasErrors()){
result.reject("error", "비밀번호를 형식에 맞춰 입력해주세요.");
return "login/resetPasswordForm";
}
// 비밀번호 일치 여부 확인
if(!resetPwDto.getNewPassword().equals(resetPwDto.getNewPasswordConfirm())){
model.addAttribute("error", "비밀번호가 일치하지 않습니다.");
return "login/resetPasswordForm";
}
try{
passwordService.updatePassword(resetPwDto.getEmail(), resetPwDto.getNewPassword());
model.addAttribute("message", "비밀번호가 성공적으로 변경되었습니다.");
return "login/resetSuccess";
}catch(IllegalArgumentException e){
model.addAttribute("error", e.getMessage());
return "login/resetPasswordForm";
}
}
}
2. FindPasswordDto
package com.example.bravobra.dto.request;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;
@Getter
@Builder
@ToString
public class FindPasswordDto {
@NotBlank(message = "휴대폰 번호를 입력해주세요.")
@Pattern(regexp = "^(\\d{2,3})-(\\d{3,4})-(\\d{4})$",message = "000-0000-0000 양식을 맞춰주세요.")
private String phoneNumber;
@Email(message = "올바른 이메일 형식이 아닙니다.")
@NotBlank(message = "이메일을 입력해주세요.")
private String email;
@NotBlank(message = "이름을 입력해주세요.")
private String name;
}
3.findPasswordService
package com.example.bravobra.service;
import com.example.bravobra.domain.Member;
import com.example.bravobra.dto.request.FindPasswordDto;
import com.example.bravobra.repository.MemberRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.NoSuchElementException;
import java.util.Optional;
@Service
@RequiredArgsConstructor
public class PasswordService {
private final MemberRepository memberRepository;
private final BCryptPasswordEncoder encoder;
//회원이 있는지 없는지 확인. 이메일, 이름, 번호를 확인해서.
public String verifyMember(FindPasswordDto findPwDto) {
Optional<Member> member = memberRepository.findByEmailAndNameAndPhoneNumber(
findPwDto.getEmail(),
findPwDto.getName(),
findPwDto.getPhoneNumber()
);
return member.map(Member::getEmail)
.orElseThrow(() -> new NoSuchElementException("회원 정보가 일치하지 않습니다."));
}
@Transactional
public void updatePassword(String email, String newPassword) {
memberRepository.findByEmail(email).orElseThrow(() -> new IllegalArgumentException("회원 정보를 찾을 수 없습니다."));
String encodedPassword = encoder.encode(newPassword);
memberRepository.updatePassword(email, encodedPassword);
}
}
'토이 프로젝트 2' 카테고리의 다른 글
| AdminIntercepter(Enum에 대한 오류 해결) (0) | 2024.12.29 |
|---|---|
| 로그인 횟수 제한 구현 (0) | 2024.12.28 |
| Interceptor(권한) 구현 (1) | 2024.12.26 |
| 커스텀 어노테이션 추가, ExceptionHandler 추가 (0) | 2024.12.25 |
| 회원가입시 비밀번호 암호화(bCrypto) (0) | 2024.12.24 |