1.아이디 찾기 기능의 필요성

나는 현재 고객,기획자의 요구사항에 맞춰서 바로바로 적용할 수 있도록 두가지의 로그인 방식을 설계해 놨다

  1. 이메일 로그인 방식
  2. 아이디 로그인 방식

1.1 이메일 로그인 방식에서 아이디 찾기 기능이 필요할까?

필요없다.
어짜피 이메일,비밀번호로 로그인 한 후 마이페이지에 들어가서 본인의 아이디를 확인하면 되기 때문이다.

1.2아이디 로그인 방식에서 아이디 찾기 기능이 필요할까?

이때는 필요하다.
그럼 어떤 방식으로 아이디를 찾으면 될까?

단순 정보 입력으로 인한 아이디 찾기

1.사용자 이름,이메일,비밀번호 입력 후 일치 하면 아이디 반환

전화번호 OR 이메일 인증으로 아이디 찾기

1.전화번호,이름 -> 인증
2.이메일,이름 -> 인증

인증번호 확인 후, 일치하면 아이디 조회

2. 전체 아이디 조회 VS 일부 아이디 마스킹

2.1 전체 아이디 조회

사용자가 본인의 아이디를 확인함에 있어서 편리하지만,
정보보안의 단점이 존재하긴 한다.

2.2 일부 아이디 마스킹 후 조회

보안이 중요한 금융권 같은 서비스에서는 마스킹을 하는 경우가 많음
예시

user123 → us***3
example_user → ex*****ser

우선 나는 간단한 홈페이지를 구현중이니,

  • 단순 정보 입력 인증 + 전화번호 인증
  • 전체 아이디 조회
    이렇게 까지만 구현을 해보고, 나중에 추가적으로 구현을 해보자.

3. 아이디 찾기 구현

3.1 이름,이메일,비밀번호 입력으로 아이디 찾기 -> 전체 아이디 조회

컨트롤러

/**
     * 정보 조회로 아이디 찾기 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인터페이스가 잘 통일되게 신경또한 써줘야 한다.

성공 화면

3.2 전화번호 인증으로 아이디 찾기 -> 전체 아이디 조회

profile
내가 있는 그 조직에서 가장 성실하기만 하자

0개의 댓글