나는 로그인 방식에서 존재할 수 있는 기획자/사용자의 요구사항이 다음과 같을 것이라고 예상한다.
1. 이메일 로그인 방식
2. 아이디 로그인 방식
기획자/고객과 끊임없이 소통하다가,갑자기 요구사항이 바뀌면 바로바로 갈아끼워서
1분만에 그 요구사항을 맞춰줄 수 있게 설계하면 좋지 않을까???
웹 서비스와 사용자의 요구에 따라 로그인 방식은 달라져야한다.
그로 여러가지의 로그인 방식을 구현해보면 좋을 것 같다는 생각이 들어, 여러가지의 로그인 방식으로 구현해 보았다.
어떠한 방식의 로그인들이 있는지 찾아보니,
우선 내가 여기에서 구현할 것들을 다음 2가지 밖에 없긴 하더라.
물론 이것 말고도 소셜로그인, 인증서 로그인등등이 추가적으로 있긴 하더라.
/**
* 이메일 로그인 API
* @param request 로그인DTO(이메일,비밀번호)
* @return 200ok + JWT 토큰
*/
@Operation(summary = " 이메일 로그인 API ", description = " 로그인 : email,password")
@PostMapping("/login")
public ResponseEntity<JwtTokenDto> login(@RequestBody AuthRequest_email request){
JwtTokenDto jwtToken = authService.login(request.email(), request.password());
if (jwtToken == null)
return null;
return ResponseEntity.ok(jwtToken);
}
/**
* 이메일 로그인 메서드
* @param email 이메일
* @param password 비밀번호
* @return JWT 토큰
*/
public JwtTokenDto login(String email, String password) {
Member member = memberMapper.findMemberByEmail(email);
if (member == null) {return null;}
if (!passwordEncoder.matches(password, member.getPassword())) {return new JwtTokenDto("x","x");}
return new JwtTokenDto(jwtUtil.generateAccessToken(email),jwtUtil.generateRefreshToken(email));
}
package website.server.Domain.Authentication.DTO.Request;
// 이메일로 로그인 처리
public record AuthRequest_email(
String email,
String password
) {
}
package website.server.Domain.Member.Mapper;
import org.apache.ibatis.annotations.Mapper;
import website.server.Domain.Member.Entity.Member;
@Mapper
public interface MemberMapper {
/* 회원가입 */
void register(Member member);
/* 이메일로 사용자 찾기 */
Member findMemberByEmail(String email);
}
<!-- 이메일로 사용자 찾기 -->
<select id="findMemberByEmail" resultType="website.server.Domain.Member.Entity.Member">
SELECT user_id, role, username, email, password, birth, register_date
FROM member
WHERE email = #{email}
LIMIT 1
</select>
이번 프로젝트에서는 다음과 같이 사용자를 구분한다.
사용자 고유 번호 : userNumber
실제 사용자 이름 : username
아이디(활동명) : nickname
/**
* 아이디 로그인 API
* @param request 로그인 DTO(ID,비밀번호)
* @return 200ok + JWT 토큰
*/
@Operation(summary = "아이디 로그인 API" , description = "로그인 : ID,password")
@PostMapping("/login/id")
public ResponseEntity<JwtTokenDto> nickName_Login(@RequestBody AuthRequest_id request){
JwtTokenDto jwtToken = authService.id_Login(request.nickName(), request.password());
if (jwtToken == null)
return null;
return ResponseEntity.ok(jwtToken);
}
아이디 로그인 용 요청 DTO를 따로 만들어 입력한다.
/**
* 아이디 로그인 메서드
* @param nickName 아이디
* @param password 비밀번호
* @return JWT 토큰
*/
public JwtTokenDto id_Login(String nickName, String password) {
Member member = memberMapper.findMemberByNickname(nickName);
if (member == null) {return new JwtTokenDto("no member","x");}
if (!passwordEncoder.matches(password, member.getPassword())) {return new JwtTokenDto("PW not match","x");}
return new JwtTokenDto(jwtUtil.generateAccessToken(member.getEmail()),jwtUtil.generateRefreshToken(member.getEmail()));
}
아이디를 받아와서 MemberMapper에 findMemberByNickname 메서드에 넘겨서
원하는 멤버 객체를 찾아온다.
/* 사용자 아이디(활동명)으로 사용자 찾기 */
Member findMemberByNickname(String nickname);
<select id="findMemberByNickname" resultType="website.server.Domain.Member.Entity.Member" parameterType="String">
SELECT
userNumber,
role,
registerDate,
username,
nickname,
phoneNumber,
gender,
email,
password,
birth
FROM
member
WHERE
nickname = #{nickname}
</select>

이메일 로그인 방식 : http://localhost:8080/auth/login/email
아이디 로그인 방식 : http://localhost:8080/auth/login/id
이렇게 두가지로 API 를 나누었다.
사용자의 요구에 따라서 갈아끼우기만 하면,
사용자의 요구사항이 바뀌어도 1분만에 즉각 수정이 가능한 설계이지 않을까 생각한다.