기능을 구현하기 전에 기능에 필요한 API 리스트를 작성해보기로 했다
우리 서비스는 일반 로그인과 소셜 로그인을 지원한다
/api/auth/signup/api/auth/login/api/auth/logout/oauth2/authorization/google/oauth2/authorization/kakao/oauth2/authorization/naver회원가입을 구현하기 위해 회원가입에 필요한 정보를 담은 DTO를 만들었다
/**
* 회원가입 요청에 사용되는 DTO
*/
@Data
public class SignupDto {
private String username;
private String password;
private String name;
public User toEntity(String encodedPassword) {
return User.builder()
.username(username)
.password(encodedPassword)
.name(name)
.provider("NONE")
.role(Role.ROLE_USER)
.build();
}
}
다음은 회원가입 로직이 있는 Service를 만들어보자
앞으로 로그인, 토큰 재발급 기능 등을 AuthService에서 관리할 예정이다
signupDto에서 아이디를 획득하여 DB에 회원이 존재하는지 확인하고 DB에 저장한다
@Service
@RequiredArgsConstructor
public class AuthService {
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;
// 회원가입
@Transactional
public void signup(SignupDto signupDto) {
// DB에 입력한 username이 존재하는지 확인
if (userRepository.existsByUsername(signupDto.getUsername())) {
throw new RuntimeException("이미 가입되어 있는 유저입니다.");
}
// 없으면 DB에 회원 저장
User user = signupDto.toEntity(passwordEncoder.encode(signupDto.getPassword()));
userRepository.save(user);
}
}
사용자가 /api/auth/signup 에서 정보를 입력하면, 정상적인 경우 "회원가입 성공"을 보여준다
@RestController
@RequestMapping("/api/auth")
@RequiredArgsConstructor
public class AuthController {
private final AuthService authService;
@PostMapping("/signup")
public ResponseEntity<String> signup(@RequestBody SignupDto signupDto) {
authService.signup(signupDto);
return ResponseEntity.ok("회원가입 성공");
}
}
Postman에서 테스트
body에 JSON으로 회원가입 정보를 넣어서 요청

DB에도 잘 저장되는 것을 볼 수 있다

다음은 로그인을 구현할 것이다
로그인하면 JWT 토큰을 발급해야 하기 때문에 JWT 설정을 할 예정