π[Spring] νμ κ°μ - μ μ μμ± API κ°λ°νκΈ°.
1οΈβ£ API μ€κ³νκΈ°.
1οΈβ£ μ¬μ©μλ₯Ό λ±λ‘νκΈ° μν API λͺ μΈ.
- νμ κ°μ
μΉ UIκ° λ¨Όμ λ§λ€μ΄μ Έ μμ΅λλ€.
- κ·Έλ¬λ―λ‘ νλ‘ νΈμλμμ μ¬μ©ν API, μ¦ κΈ°λ₯λ€μ μ±μ λ£μ΄μΌ ν©λλ€.
- νμ κ°μ
μ μν API λͺ
μΈλ λ€μκ³Ό κ°μ΅λλ€.
- HTTP Method : POST
- HTTP Path : /register
- Http Body (JSON)
{ "username": String (null λΆκ°λ₯), "email": String (null λΆκ°λ₯), "password": String (null λΆκ°λ₯), "confirmPassword": String (null λΆκ°λ₯) }
- κ²°κ³Ό λ°ν X (HTTP μν 200OK μ΄λ©΄ μΆ©λΆν¨)
- νμ κ°μ
μ μν API λͺ
μΈλ λ€μκ³Ό κ°μ΅λλ€.
- κ·Έλ¬λ―λ‘ νλ‘ νΈμλμμ μ¬μ©ν API, μ¦ κΈ°λ₯λ€μ μ±μ λ£μ΄μΌ ν©λλ€.
πββοΈ API(Applicatioon Programming Interface)λ 무μμΌκΉ?
2οΈβ£ UserController μμ±νκΈ°.
- μ°μ
UserController
λ₯Ό μμ±ν ν λ΄λΆμ λ€μκ³Ό κ°μ΄ μ½λλ₯Ό μμ±ν΄μ€λλ€.
package com.kobe.signUpApp.controller.user;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@PostMapping("/register")
public void registerUser() {
}
}
3οΈβ£ dto ν¨ν€μ§ -> user ν¨ν€μ§ -> request ν¨ν€μ§ -> UserCreateRequest ν΄λμ€ μμ±νκΈ°
- μλμ κ°μ΄ dto κ°μ²΄μΈ userCreateRequest ν΄λμ€λ₯Ό μμ±ν΄μ€λλ€.
package com.kobe.signUpApp.dto.user.request;
public class UserCreateRequest {
private String username;
private String email;
private String password;
private String confirmPassword;
public String getUsername() {
return username;
}
public String getEmail() {
return email;
}
public String getPassword() {
return password;
}
public String getConfirmPassword() {
return confirmPassword;
}
}
4οΈβ£ UserController λ΄λΆ registerUser
λ©μλ 리ν©ν λ§.
- POST APIμμ λ€μ΄μ¨ HTTP Bodyλ₯Ό μμμ λ§λ
UserCreateRequest
ν΄λμ€λ‘ λ³ννκΈ° μν΄μ@RequestBody
μ΄λ Έν μ΄μ μ μ¬μ©ν΄μ€λλ€.
package com.kobe.signUpApp.controller.user;
import com.kobe.signUpApp.dto.user.request.UserCreateRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@PostMapping("/register")
public void registerUser(@RequestBody UserCreateRequest request) {
}
}
- μ¬κΈ°κΉμ§ APIμ ꡬ쑰λ₯Ό μ‘μμ΅λλ€.
5οΈβ£ μ€μ μ μ κ° μ μ₯λλλ‘ κ΅¬ννκΈ°.
- μ μ λ₯Ό μ μ₯νκΈ° μνμ¬
User
λΌλ κ°μ²΄λ₯Ό λ§λ€μ΄μ μ μ₯ν κ² μ λλ€.- λ€μκ³Ό κ°μ κ³Όμ μ κ±°μ³μ λ§λ€μ΄ λ³Ό κ² μ
λλ€.
- λ¨Όμ , domain ν¨ν€μ§ λ΄λΆμ userλΌλ ν¨ν€μ§λ₯Ό λ§λ€μ΄ μ€λλ€.
- user ν¨ν€κΈ° λ΄λΆμ User ν΄λμ€λ₯Ό λ§λ€μ΄ μ€λλ€.
@PostMapping("/register") public void registerUser(@RequestBody UserCreateRequest request) { }
- μ APIκ° μ¬μ©λμ μ μ κ° μ μ₯λμ΄μΌ νλ€λ©΄ User κ°μ²΄λ₯Ό λ§λ€μ΄μ μ€μ 리μ€νΈμ μ μ₯μ ν κ² μ λλ€.
- λ€μκ³Ό κ°μ κ³Όμ μ κ±°μ³μ λ§λ€μ΄ λ³Ό κ² μ
λλ€.
-
User
μ κ²½μ°μλ λ€μκ³Ό κ°μ νλκ° ν¬ν¨λ©λλ€.- username
- password
- confirmPassword
package com.kobe.signUpApp.domain.user;
public class User {
private String username;
private String email;
private String password;
private String confirmPassword;
public User(
String username,
String email,
String password,
String confirmPassword
) {
if (username == null || username.isBlank()) {
throw new IllegalArgumentException(String.format("μλͺ»λ username(%s)μ΄ λ€μ΄μμ΅λλ€.", username));
} else if (email == null || email.isBlank()) {
throw new IllegalArgumentException(String.format("μλͺ»λ email(%s)μ΄ λ€μ΄μμ΅λλ€.", email));
} else if (password == null || password.isBlank()) {
throw new IllegalArgumentException(String.format("μλͺ»λ password(%s)μ΄ λ€μ΄μμ΅λλ€.", password));
} else if (confirmPassword == null || confirmPassword.isBlank()) {
throw new IllegalArgumentException(String.format("μλͺ»λ confirmPassword(%s)μ΄ λ€μ΄μμ΅λλ€.", confirmPassword));
}
this.username = username;
this.email = email;
this.password = password;
this.confirmPassword = confirmPassword;
}
}
-
User
κ°μ²΄λ₯Ό λ§λ€ λ, μμ±μ(Constructor)λ₯Ό ν΅ν΄ νλμ κ°μ λ£μ΄μ€λλ€.- μ΄ λ,
null
μ΄ λ€μ΄ μμλ μλλ νλλ€μ μν΄ μ‘°κ±΄λ¬Έμ μ¬μ©νμ¬null
κ°μ΄ λ€μ΄μμ λIllegalAragumentException
μμΈλ₯Ό λμ§λλ€(throw
).- μ¦,
null
κ°μ΄ λ€μ΄μ¬ κ²½μ° μμΈκ° λμ Έμ§λ―λ‘User
κ°μ²΄ μμ²΄κ° μμ±λμ§ μκΈ° λλ¬Έμ μ μ₯λ λμ§ μμ΅λλ€. - κ·Έλ¦¬κ³ μμΈλ₯Ό λμ§λ κ³Όμ μμ μ΄λ€ κ°μ΄ λ€μ΄μλμ§ μλ €μ£Όλ©΄ μ’κΈ° λλ¬Έμ
String.format
μ μ¬μ©νμ¬ μμΈμ λ©μΈμ§λ‘ λ΄μ μ μκ²λ μ²λ¦¬νμ΅λλ€.
- μ¦,
- μ΄ λ,
6οΈβ£ User
ν΄λμ€λ₯Ό μΈμ€ν΄μ€ν μμΌ μ μ₯λκ² λ§λ€κΈ°.
-
UserController
ν΄λμ€ μμ λ€μκ³Ό κ°μ΄ μ½λλ₯Ό μμ±ν΄μ€λλ€.
package com.kobe.signUpApp.controller.user;
import com.kobe.signUpApp.domain.user.User;
import com.kobe.signUpApp.dto.user.request.UserCreateRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
public class UserController {
private final List<User> users = new ArrayList<>();
@PostMapping("/register")
public void registerUser(@RequestBody UserCreateRequest request) {
users.add(new User(request.getUsername(), request.getEmail(), request.getPassword(), request.getConfirmPassword()));
}
}
- λ¨Όμ
private final List<User> users = new ArrayList<>();
λ‘ λ¦¬μ€νΈλ₯Ό λ§λ€μ΄ μ€λλ€. -
registerUser
λΌλ ν¨μκ° νΈμΆλλ©΄, μ¦POST/registerUser
κ° νΈμΆλ κ²½μ°users.add(new User(request.getUsername(), request.getEmail(), request.getPassword(), request.getConfirmPassword()));
κ° μ€ν λ©λλ€.- Userλ₯Ό λ§λ€λλ APIλ₯Ό ν΅ν΄ λ€μ΄μ¨ μ μ μ΄λ¦, μ΄λ©μΌ, λΉλ°λ²νΈ, νμΈμ© λΉλ°λ²νΈλ₯Ό μ§μ΄ λ£μ΄μ€λλ€
- μ¦, μ μ½λλ βAPIλ₯Ό ν΅ν΄ λ€μ΄μ¨ μ μ μ΄λ¦, μ΄λ©μΌ, λΉλ°λ²νΈ, νμΈμ© λΉλ°λ²νΈλ₯Ό μ§μ΄ λ£λ μ½λμ λλ€.β
- Userλ₯Ό λ§λ€λλ APIλ₯Ό ν΅ν΄ λ€μ΄μ¨ μ μ μ΄λ¦, μ΄λ©μΌ, λΉλ°λ²νΈ, νμΈμ© λΉλ°λ²νΈλ₯Ό μ§μ΄ λ£μ΄μ€λλ€
7οΈβ£ μμ½.
-
POST/registerUser
κ° νΈμΆλ κ²½μ°,UserController
λ΄λΆμ μλregisterUser
ν¨μκ° μ€νλ©λλ€.- μ΄ λ, JSON νμμΌλ‘
HTTP Body
μusername, email, password, confirmPassword
κ° λ€μ΄μ€λ©΄UserCreateRequest
μ κ°μ²΄μ κ°μΌλ‘ 맡νλκ³public void registerUser(@RequestBody UserCreateRequest request)
μrequest
λ μλ‘μ΄User
λ₯Ό λ§λλλ° μ¬μ©λ©λλ€.- μ΄λ κ² μλ‘κ² λ§λλλ° μ¬μ©λ
User
κ°μ²΄λ 리μ€νΈμ μ μ₯λ©λλ€.-
registerUser
ν¨μκ° μμΈ μμ΄ λλκ² λλ€λ©΄ 200 OKλ₯Ό λ°ννκ² λ©λλ€.
-
- μ΄λ κ² μλ‘κ² λ§λλλ° μ¬μ©λ
- μ΄ λ, JSON νμμΌλ‘