๐ฉ๐ปโ๐ฆฐ JWT๋ฅผ ํ์ฉ - ์ธ์ฆ, ์ธ๊ฐ ๊ตฌํ
ํ์๊ฐ์ โ ๋ก๊ทธ์ธ โ ๋ด ์ ๋ณด ์กฐํ
์ด๋ฉ์ผ, ํจ์ค์๋ / DB์ ์ด๋ฉ์ผ, ํจ์ค์๋, ํ์ ๊ฐ์
์๊ฐ์ ์ ์ฅid(PK, primary key) : Auto-increment โ์ด๋ฉ์ผ :@ ํฌํจ โํจ์ค์๋์ด๋ฉ์ผ, ํจ์ค์๋ ๊ฐ์ ๋ฐ๋๋ค. โid(PK, primary key)๊ฐ ๋ฐ๋์ ๋ด๊ฒจ์์ด์ผ ํ๋ค.id(PK, primary key)๋ฅผ ํ์ฉํด๋ผ.id(PK, primary key), ์ด๋ฉ์ผ, ํ์ ๊ฐ์
์๊ฐ์ด ํฌํจ๋์ด์ผ ํ๋ค.ํจ์ค์๋๊ฐ ํฌํจ๋๋ฉด ์ ๋๋ค.User Entity@Getter
@ToString
@EqualsAndHashCode(of = "id", callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity
@Table(name = "tbl_user")
public class User extends BaseEntity {
@Id
@Column(name = "user_id")
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id; // ๊ณ์ ๋ช
์ด ์๋๋ผ ์๋ณ์ฝ๋
@Column(unique = true, nullable = false)
private String email;
@Column(nullable = false)
private String password;
@Builder
public User(String email, String password) {
this.email = email;
this.password = password;
}
}
SignUpRequestDTO@Getter
...
@Builder
public class SignUpRequestDTO {
@NotBlank(message = "์ด๋ฉ์ผ์ ์
๋ ฅํด์ฃผ์ธ์")
@Email(message = "์ฌ๋ฐ๋ฅธ ์ด๋ฉ์ผ ํ์์ด์ด์ผ ํฉ๋๋ค")
private String email;
@NotBlank(message = "ํจ์ค์๋๋ฅผ ์
๋ ฅํด์ฃผ์ธ์")
@Size(min = 8, max = 15, message = "ํจ์ค์๋๋ 8์ ์ด์ 15์ ์ดํ์ฌ์ผ ํฉ๋๋ค")
private String password;
}

UserController@RestController
@RequiredArgsConstructor
@Slf4j
@RequestMapping("api/user")
public class UserController {
private final UserService userService;
@PostMapping("/sign-up")
public ResponseEntity<SignUpResponseDTO> signUp(
@Validated @RequestBody SignUpRequestDTO dto
) {
log.info("/api/user/sign-up POST! - {}", dto);
SignUpResponseDTO signUpResponseDTO = userService.create(dto);
return ResponseEntity.ok().body(signUpResponseDTO);
}
UserService@Service
@RequiredArgsConstructor
@Slf4j
public class UserService {
private final UserRepository userRepository;
private final TokenProvider tokenProvider;
public SignUpResponseDTO create(SignUpRequestDTO dto) {
if (dto == null) {
throw new NoRegisteredArgumentsException("๊ฐ์
์ ๋ณด๊ฐ ์์ต๋๋ค.");
}
String email = dto.getEmail();
if (isDuplicate(email)) {
throw new DuplicatedEmailException("์ค๋ณต๋ ์ด๋ฉ์ผ์
๋๋ค : [ " + email + " ]");
}
User saved = UserMapper.toEntity(dto);
userRepository.save(saved);
log.info(String.valueOf(saved));
return new SignUpResponseDTO(saved);
}
// ์ด๋ฉ์ผ ์ค๋ณต ๊ฒ์ฌ
public boolean isDuplicate(String email) {
return userRepository.existsByEmail(email);
}
@Slf4j
@RestControllerAdvice
public class UserExceptionHandler {
@ExceptionHandler(NoRegisteredArgumentsException.class)
public ResponseEntity<?> handleNoRegisteredArgumentsException(NoRegisteredArgumentsException e) {
log.warn("ํ์ ๊ฐ์
์ ๋ณด๋ฅผ ์ ๋ฌ๋ฐ์ง ๋ชปํ์ต๋๋ค.");
return ResponseEntity.badRequest()
.body(e.getMessage());
}
@ExceptionHandler(DuplicatedEmailException.class)
public ResponseEntity<?> handleDuplicatedEmailException(DuplicatedEmailException e) {
log.warn("์ด๋ฉ์ผ ์ค๋ณต์
๋๋ค!");
return ResponseEntity.badRequest()
.body(e.getMessage());
}
@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleOtherExceptions(Exception e) {
log.warn("๊ธฐํ ์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค. - {}", e.getMessage());
// e.printStackTrace();
// return ResponseEntity.internalServerError().build();
return ResponseEntity.badRequest().body(e.getMessage());
}
}
@NoArgsConstructor
public class NoRegisteredArgumentsException
extends RuntimeException {
// ๊ธฐ๋ณธ ์์ฑ์ + ์๋ฌ๋ฉ์์ง๋ฅผ ๋ฐ๋ ์์ฑ์
public NoRegisteredArgumentsException(String message) {
super(message);
}
}
@NoArgsConstructor
public class DuplicatedEmailException
extends RuntimeException {
public DuplicatedEmailException(String message) {
super(message);
}
}
@PostMapping("/sign-in")
public ResponseEntity<LoginResponseDTO> signIn(@Validated @RequestBody LoginRequestDTO dto) {
LoginResponseDTO responseDTO = userService.authenticate(dto);
return ResponseEntity.ok().body(responseDTO);
}
// ๋ก๊ทธ์ธ - ํ์ ์ธ์ฆ
public LoginResponseDTO authenticate(LoginRequestDTO dto) {
// ์ด๋ฉ์ผ์ ํตํด ํ์ ์ ๋ณด ์กฐํ
User user = userRepository.findByEmail(dto.getEmail())
.orElseThrow(() -> new RuntimeException("๊ฐ์
๋ ํ์์ด ์๋๋๋ค!"));
// ํจ์ค์๋ ๊ฒ์ฆ
String rawPassword = dto.getPassword(); // ์
๋ ฅ ๋น๋ฒ
String savedPassword = user.getPassword(); // DB์ ์ ์ฅ๋ ๋น๋ฒ
if (!rawPassword.equals(savedPassword)) {
throw new RuntimeException("๋น๋ฐ๋ฒํธ๊ฐ ํ๋ ธ์ต๋๋ค.");
}
log.info("{}๋ ๋ก๊ทธ์ธ ์ฑ๊ณต!!", user.getEmail());
// ๋ก๊ทธ์ธ ์ฑ๊ณต ํ์ ํด๋ผ์ด์ธํธ์ ๋ญ ๋ฆฌํดํ ๊ฒ์ธ๊ฐ??
// -> JWT๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐ๊ธํด์ค์ผ ํจ.
String token = tokenProvider.createToken(user);
return new LoginResponseDTO(user, token);
}
๐๐ป JWT token