번개장터V2-(1) 회원가입,로그인
4985 단어 Springspring securitySpring
라이징캠프에서 2명이 짝을 지어 서버를 만들었었다. 하지만 여러 사람들의 기준에 맞추기 위해 매우 단순한 형식의 템플릿을 기준으로 하여 조금 더 버전을 높이기 위해 ERD설계 와 기존 서버는 그대로 두고 Spring에 초점을 맞춰 더 다양한 기술을 사용하기 위해 다시 프로젝트를 시작하였다.
1. jdbcTemplete을 모두 JPA로 변경
2. 예외처리 관련 try-catch를 ControllerAdvice로 대체
(1) 회원가입
- jpa를 사용하여 DAO에서 매우 길었던 SQL들이 많이 줄었다.
- @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);
}
Author And Source
이 문제에 관하여(번개장터V2-(1) 회원가입,로그인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tomy807/번개장터V2-1-회원가입로그인저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)