번개장터V2-(1) 회원가입,로그인

라이징캠프에서 2명이 짝을 지어 서버를 만들었었다. 하지만 여러 사람들의 기준에 맞추기 위해 매우 단순한 형식의 템플릿을 기준으로 하여 조금 더 버전을 높이기 위해 ERD설계 와 기존 서버는 그대로 두고 Spring에 초점을 맞춰 더 다양한 기술을 사용하기 위해 다시 프로젝트를 시작하였다.
1. jdbcTemplete을 모두 JPA로 변경
2. 예외처리 관련 try-catch를 ControllerAdvice로 대체

(1) 회원가입

  1. jpa를 사용하여 DAO에서 매우 길었던 SQL들이 많이 줄었다.
  2. @Valid를 이용하여 아래와 같이 예외처리를 해주었던 것보다 더 간단해졌다.
ex)
if (postUserReq.getEmail() == null) {
            return new BaseResponse<>(POST_USERS_EMPTY_EMAIL);
}
//이메일 정규표현
if (!isRegexEmail(postUserReq.getEmail())) {
            return new BaseResponse<>(POST_USERS_INVALID_EMAIL);
 }
  • UserContorller
@PostMapping("/join")
    public ResponseEntity join(@Valid @RequestBody SignDto signDto) {
        userService.join(signDto);
        return ResponseEntity.status(HttpStatus.OK)
        .body(new BaseResponse<>("회원가입이 되었습니다."));
    }
  • SignDto
@Data
@AllArgsConstructor
public class SignDto {

    @NotEmpty(message = "사용자 이름을 입력해주세요")
    private String UserName;
    
    @NotEmpty(message = "이메일을 입력해주세요")
    @Email
    private String email;
    
    @NotEmpty(message = "비밀번호를 입력해주세요")
    private String password;
    
    @NotEmpty(message = "전화번호를 입력해주세요")
    @Size(max=12)
    private String phone;
}
  • UserService
public void join(SignDto signDto) {

        if (userRepository.findByEmail(signDto.getEmail()).isPresent()) {
            throw new AlreadyExistEmailException();
        }

        User user = User.builder()
                .name(signDto.getUserName())
                .shopName(signDto.getUserName()+"상점")
                .email(signDto.getEmail())
                .password(passwordEncoder.encode(signDto.getPassword()))
                .phone(signDto.getPhone()).build();
        
        userRepository.save(user);
    }
  • UserRepository
public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByEmail(String email);
}

(2) 로그인

  • UserContorller
@PostMapping("/login")
    public ResponseEntity login(@Valid @RequestBody LoginDto loginDto) {
        LoginResDto login = userService.login(loginDto);

        return ResponseEntity.ok(login);
    }
  • LoginDto
@Data
@AllArgsConstructor
public class LoginDto {

    @NotEmpty(message = "이메일를 입력해주세요")
    @Email
    private String email;
    @NotEmpty(message = "비밀번호를 입력해주세요")
    private String password;
}
  • UserService
private final PasswordEncoder passwordEncoder;
private final JwtTokenProvider jwtTokenProvider;

public LoginResDto login(LoginDto loginDto) {
        //이메일로 user 찾아오기
        User user = userRepository.findByEmail(loginDto.getEmail()).orElseThrow(() -> new IllegalArgumentException("가입되지 않은 E-MAIL 입니다."));
        //가져온 user의 비밀번호와 입력한 비밀번호가 같은지 확인 
        if (!passwordEncoder.matches(loginDto.getPassword(), user.getPassword())) {
            throw new IllegalArgumentException("잘못된 비밀번호입니다.");
        }
        //토큰 발급
        String token = jwtTokenProvider.createToken(user.getId(), user.getEmail());

        return new LoginResDto(token, user.getId());
    }
  • JwtTokenProvider
public String createToken(Long userIdx,String email) {
        Date now = new Date();
        return Jwts.builder()
                .claim("userIDx", userIdx) // 정보 저장
                .claim("email", email)
                .setIssuedAt(now) // 토큰 발행 시간 정보
                .setExpiration(new Date(now.getTime() + tokenValidTime)) // set Expire Time
                .signWith(SignatureAlgorithm.HS256, secretKey)  // 사용할 암호화 알고리즘과 signature 에 들어갈 secret값 세팅
                .compact();
    }
  • UserRepository
public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByEmail(String email);
}

좋은 웹페이지 즐겨찾기