<aside> 💡 목차
</aside>
파이썬에서는 Dictionary, Java 에선 Map의 구조를 들어보았을 것이다. JSON은 JavaScript Object Notation으로, Javascript의 Object, 즉, 객체에 정보를 담는 표현이다.
JSON은 Key-Value의 구조로 하여금 모든 정보를 식별하고 Value 자체가 또 하나의 Key-Value 자료형이 될 수도 있다.
데이터를 관리하고 처리하는 역할, 애플리케이션의 비즈니스 로직을 포함하여 데이터베이스나 다른 저장소에서 데이터를 가져오거나 저장할 때에도 Model을 사용한다. Controlller가 요청한 데이터를 전달하고, View에 표시할 데이터를 포함하기도 한다.
public class User {
private Long id;
private String name;
private String email;
// Constructor, Getters, and Setters
public User(Long id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
// Getter, Setter 생략
}
User.java
Model → 데이터를 담는 모델 객체
후에 model.addAttribute
를 통해 속성을 추가하는데, User 객체는 그 addAttribute의 Value로써 전달될 수 있고, View에서, ${user.id}, ${user.name}, ${user.email} 과 같이 접근해 해당 사용자의 데이터를 보여줄 수 있다.
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.ArrayList;
@Service
public class UserService {
private List<User> users = new ArrayList<>();
public List<User> getAllUsers() {
return users;
}
public void addUser(User user) {
users.add(user);
}
// 비즈니스 로직...
}
UserService.java
모델을 위한 Service 레이어 → 비즈니스 로직 처리
이건 내가 궁금했던 점이다. User 객체가 있고, 이 객체가 한 사용자를 모델링 한 것이라고 하면, 여러 사용자는 다음과 같이 나타낼 수 있을 것이다.
User user1 = new User();
User user2 = new User();
User user3 = new User();
하지만 상식적으로 모든 요청에 대해 이런 식으로 처리하면 굳이 WAS를 사용할 이유가 없다. 실제로는 다음과 같이 처리한다.
Spring은 각 요청에 대해 별도의 스레드를 생성해 Controller 메소드를 처리한다. 하나의 요청에서 생성된 User 객체는 다른 요청에서 만들어진 User 객체와 독립적이다.
즉, A 사용자가 회원가입을 요청하면 A의 User 객체가 만들어지고, B 사용자가 동일한 메소드를 호출해 User 객체를 생성한다고 해도, 두 객체는 서로 다른 스레드에 존재하여 서로 간섭하지 않는다.
다음과 같은 메소드가 존재한다고 해보자.
@PostMapping("/register")
public String registerUser(@RequestParam String name, @RequestParam String email) {
User user = new User(null, name, email);
userService.save(user);
return "redirect:/success";
}
A 사용자가 registerUser 메소드를 호출하면 User 객체가 생성되고 그 객체는 A 요청으로 인해 열린 스레드에만 속한다.