본문 바로가기
Skills/Asp.net

[Asp.net] PostBack 시에도 데이터 유실을 방지하는 방법

by Hoseok 2023. 11. 21.
728x90
반응형

 

 

ASP.NET에서 데이터가 손실되는 경우

 

ASP.NET 웹 프로젝트에서 콤보박스나, grid lookup 등에 DB에서 받아온 데이터를 바인딩하는 코드가 있다고 하면,

 

페이지를 넘기거나 할 때, 컨트롤의 데이터가 손실되는 경우가 발생합니다.

 

왜 그런 일이 벌어지는 걸까요?

 

바로 PostBack 때문입니다.

 

PostBack이란?

 

PostBack은 웹 애플리케이션에서 사용자의 요청에 대한 서버 측 응답을 다시 클라이언트 측으로 보내는 프로세스를 의미합니다. 

 

사용자가 웹 페이지에서 어떤 상호 작용을 하면, 페이지는 변경된 상태로 다시 서버에 전송되고, 서버는 이 요청을 처리한 후 다시 클라이언트에게 응답을 보냅니다. 

 

이로써 웹 애플리케이션은 사용자와 상호 작용하며 데이터를 표시하고 업데이트할 수 있게 됩니다.

 

하지만 포스트백 과정에서 컨트롤이 초기화되는 과정을 거치게 되며, 그 안에 바인딩되었던 데이터도 초기화되게 됩니다.

 

어떻게 해야 PostBack 시에도 데이터를 유지할 수 있을까?

 

4가지 방법이 존재합니다.

 

1. 컨트롤 상태 보존

 

ASP.NET에서는 EnableViewState 속성을 활용하여 컨트롤 상태를 보존할 수 있습니다. 

 

이렇게 하면 PostBack 시에 컨트롤의 상태가 유지되어 사용자의 입력 값이 사라지지 않습니다.

 

또한, 컨트롤의 상태가 페이지의 HTML에 포함되어 클라이언트 측으로 전송됩니다.

 

단점으로는 부하가 심해지고, input의 hidden 형태로 들어가기 때문에 데이터 전송량이 증가합니다.

 

2. 데이터 저장 및 복원


데이터를 PostBack 시에 Session 에 저장하고, 이를 사용하여 데이터를 다시 로드하여 컨트롤에 바인딩합니다.

 

이를 통해 데이터의 지속성을 보장할 수 있습니다.

 

3. 데이터 바인딩 관리

컨트롤의 데이터 바인딩이 PostBack 중에 초기화되는 경우, 데이터 바인딩을 다시 수행하도록 구성하는 방법입니다.

 

예를 들어, 그리드 뷰나 드롭다운 목록과 같은 컨트롤의 DataSource를 다시 설정하여 데이터를 다시 바인딩할 수 있습니다.

4. 클라이언트 측 스크립트

클라이언트 측 JavaScript를 사용하여 PostBack 시에 컨트롤의 상태를 보존하고 데이터를 관리할 수 있습니다.

 

예를 들어, 사용자가 페이지를 PostBack 하면 클라이언트 측 스크립트를 사용하여 컨트롤의 상태를 저장하고,

 

페이지가 다시 로드될 때 해당 상태를 복원할 수 있습니다.

 

코드 설명

 

위에서 설명한 방법 중 가장 적합한 2, 3번을 사용한 코드입니다.

 

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        InitGridView(dxGridView);
        Session["GridData"] = null;
        DataTable dt = UserDB.GetUserList();

        dxGridView.DataSource = dt;
        dxGridView.DataBind();
        dxGridView.PageIndex = 0;

        DataBind(ASPxGridLookupO1);
        DataBind(ASPxGridLookupO2);
    }
    else
    {
        DataTable dt;
        dt = Session["GridLookUp"] as DataTable;
        if (dt != null)
        {
            ASPxGridLookupO1.DataSource = dt;
            ASPxGridLookupO2.DataSource = dt;
        }

        else
        {
            DataBind(ASPxGridLookupO1);
        	DataBind(ASPxGridLookupO2);
        }
    }
}

 

 

 

Page_Load 이벤트 핸들러페이지가 로드될 때 실행됩니다. 

IsPostBack 속성을 사용하여 현재 페이지 요청이 PostBack인지 여부를 확인합니다. 

 

PostBack은 페이지가 자체를 다시 로드하는 경우를 나타냅니다.

 

페이지 초기화 (첫 번째 조건문)


InitGridView(dxGridView): dxGridView라고 명명된 그리드 뷰 컨트롤을 초기화하는 함수를 호출합니다.


Session["GridData"]를 초기화합니다.


UserDB.GetUserList()를 사용하여 사용자 데이터를 가져와서 그리드 뷰에 데이터를 바인딩합니다.


그리드 뷰의 데이터를 초기화하고 페이지 인덱스를 0으로 설정합니다.


DataBind(ASPxGridLookupO1) 및 DataBind(ASPxGridLookupO2)를 사용하여,

 

두 개의 그리드 룩업 컨트롤을 데이터로 바인딩합니다.


POSTBACK 처리 (두 번째 조건문)


페이지가 POSTBACK되면, 세션에서 "GridLookUp" 키로 저장된 데이터를 가져옵니다.


가져온 데이터가 있으면, 두 개의 그리드 룩업 컨트롤인 ASPxGridLookupO1 및 ASPxGridLookupO2에 데이터를 바인딩합니다.


가져온 데이터가 없는 경우, 

 

다시 DataBind(ASPxGridLookupO1) 및 DataBind(ASPxGridLookupO2)를 사용하여 두 개의 그리드 룩업 컨트롤을 데이터로 바인딩합니다.

 

결론

 

이처럼 포스트백 시에 데이터가 유실되는 문제를 방지하기 위해,

 

세션에 값을 저장하고 포스트백 시에 바인딩, 없을 시 DB 접근해서 데이터 바인딩하여 문제를 해결할 수 있습니다.

 

 

728x90
반응형