반응형

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
,

반응형

중국 앱들 때문에 애플에서 특단의 조치를 취한지 어언 석달이 지났나?
클립보드에 내용이 있는 상태에서 금융앱들을 실행하면 붙여넣기를 허용하겠느냐라는 짜증나는 안내창이 반겨준다.
이번 패치에 해결됐나 싶었는데 여전히 해당 증상이 나타나길래 애플넘들 정신 못차리고 있구나 싶었는데 설정에서 해결할 수 있는 방법이 있었다.

먼저 환경설정 톱니바퀴 아이콘을 터치해서 설정으로 들어간 후
짜증나는 붙여넣기 허용 안내가 뜨는 앱들을 일일이 들어가서
(뭔 카카오 시리즈가 이리 많냐 ㅡㅡ)

참고로 나는 설정 > 토스를 선택했다.
토스 설정으로 들어가면 다른 앱에서 붙여넣기가 기본 묻기 상태로 되어 있다.

이를 선택하면 묻기, 거부, 허용이 있는데 허용을 선택해준다.

이제 앱에서 다시는 허용하겠느냐라는 안내창을 볼 일이 없다.
중국은 참 여러모로 대단하다.
우한 폐렴 (코로나 19)도 그렇고 앱에서 개인정보 탈취하는 것도 그렇고
보이스피싱에 
도대체 인류에 도움이 되는 일이 있기나 하는 것인지

반응형
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
,

반응형

java di를 위한 spring 플러그인 설치를 하기위해 이클립스 메뉴의 help > eclips marketplace를 눌러 search에 spring을 입력해본다.
그리고 boot 플러그인이 아닌 Spring Tools 3 Add-On for Spring Tools 4 3.9.22.RELEASE를 설치해본다.

초기 설정대로 전체 체크된 상태로 Confirm을 누르면 설치가 되다가 오류가 발생한다.

대충 이런 오류인데
install Cannot complete the install because one or more required items could not be found.
구글에 이렇게 검색해보니 eclips market place spiring install Cannot complete the install because one or more required items could not be found.
이런 결과 페이지를 발견할 수 있었다.
https://download.eclipse.org/releases/2021-09

 

Eclipse software repository | The Eclipse Foundation

The Eclipse Foundation - home to a global community, the Eclipse IDE, Jakarta EE and over 360 open source projects, including runtimes, tools and frameworks.

download.eclipse.org

대략 내용은 Window의 Preferences의 Install/update로 가서 사이트를 추가하란 내용

Probably this feature is expecting you to be installing in the "Eclipse IDE for Enterprise Java and Web Developers" where this "missing" feature is already installed. In your Window -> Preferences -> Install/Update -> Available Software Sites is https://download.eclipse.org/releases/2021-09 in the list and checked (enabled)? In the worst case, use Help -> Install New Software..., choose/enter https://download.eclipse.org/releases/2021-09, look for "Eclipse XML Editors and Tools" and install that first.

시키는대로 하고 다시 처음부터 Spring 입력하고 인스톨하고 하니 설치는 되었는데.
여전히  Select wizard메뉴에서 Spring이 나오지 않았다.
뭐지 싶어서 그냥 멍때리니 이윽고 Trust란 아래 창이 뜨길래 일단 그냥 Trust ok때리니 

eclips를 재실행한다란 alert이 뜨고 재실행 해보고

wizard메뉴로가니 그제서야 Spring이 나오더란

MS나 Apple은 통합환경에서 덜그덕 거림이 업는데 Java, Android 진영은 이런게 사람을 괴롭힌다.

반응형
Posted by Hippalus
,

반응형

흔히 부르는 햄버거 메뉴를 눌렀을 때 이벤트 감지를 알려주는 강좌를 보고 따라 했음에도 햄버거 메뉴가 동작 자체를 안하는 문제를 발견했다.
        leading: IconButton(
          icon: Icon(Icons.menu),
          onPressed: () {
            print("Menu Call!!!!");
          },
        ),
강좌에서 동작했던 코드인데
아래처럼 해야만 동작했다.
        leading: Builder(
          builder: (context) => IconButton(
            icon: new Icon(Icons.settings),
            onPressed: () => Scaffold.of(context).openDrawer(),
          ),
        ),

그새 구글이 구글했나보다.
작작 좀 바꿔라.

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  //const MyApp({super.key});
  final appTitle = 'Drawer Demo';
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: appTitle,
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.red,
      ),
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: Builder(
          builder: (context) => IconButton(
            icon: new Icon(Icons.settings),
            onPressed: () => Scaffold.of(context).openDrawer(),
          ),
        ),
        title: Text('Drawer'),
        elevation: 0.0,
        centerTitle: true,
        actions: [
          IconButton(
            icon: const Icon(Icons.shopping_cart),
            onPressed: () {
              print("AA2222");
            },
          ),
          IconButton(
            icon: const Icon(Icons.search),
            onPressed: () {},
          ),
        ],
      ),
      body: Center(child: Text('My Page!')),
      drawer: Drawer(
        child: ListView(
          padding: EdgeInsets.zero,
          children: [
            // DrawerHeader(
            //   child: Text('Drawer Header'),
            //   decoration: BoxDecoration(
            //     color: Colors.blue,
            //   ),
            // ),
            UserAccountsDrawerHeader(
              currentAccountPicture: CircleAvatar(
                backgroundImage: AssetImage('assets/0001.gif'),
              ),
              otherAccountsPictures: [
                CircleAvatar(
                  backgroundImage: AssetImage('assets/0002.png'),
                )
              ],
              accountEmail: Text('dev.yakkuza@gmail.com'),
              accountName: Text('Dev Yakuza'),
              onDetailsPressed: () {
                print('press details');
              },
              decoration: BoxDecoration(
                  color: Colors.blue[300],
                  borderRadius: BorderRadius.only(
                    bottomLeft: Radius.circular(40),
                    bottomRight: Radius.circular(40),
                  )),
            ),
            ListTile(
              title: Text('Item 1'),
              onTap: () {
                Navigator.pop(context);
              },
            ),
            ListTile(
              title: Text('Item 2'),
              onTap: () {
                Navigator.pop(context);
              },
            ),
          ],
        ),
      ),
    );
  }
}

반응형
Posted by Hippalus
,

반응형

visual studio code로 flutter를 개발하기 위해 extension을 설치하고 F1을 눌러 New project를 누르면 

이딴게 호출되는 사람이 있을 수 있다.  그게 나다 -_-
이상한건 난 분명히 환경변수를 설정해줬단 말이다.
그래도 뜨니 어쩔 수 없다. 또 하는 수 밖에

flutter site에서 파일을 다운받은 후 루트 > Users > hippalus (참고로 이 폴더는 내 유저명임) > Development (참고로 새로 만든 폴더임) > flutter를 위치시켜 뒀다.

터미널을 열어(터미널이 어디있는지 모른다면 응용프로그램 폴더의 유틸리티 폴더를 참조할것)

vim editor를 열기 위해 

vi ./~zshrc 입력 후 엔터

vim editor에 대해 더 알고 싶다면 이 블로그 글 참조 바람 잘 설명되어 있음
머여 내 포스트랑 겹치는 내용이네? ㅋ
https://d-dual.tistory.com/8

 

[ Mac OS / Terminal ] zsh 셸에서 Vim을 이용하여 환경 변수 설정하는 방법.

📝 VIM 소개 - vim.org Vim은 모든 종류의 텍스트를 만들고 변경할 수 있도록 구성 가능한 텍스트 편집기입니다. 대부분의 UNIX 시스템 및 Apple OS X에 "vi"로 포함되어 있습니다. 라고 vim 공식 페이지에

d-dual.tistory.com

vim editor에서 i를 눌러 INSERT모드로 진입 후 각자 위치시킨 경로를 입력 

export PATH="$PATH:/Users/hippalus/Development/flutter/bin"

다 입력했다면 esc키를 눌른 후 :wq 엔터치면 vi editor에서 빠져나옴

터미널로 다시 넘어왔다면 업데이트 한 내용을 적용하기 위해 source 명령어 사용

source .bashrc 실행하면 끝

반응형
Posted by Hippalus
,

반응형

Flutter을 설치하고 제대로 설치 됐나 확인하기 위해선 cmd.exe를 실행하여 flutter doctor를 입력해봐야 한다.

보통 Android license 관련 문제만 나타나는것 같은데 난 cmdline-tools component가 없다고 나온다.
하... 이 지저분한 구글환경
MS와 애플은 깔끔한데 JAVA, 구글 오픈소스 진영들은 정말이지 -_-

검색해보니 설정에 가서 SDK Tool을 깔아주면 된다는데
Android Studio를 써보지 않은 나는 Appearance메뉴가 어디있는지도 못찾았었다.
File > Settings(단축키 ctrl+alt+s)로 가보면 

Appearance & Behavior가 있고 그 아래에 System Settings가 있고 또 그 아래에 Android SDK가 있고
그 우측 상세화면에 SDK Platforms, SDK Tools, SDK Update Sites 중 SDK Tools를 눌러 아래로 스크롤 해 보면 아까 문제로 나온 Android SDK Command-line Tools가 언체크 된 상태로 보인다.
이걸 체크 하고 Apply 해주면

이렇게 쭉 인스톨 되는걸 확인할 수 있다.
뭘 이렇게 꽁꽁 숨겨둔다냐 ㅡㅡ

그리고 다시 cmd 상태에서 flutter doctor를 실행해보니 아 이건 또 뭐지 http host???
설마 방화벽에서 cocoapods를 차단했을리는 없는데 ㅡㅡ

일단 먼저 라이센스 문제부터 해결하기 위해 flutter doctor --android-licenses를 입력하고 계속 Y, Y, Y를 누른 후 다시 flutter doctor를 실행해보니 문제 없이 해결되었다.

No issues found!

반응형
Posted by Hippalus
,

반응형

SELECT
   OBJECT_NAME(object_id),  OBJECT_DEFINITION(object_id)
FROM 
   sys.procedures
WHERE 
   OBJECT_DEFINITION(object_id) LIKE '%내용%'

반응형
Posted by Hippalus
,