나는 현재 고객,기획자의 요구사항에 맞춰서 바로바로 적용할 수 있도록 두가지의 로그인 방식을 설계해 놨다
필요없다.
어짜피 이메일,비밀번호로 로그인 한 후 마이페이지에 들어가서 본인의 아이디를 확인하면 되기 때문이다.
이때는 필요하다.
그럼 어떤 방식으로 아이디를 찾으면 될까?
1.사용자 이름,이메일,비밀번호 입력 후 일치 하면 아이디 반환
1.전화번호,이름 -> 인증
2.이메일,이름 -> 인증
인증번호 확인 후, 일치하면 아이디 조회
사용자가 본인의 아이디를 확인함에 있어서 편리하지만,
정보보안의 단점이 존재하긴 한다.
보안이 중요한 금융권 같은 서비스에서는 마스킹을 하는 경우가 많음
예시
user123 → us***3
example_user → ex*****ser
우선 나는 간단한 홈페이지를 구현중이니,
/**
* 정보 조회로 아이디 찾기 API
* @param request (username,email,password)가 들어있는 DTO
* @return nickname 반환
*/
@Operation(summary = "정보 조회로 아이디 찾기", description = "아이디 찾기 : 이메일,이름,비밀번호 입력")
@PostMapping("/findID/option1")
public ResponseEntity<String> findID_Option1(@RequestBody @Valid FindIDRequest_Option1 request){
String nickname = memberService.findID_option1(request);
return ResponseEntity.ok(nickname);
}
여기서 DTO를 입력을 받는다.
해당 DTO는 다음과 같다.
package website.server.Domain.Member.DTO.Request;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
public record FindIDRequest_Option1(
@NotBlank(message = "Email is required")
@Email(message = "Email should be valid")
String email,
@NotBlank(message = "Username is required")
String username,
@NotBlank(message = "Password is required")
@Size(min = 6, message = "Password must be at least 6 characters long")
String password
) {
}
위 DTO를 입력받은 컨트롤러는 서비스 단으로 로직을 넘긴다.
/**
* 정보 조회로 아이디 찾기 메서드
* @param request (username,email,password)가 들어있는 DTO
* @return nickname 반환
*/
@Override
public String findID_option1(FindIDRequest_Option1 request) {
String username = request.username();
String email = request.email();
// PW validation
Member member = memberMapper.findMemberByEmail(email);
String password = request.password();
if (!passwordEncoder.matches(password, member.getPassword()))
return "Not matched PW";
return memberMapper.findID_option1(username,email);
}
사용자의 PW가 맞는지 검증하고,
DTO 에서 username,email을 찾아서 사용자의 nickname을 반환한다.
username,email을 통해 사용자를 찾는 mapper는 다음과 같다.
/* 정보 조회로 아이디 찾기 */
String findID_option1(@Param("username") String username, @Param("email") String email);
<!-- 정보 조회로 아이디 찾기 -->
<select id ="findID_option1" resultType="String">
SELECT
nickname
FROM
member
WHERE
username = #{username} AND email = #{email}
</select>
여러개의 파라미터를 넘길 떄에는 다음과 같이 ,param 어노테이션이 필요한가보다.
그리고저 para어노테이션은 아무거나 import하면 안되고,
import org.apache.ibatis.annotations.Param;
이것을 import해야 한다.
내가 이것 말고 다른 것을 import하는 바람에 30분을 어이없이 시간낭비를 했다.
그리고 result type 또한 xml과 mapper인터페이스가 잘 통일되게 신경또한 써줘야 한다.
