<aside> 💡 목차

</aside>

I. 스프링 MVC

JSON이란?

파이썬에서는 Dictionary, Java 에선 Map의 구조를 들어보았을 것이다. JSON은 JavaScript Object Notation으로, Javascript의 Object, 즉, 객체에 정보를 담는 표현이다.

JSON은 Key-Value의 구조로 하여금 모든 정보를 식별하고 Value 자체가 또 하나의 Key-Value 자료형이 될 수도 있다.

Model, View, Controller

image.png

image.png

Model

데이터를 관리하고 처리하는 역할, 애플리케이션의 비즈니스 로직을 포함하여 데이터베이스나 다른 저장소에서 데이터를 가져오거나 저장할 때에도 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 요청으로 인해 열린 스레드에만 속한다.