작업한 코드
@Getter
@NoArgsConstructor
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String username;
@Column(nullable = false)
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
}
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
}
@RequiredArgsConstructor
@Service
public class UserService {
private final UserRepository userRepository;
@Transactional
public void createUser(CreateUserRequest createUserRequest) {
String username = createUserRequest.getUsername();
Optional<User> found = userRepository.findByUsername(username);
if (found.isPresent()) {
throw new IllegalArgumentException("중복된 이름입니다.");
}
User user = new User(createUserRequest.getUsername(), createUserRequest.getPassword());
userRepository.save(user);
}
}
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@PostMapping("/api/signup")
public CreateUserResponse createUser(@RequestBody @Valid CreateUserRequest createUserRequest) {
userService.createUser(createUserRequest);
return new CreateUserResponse(200L, "회원가입 완료");
}
}
@Getter
public class CreateUserRequest {
@Pattern(regexp = "^(?=.*[a-z])(?=.*[0-9])[a-z0-9]{4,10}$", message = "최소 4자 이상, 10자 이하이며 알파벳 소문자(a~z), 숫자(0~9)로 구성되어야 합니다.")
private String username;
@Pattern(regexp = "^(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]{8,15}$", message = "최소 8자 이상, 15자 이하이며 알파벳 대소문자(a~z, A~Z), 숫자(0~9)로 구성되어야 합니다.")
private String password;
}
@Getter
public class CreateUserResponse {
private final Long statusCode;
private final String statusMessage;
public CreateUserResponse(Long statusCode, String statusMessage) {
this.statusCode = statusCode;
this.statusMessage = statusMessage;
}
}
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-validation'