핵심코드

@Override
public ExtendedModelMap addAttribute(String attributeName, @Nullable Object attributeValue) {
    if (attributeValue != null && !containsAttribute(attributeName)) {
        if (WebUtils.isIncludeRequest(getRequest())) {
            Object includeRequestUri = getRequest().getAttribute(INCLUDE_REQUEST_URI_ATTRIBUTE);
            Assert.state(includeRequestUri != null, "Could not determine include request URI: " +
                    "Request attribute [" + INCLUDE_REQUEST_URI_ATTRIBUTE + "] not found");
            getRequest().setAttribute(INCLUDE_PATH_ATTRIBUTE, extractIncludePath((String) includeRequestUri));
        }
        super.addAttribute(attributeName, attributeValue);
    }
    return this;
}

Spring mvc에서 view 데이터 전달 할 때 스프링에서 제공하는 model 객체를 사용하잖아?

네, Spring MVC에서 View에 데이터를 전달하기 위해서 Model 객체를 사용합니다. 이 Model 객체는 Controller에서 View로 전달할 데이터를 저장하는 역할을 합니다. Model 객체는 컨트롤러 메서드의 매개변수로 선언하고, 메서드 내부에서 데이터를 저장할 수 있습니다.

Model 객체는 컨트롤러 메서드에서 생성하지 않고, 스프링에서 자동으로 생성하여 컨트롤러 메서드의 매개변수로 전달합니다. 이러한 방식으로 모델 객체를 사용하면 컨트롤러와 뷰의 결합도를 낮추고, 재사용성과 유지보수성을 높일 수 있습니다.

또한 Model 객체는 Map 인터페이스를 상속하므로, 데이터를 저장할 때 Map의 형태로 저장하며, 이 데이터는 View에서 ${key} 형태로 참조할 수 있습니다. 이렇게 Model 객체를 사용하여 컨트롤러에서 View로 데이터를 전달할 수 있습니다.

[](data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e)

방금 너가 말한 것 처럼 view 에서 ${key} 형태로 사용하잖아? 근데 jsp에서 저런식으로 사용하려면 pageContext나 request, session, application의 속성으로 저장되어 있을 때만 가능한거 아니야?

네, 맞습니다. JSP에서 ${key} 형태로 데이터를 참조하기 위해서는, 해당 데이터가 JSP 내부에서 접근 가능한 영역인 pageContext, request, session, application 등의 객체에 저장되어 있어야 합니다.

Spring MVC에서는 컨트롤러에서 전달하는 Model 객체를 통해 View에서 사용할 데이터를 저장합니다. 이때 Model 객체는 내부적으로 request 객체에 저장되기 때문에, JSP에서는 ${key} 형태로 Model에 저장된 데이터를 참조할 수 있습니다.

즉, Spring MVC에서는 Model 객체를 사용하여 View로 데이터를 전달하면, Model 객체 내부에 저장된 데이터는 request 객체에 저장되어 JSP에서 ${key} 형태로 참조할 수 있게 됩니다. 이때 JSP에서 사용하는 EL(Expression Language)을 이용하여 ${key} 형태로 데이터를 참조할 수 있습니다.

[](data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e)

그럼 혹시 스프링에서 제공하는 model 클래스의 코드를 알 수 있어?

Spring에서 제공하는 Model 인터페이스는 다음과 같이 정의되어 있습니다.

javaCopy code
public interface Model {

    Model addAttribute(String attributeName, @Nullable Object attributeValue);

    Model addAttribute(Object attributeValue);

    Model addAllAttributes(Collection<?> attributeValues);

    Model addAllAttributes(Map<String, ?> attributes);

    Model mergeAttributes(@Nullable Map<String, ?> attributes);

    boolean containsAttribute(String attributeName);

    @Nullable
    Object getAttribute(String attributeName);

    Map<String, Object> asMap();
}

이 Model 인터페이스는 컨트롤러에서 View로 데이터를 전달하기 위한 메서드들을 정의하고 있습니다. 각 메서드의 역할은 다음과 같습니다.