반응형

윈도우만 쓰면 몰라도 나처럼 아이맥 환경에서 visual studio를 사용하면 망할 매직 마우스와 망할 MS Visual Studio의 환장 콜라보로 소스가 지멋대로 확대 축소 난리 댄스를 춘다.


어찌나 짜증나는지
MSSQL도 마찬가지인데..ㅡㅡ 일단 Visual Studio부터 해결 방법을 찾아냈다.

아래 링크에서 extension을 다운 받은 후 윈도우에서 더블클릭 하여 실행하면 한동안 설치 과정을 거치고 visual studio를 restart하면 
이렇게 옵션에서 환경설정을 바꿀 수 있는 모습을 발견할 수 있다.

https://marketplace.visualstudio.com/items?itemName=MadsKristensen.Tweaks2022 

 

Tweaks 2022 - Visual Studio Marketplace

Extension for Visual Studio - A collection of minor fixes and tweaks for Visual Studio to reduce the paper cuts and make you a happier developer

marketplace.visualstudio.com

보다시피 mouse wheel zoom이 기본 False 로 셋팅되어 있다.

반응형
Posted by Hippalus
,

반응형

appsettings.json에 db connection string을 적어두고 이를 가지고와 db connection을 맺어줄 때 사용되는 코드

            var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())

           .AddJsonFile("appsettings.json", optional: false);

            IConfiguration configuration = builder.Build();

            string defaultConnectionString = configuration.GetValue<string>("ConnectionStrings:DEVDB");

            using (var conn = new SqlConnection(defaultConnectionString))   

           {

                conn.Open();

                using (var cmd = new SqlCommand())

                {

                    cmd.Connection = conn;

                    cmd.CommandText = @"

                                    SELECT

                                        M.M_USERID, M.M_USERNAME, M.M_REGDATE

                                        , MD.MD_ADDRESS, MD.MD_EMAIL, ....., JOBCD.CDNAME AS JOBCDNAME

                                    FROM 

                                        S_MEMBER AS M

                                        INNER JOIN S_MEMBERDETAIL AS MD ON M.M_IDX = MD.M_IDX AND MD.MD_DEL = 0

                                        INNER JOIN S_CODE AS JOBCD ON MD.MD_JOBCD = JOBCD.CDSUB

                                        INNER JOIN S_CODE AS JOBSUBCD ON MD.MD_JOBSUBCD = JOBSUBCD.CDSUB

                                    WHERE

                                        M.M_IDX = @M_IDX

                                        AND M.M_DEL = 0

                                    ";

 

                    cmd.Parameters.AddWithValue("@M_IDX", idx);

                    var reader = cmd.ExecuteReader();

                    reader.Read();

                    var member = new AdminMember();

                    member.Idx = idx;

                    member.UserId = (string)reader["M_USERID"];

                    member.UserName = (string)reader["M_USERNAME"];

                     ......   

                    member.DetailJobSubCd = (string)reader["MD_JOBSUBCD"];

                    member.DetailContent = (string)reader["MD_CONTENT"];

                    reader.Close();

                    return member;

                }

                return null;

            }

반응형
Posted by Hippalus
,

반응형

보통 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
,

반응형

보통 DB Connection string은 appsettings.Development.json에 보관하여 이용한다.
 
"ConnectionStrings": {
    "DefaultConnection": "Data Source=myserverip;Initial Catalog=mydb;User ID=myid;Password=mypwd;"
  }

dbContext 방식으로 된 예제들은 많지만 ADO.NET으로 가져오려면 막막해진다.
물론 MS 문서에 버젓이 있지만 늘 그렇듯 생경한 느낌을 지울 수 없고 매번 바꿔대어 찾기가 힘들다.
https://learn.microsoft.com/ko-kr/aspnet/core/fundamentals/configuration/?view=aspnetcore-7.0

방식은 이러하다.
기본 프로젝트를 기준으로 
private readonly IConfiguration _config; 를 선언해주고
IConfiguration config를 넘겨준 후 
_config.GetSection("ConnectionStrings").GetSection("DefaultConnection").Value 로 불러와서 사용하면 그만이다.


namespace Sample.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IConfiguration _config;

        public HomeController(ILogger<HomeController> logger, IConfiguration config)
        {
            _logger = logger;
            _config = config;
        }

        public IActionResult Index()
        {
            return View();
        }

        public IActionResult TicketList()
        {
            var dt = new DataTable();

            string strConnection = _config.GetSection("ConnectionStrings").GetSection("DefaultConnection").Value;

            using (var conn = new SqlConnection(strConnection))
            {
                conn.Open();

                using (var cmd = new SqlCommand())
                {
                    int nIDX = 100;

                    cmd.Connection = conn;
                    cmd.CommandText = @"
                                        SELECT
                                            *
                                        FROM
                                            IN_TABLENAME
                                        WHERE
                                            IDX > @idx
                                        ORDER BY
                                            IDX DESC
                                        ";

                    cmd.Parameters.AddWithValue("@idx", nIDX);

                    var reader = cmd.ExecuteReader();

                    dt.Load(reader);
                }
            }

            ViewData["dt"] = dt;

            return View();
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }
}

반응형
Posted by Hippalus
,

반응형

DB First방식으로 프로젝트를 진행해보고자 이리저리 알아보고 시도한 결과를 남기고자 한다.

먼저 셋팅을 하려면 nuget package manage에서 필요한 패키지를 설치하여야 한다.
예전 오래된 Visual Studio와 달리 2022에선 종속성에서 마우스 우측을 눌러 NuGet 패키지 관리메뉴를 호출해야 한다.

1. Microsoft.EntityFrameworkCore.Tools를 찾아 설치


2. DB엔진에 따라 추가로 설치해야 할 provider 다른데 아래처럼 각각 사용하고 있는 DB엔진에 맞는 provider를 추가로 설치

MSSQL : Microsoft.EntityFrameworkCore.SqlServer
MySQL : MySql.Data.EntityFrameworkCore
Oracle : Oracle.EntityFrameworkCore
SQLite : Microsoft.EntityFrameworkCore.Sqlite

이처럼 패키지를 설치하고 appsettings.json파일로 가서 DB Connection정보를 입력해 둔다.

  "CoreCodeFirst": {    "DBType":
    "mssql",
    "ConnectionString": "Server=dbip;DataBase=dbname;UId=myid;pwd=mypwd"
},

저장해주고
이제 DB First의 거진 마지막 단계인 모델(Model)과 컨텍스트 생성하기 단계.
패키지관리자콘솔 이란걸 실행해야 하는데 어디있는지 모르겠다 -_-
검색해보니 도구 > NuGet 패키지 관리자 > 패키지 관리자 콘솔로 불러올 수 있었다.

불러온 패키지 관리자 콘솔에서 아래처럼 입력 후 엔터를 치면 
Scaffold-DbContext 'Data Source=dbip;Initial Catalog=dbname;UId=myid;pwd=mypwd' Microsoft.EntityFrameworkCore.SqlServer

Build started...

Build succeeded.

가 나오더니
이런 에러가 튀어나온다.

A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - 신뢰되지 않은 기관에서 인증서 체인을 발급했습니다.)

아래처럼 명령어를 수정하여 실행하면
Scaffold-DbContext 'Data Source=dbip;Initial Catalog=dbname;TrustServerCertificate=True;UId=myid;pwd=mypwd' Microsoft.EntityFrameworkCore.SqlServer

Build started...

Build succeeded.

이후 오류 없이 실행되며 프로젝트에 컨텍스트가 생성됨을 발견할 수 있다.

반응형
Posted by Hippalus
,