반응형

보통 DB로직을 Model에 넣고 Controller로 성공 여부를 리턴해줄 때 1, 0같은 결과처리 상태를 넘기기도 하지만
성공/실패 여부와 함께 메세지를 함께 넘겨줄 땐 json을 이용해볼 수 있다.

오류가 났을 땐 보안상 오류를 이용자에게 보여주지 않는게 방법이겠으나 어찌 비지니스 로직에 기능오류와 성공만 존재하겠는가?
정상 처리임에도 작업을 수행할 수 없는 상황이 발생할 수 있다.
예를 들면 좌석 예매 같은 상황은 프론트 단에서 진입시점에 좌석이 있었지만 결제 과정에서 좌석이 모두 소진될 수 있는데 이때 무턱대고 실패로만 결과를 리턴한다면 이용자는 기능 오류인지 아니면 더이상 예매를 할 수 없는 상황인지 알 수 있는 방법이 사라지는 상황에 놓이게 된다.

방법은 이러하다.
먼저 모델에 처리 함수를 선언할 때 리턴형을 string형으로 선언한다.
public string functionProc()

그리고 결과값에 성공이면 nResult에 1을 대입시키고 strMsg에 성공하였습니다. 같은 값을 대입시킨다.
실패라면 nResult에 0 또는 -1 같은 값을 대입시키고 strMsg에 실패하였습니다. 같은 값을 대입시킨다.
var jsonData = new { result = nResult, msg = strMsg };
타이핑 해보면 빨강줄이 뜰텐데 ctrl+.을 눌러 아래 처럼 nuget을 통해 추가해주자.
using Newtonsoft.Json;

new로 생성하였다면 이럴 JsonConvert를 사용하여 string으로 바꿔준 후 이를 return해주면 끝이다.
string jsonString = JsonConvert.SerializeObject(jsonData);
return jsonString;

물론 db insert나 update처럼 처리 과정에서 이용자의 데이터 오류로 인한 상세 오류를 보여주고 싶다면 try, catch를 사용하여 Exception의 Message를 보내줘도 될 것이다.
이는 이용자에게 보여주기보단 개발시 편리함을 위해 주로 디버깅시 사용하게 되지 싶다.
catch (Exception e)
{
    tran.Rollback();

    var jsonData = new { result = -1, msg = e.Message };
    jsonString = JsonConvert.SerializeObject(jsonData);
    //return -1;
}

모델이 완성되었으면 Controller 차례
다른 잡다한것들도 포함시켰는데 단순하게 모델 호출시 함수의 리턴값을 result란 변수로 받아낸 후
이를 JObject를 이용해 json형태로 파싱하면 된다.
일단 파싱이 되었다면 그다음엔 그냥 모델에서 넘겨준 json의 인자키값으로 비교만 하면 그만이다.
if (ModelState.IsValid)                                                                                                                                                  
{
    var result = model.functionProc();
    var jsonData = JObject.Parse(result);

    if (Convert.ToInt32(jsonData["result"]) == 1)
    {
        return RedirectToAction("Detail", "Member", new {idx=model.Idx});
    }

    ModelState.AddModelError(string.Empty, Convert.ToString(jsonData["msg"]));
}
마찬가지로 타이핑 해보면 빨강줄이 뜰텐데 ctrl+.을 눌러 아래 처럼 추가해주자.
using Newtonsoft.Json.Linq;

물론 이렇게 처리 안해도 된다.
모델의 멤버변수에 값을 넣고 이를 이용해도 된다.
또는 json을 사용안하고 그냥 콤마로 첫번째 콤마값은 결과 그다음은 메세지 처럼 단순하게 처리해도 된다.
하지만 이럴 경우 프로젝트의 가독성이 불량해질 수 있기에 json방식을 추천하고 싶다.
생각해보라 수많은 함수의 결과값들이 존재하고 또 함수마다 수많은 콤마로 이루어진 결과값들을 보면 첫번째는 무엇이고 두번째는 무엇, 세번째, 네번째..... 만든 사람이야 알아먹겠지만 인수받은 새로운 작업자는 머리가 아파오게 된다.

참고할만한 게시글은 여기를 보면 좋다.
https://www.csharpstudy.com/Data/Json-beautifier.aspx

using System;
using System.Windows.Forms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;  // JValue

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 테스트용 JSON string 만들기
            var p = new { Id = 1, Name = "Alex", Address = new { City = "Redmond", State = "WA", Zip = "98052" } };
            string jsonString = JsonConvert.SerializeObject(p);
            txtOriginal.Text = jsonString;
        }

        private void btnBeautifier_Click(object sender, EventArgs e)
        {
            // JSON string을 보기 좋게 만듦
            string jsonString = txtOriginal.Text;
            txtBeautified.Text = Beautify(jsonString);
        }

        // 방법2: JToken.ToString()을 이용하는 방법
        private string Beautify(string jsonString)
        {             
            string beautifiedJson = JValue.Parse(jsonString).ToString(Formatting.Indented);
            return beautifiedJson;
        }
        
        // 방법1: SerializeObject() Formatting을 이용하는 방법
        private string Beautify_AnotherWay(string jsonString)
        {
            dynamic json = JsonConvert.DeserializeObject(jsonString);
            return JsonConvert.SerializeObject(json, Formatting.Indented);
        }
    }
}

 

JSON Beautifier - C# 프로그래밍 배우기 (Learn C# Programming)

JSON String Beautifier JSON String을 화면에 표시할 때, 라인 및 들여쓰기를 제대로 하지 않으면 읽기 어려운 경우가 있다. 예를 들어, 웹서비스 등의 외부 소스로부터 JSON String을 전달 받은 경우, 일반적

www.csharpstudy.com

 

반응형
Posted by Hippalus
,