ASP.NET 기반의 다층 구조 주문 시스템 프로젝트, 바이두 API 통합, 관리자 및 상인 UI 포함

ASP.NET을 활용한 주문 시스템 개발 사례

최근 ASP.NET을 사용한 주문 시스템 프로젝트를 완성하고 발표를 마쳤습니다. 이 프로젝트는 실용적이며 다양한 기술 요소들을 결합하여 만들어졌습니다.

1. 시스템 아키텍처 - 다층 구조

클래식한 다층 구조를 채택했습니다. 즉, 프레젠테이션 레이어(Presentation Layer), 비즈니스 로직 레이어(Business Logic Layer), 데이터 액세스 레이어(Data Access Layer)로 구성되어 있습니다.

1.1 프레젠테이션 레이어

사용자와의 상호 작용을 담당하며 데이터를 표시하고 사용자 입력을 처리합니다. ASP.NET에서는 .aspx와 .aspx.cs 파일로 구현됩니다. 예를 들어, 메뉴 목록을 보여주는 페이지 MenuList.aspx는 다음과 같습니다:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MenuList.aspx.cs" Inherits="MenuList" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>메뉴 목록</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField DataField="ItemName" HeaderText="메뉴 이름" />
                    <asp:BoundField DataField="Cost" HeaderText="가격" />
                </Columns>
            </asp:GridView>
        </div>
    </form>
</body>
</html>

해당 코드에서 GridView를 통해 메뉴 데이터를 표시합니다. 관련된 C# 코드는 다음과 같습니다:

using System;
using System.Data;
using BL;

public partial class MenuList : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            MenuBL menuBL = new MenuBL();
            DataTable dt = menuBL.RetrieveAllMenus();
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    }
}

위 코드는 페이지 초기 로드 시 비즈니스 로직 레이어에서 데이터를 가져와 GridView에 바인딩합니다.

1.2 비즈니스 로직 레이어

핵심 비즈니스 규칙을 처리하는 부분입니다. 예를 들어, 메뉴 관련 비즈니스 로직은 MenuBL.cs에 정의됩니다:

using System;
using System.Data;
using DL;

public class MenuBL
{
    private readonly MenuDL _menuDL = new MenuDL();

    public DataTable RetrieveAllMenus()
    {
        return _menuDL.FetchMenus();
    }

    public bool AddMenuItem(string itemName, decimal cost)
    {
        if (cost <= 0)
        {
            return false; // 가격이 음수거나 0일 경우 추가 불가
        }
        return _menuDL.InsertMenuItem(itemName, cost);
    }
}

이곳에서는 데이터 액세스 레이어와 연결되며 기본적인 유효성 검사를 수행합니다.

1.3 데이터 액세스 레이어

데이터베이스와의 상호작용을 담당합니다. 다음은 MenuDL.cs의 일부입니다:

using System;
using System.Data;
using System.Data.SqlClient;

public class MenuDL
{
    private string _connectionString = "your_connection_string";

    public DataTable FetchMenus()
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        {
            string sql = "SELECT ItemName, Cost FROM Menus";
            SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
            DataTable table = new DataTable();
            adapter.Fill(table);
            return table;
        }
    }

    public bool InsertMenuItem(string itemName, decimal cost)
    {
        using (SqlConnection conn = new SqlConnection(_connectionString))
        {
            string sql = "INSERT INTO Menus (ItemName, Cost) VALUES (@ItemName, @Cost)";
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.Parameters.AddWithValue("@ItemName", itemName);
            cmd.Parameters.AddWithValue("@Cost", cost);

            try
            {
                conn.Open();
                int rowsAffected = cmd.ExecuteNonQuery();
                return rowsAffected > 0;
            }
            catch (Exception)
            {
                return false;
            }
        }
    }
}

데이터베이스에 대한 CRUD 작업을 수행하기 위해 SQL 문과 ADO.NET 클래스를 활용합니다.

2. 바이두 API 통합

시스템에 차별화된 특징을 부여하기 위해 바이두 지도 API를 도입하여 식당 위치 표시와 배달 범위 계획을 제공합니다.

HTML 내부에서 바이두 지도 JavaScript API를 로드합니다:

<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=your_ak"></script>

그런 후 해당 페이지에서 식당의 위도와 경도를 지정하여 지도에 표시합니다:

using System;

public partial class RestaurantMap : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        double latitude = 37.56; // 예제 위도
        double longitude = 126.97; // 예제 경도

        string script = @"
            var map = new BMap.Map('mapContainer');
            var point = new BMap.Point(" + longitude + ", " + latitude + @");
            map.centerAndZoom(point, 15);
            var marker = new BMap.Marker(point);
            map.addOverlay(marker);";

        Page.ClientScript.RegisterStartupScript(this.GetType(), "MapInit", script, true);
    }
}

위 코드는 페이지 로드 시 지도에 식당 위치를 표시합니다.

3. 듀얼 플랫폼 설계 - 관리자 및 상인 인터페이스

3.1 관리자 패널

관리자는 전체 시스템을 관리할 수 있으며, 메뉴 관리, 상인 관리, 주문 관리 등을 담당합니다. 예를 들어, 관리자 로그인 검증 코드는 다음과 같습니다:

using System;
using System.Data;
using System.Data.SqlClient;

public partial class AdminLogin : System.Web.UI.Page
{
    protected void btnLogin_Click(object sender, EventArgs e)
    {
        string username = txtUsername.Text;
        string password = txtPassword.Text;

        using (SqlConnection conn = new SqlConnection("your_connection_string"))
        {
            string query = "SELECT COUNT(*) FROM Administrators WHERE Username = @Username AND Password = @Password";
            SqlCommand cmd = new SqlCommand(query, conn);
            cmd.Parameters.AddWithValue("@Username", username);
            cmd.Parameters.AddWithValue("@Password", password);

            try
            {
                conn.Open();
                int count = (int)cmd.ExecuteScalar();
                if (count > 0)
                {
                    Response.Redirect("AdminDashboard.aspx");
                }
                else
                {
                    lblError.Text = "잘못된 사용자명 또는 비밀번호";
                }
            }
            catch (Exception ex)
            {
                lblError.Text = "로그인 실패: " + ex.Message;
            }
        }
    }
}

데이터베이스 쿼리를 통해 관리자의 자격 증명을 확인하고 성공하면 대시보드로 리다이렉션합니다.

3.2 상인 전용 인터페이스

상인은 자신의 메뉴 및 주문 정보를 관리할 수 있습니다. 예를 들어, 상인이 자신의 주문을 확인하는 페이지 OrderView.aspx는 다음과 같습니다:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="OrderView.aspx.cs" Inherits="OrderView" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>주문 보기</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField DataField="OrderID" HeaderText="주문 번호" />
                    <asp:BoundField DataField="OrderDate" HeaderText="주문 날짜" />
                    <asp:BoundField DataField="Status" HeaderText="주문 상태" />
                </Columns>
            </asp:GridView>
        </div>
    </form>
</body>
</html>

코드 뒤쪽에서 현재 상인의 주문 데이터를 가져옵니다:

using System;
using System.Data;
using BL;

public partial class OrderView : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            int vendorId = GetCurrentVendorId();
            OrderBL orderBL = new OrderBL();
            DataTable dt = orderBL.GetOrdersByVendor(vendorId);
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }
    }

    private int GetCurrentVendorId()
    {
        // 실제 상황에서는 세션 등에서 현재 상인 ID를 가져옴
        return 1;
    }
}

이러한 방식으로 상인은 자신에게 속한 주문을 쉽게 확인할 수 있습니다.

태그: ASP.NET C# BaiduAPI

8월 17일 14:37에 게시됨