컴파일 한 번에 성공하는 그 날까지👀

코딩왕이 되고싶은 이코딩의 개발괴발 개발일지 😼

개발괴발🐾 11

[Fody/Costura] C# Winform 프로젝트를 단일 실행파일로 빌드하기

** 작업환경 : .NET Framework 4.6.1 (대상프레임워크) / Visual Studio 2019 / Windows 10 윈폼 프로젝트로 작업하다보면 빌드할 때 dll이 무지하게 많이 생성되어서 불편할 때가 많다.이 많은 dll들은 배포할때도 문제가 되어버림😥번거로우니까 *.exe 단일 실행파일로 만들어보자! 간단하게 정리하자면 NuGet패키지 관리 메뉴에서 Fody, Costura Fody를 선택한 후 설치하면 되겠다..!자세한 방법은 아래쪽에👇 (1) 원하는 프로젝트 이름 위에서 마우스 우클릭-> NuGet 패키지 관리 선택 (2) 키워드 Fody검색 => 아래 그림에 빨간 네모 박스 속의 Fody, Costura.Fody 설치!이 때 주의해야 할 점은 버전정보확인어디서 충돌이 나는 ..

개발괴발🐾/C# 2024.05.10

[SVN] Tortoise SVN 브랜치(branch)와 병합(merge) 기능 사용

(1) Trunk / Branch / Tag 는 각각 무엇인가요?Trunk프로젝트의 메인이 되는 저장소입니다. 전체 프로그램의 개발 작업은 이곳에서!Branch프로그램 개발 중 trunk 디렉토리 내에서 파생되는 기능을 테스트 하거나 개발해야할 경우가 생겼을 때 사용합니다.프로그램 내의 작은 프로젝트 개념. branch 작성[완성] -> merge를 반복하며 작업!Tag프로그램을 개발하면서 정기적으로 릴리즈 할 때 버전별로 소스코드를 따로 관리하는 공간입니다. (2) Branch를 생성해봅시다새로운 branch를 생성할 경로에서 (주로 trunk) 마우스 우클릭 -> TortoiseSVN -> Branch/tag... 클릭 To path: 우측의 ... 버튼을 눌러 branch 생성할 디렉토리를 설정->..

[Log4net] C#에서 외부 코드를 참조하여 로그 기능 사용하기

** 개발환경 : Visual Studio 2019를 사용합니다 ** 대부분의 내용은 https://logging.apache.org/log4net/ 에서 발췌하였습니다 Windows용 비주얼스튜디오는 NuGet패키지 라는 기능을 지원합니다. (다른 OS는 지원을 하지 않나보네요🙄) NuGet패키지란 다른 개발자가 만든 재사용 가능한 코드를 내가 작업중인 프로젝트에 사용할 수 있도록 관리해주는 기능을 말합니다! 여기에서 관리란 검색, 설치 및 유지를 뜻합니다. NuGet패키지를 잘만 이용하면 내가 직접 구현을 해야하는 번거로움 없이 클릭 몇 번으로 꿀같은 기능을 사용할수 있죠😀작게는 로그부터 시작해서 Dapper, Nhibernate와 같은 ORM 기능도 손쉽게 활용할 수 있습니다! 이번에는 Log4ne..

개발괴발🐾/C# 2024.03.21

[QUERY] 데드락 발생 시 해결 방법 (Dead lock)

데드락이란? 두 트랜잭션 모두가 블로킹 상태에 진입하여 서로의 블로킹을 해결할 수 없는 상태이다. = 작업하다가 엉켜서 꼼짝 못하고 있다 이말이다 ㅠ.. 쿼리의 문제일수도 있고 서버의 문제일수도 있는데, 아무튼 해결해보자. 1. sp_lock 실행 Mode 컬럼의 값이 X 이면 데드락 상태에 빠졌다고 볼 수 있다. exec sp_lock 2. 락이 걸린 쿼리문 확인 EventInfo 컬럼을 통해 락을 발생시킨 쿼리문을 확인할 수 있다. dbcc inputbuffer(spid) 3. 락 제거 (kill) 얼른 죽이자. kill spid

[QUERY] MSSQL 저장프로시저 검색 관련 쿼리

가끔가다 저장프로시저를 무지막지 하게 많이 만들어 놓은 데이터베이스에서 작업해야 될 때가 있다😅 저장프로시저 특성상 쿼리문이 노출 안돼서 어느 테이블의 데이터를 어떻게 건드리는건지 알수가 없는데, 이 때 저장 프로시저 이름/컬럼 정보만 겨우 알고 있어도 저장 프로시저를 찾을 수 있는 방법을 2개 소개하려고 한다😎 (1) 정의 내부 기준으로 프로시저 검색 SELECT OBJECT_NAME(object_id) as [procedure name], OBJECT_DEFINITION(object_id) as [description] FROM sys.procedures WHERE OBJECT_DEFINITION(object_id) LIKE '%찾을 내용%' (2) 이름 기준으로 저장 프로시저 정의 검색 SELECT..

[SVN] Tortoise SVN 저장소 (repository) 생성방법

(1) Visual SVN Server > Repositories > (마우스우클릭) 새로만들기 > Repository... (2) Regular FSFS repository 선택 FSFS (Fast Secure File System): 사용자 정의 형식을 사용하여 일반 플랫 파일에 데이터를 저장하는 Repository. 신규 생성할 때의 기본값. VDFS (VisualSVN Distributed File System) : 양방향 데이터 복제를 투명하게 구현하는 Repository. 여러 서버에 걸쳐 투명한 데이터 복제를 구현하는 독점 데이터 저장소 백엔드. (3) Repository 이름 입력 (4) 저장소 유형(Repository Structure) 선택 Empty repository : 어떠한 설정..

[C#] Sealed Class 란?

Sealed 단어 뜻 그대로 상속으로부터 '봉인' 시키는걸 말한다. 메서드 앞에 놓이면 메서드 상속을 막고, 클래스 앞에 놓이면 클래스 상속을 막는다는 이야기. * Sealed Class 아래와 같은 코드에서는 A를 상속받을 수 는 있지만 B를 상속받을 수는 없다. class A {} sealed class B : A {} * Sealed Method Human을 상속받은 Parent가 Eat에 Sealed 한정자를 붙였으므로 Child 클래스에서는 상속이 불가능하다. public abstract class Human { public double Age { get; set; } public virtual void Work() { Console.WriteLine("Work hard"); } public v..

개발괴발🐾/C# 2024.03.08

[C#] POCO 가 뭐야?

Nhibernate를 공부하면서 POCO라는 단어가 심심찮게 보이길래 한번 찾아봤다. POCO: Plain Old Class Object 간단히 말해 특정 프레임워크나 라이브러리에 종속되지 않은 일반적인 클래스를 말한다. 특히 객체 지향 프로그래밍에서 자주 사용되는 개념이며, 순수한 데이터를 저장하고 해당 데이터에 대한 접근을 제공하는 역할을 한다. POCO 클래스는 데이터베이스와 같은 데이터 소스의 레코드를 표현하거나 다양한 비즈니스 로직을 구현하는 데 사용될 수 있다. 조금 더 자세히 풀어보자면 POCO의 특징은 아래와 같다. 1 특정한 베이스 클래스를 상속받지 않음: POCO 클래스는 보통 어떠한 베이스 클래스도 상속받지 않는다. 즉, C#에서는 보통 object 클래스를 상속받거나 다른 클래스를 ..

개발괴발🐾/C# 2024.03.08

[Socket] 요청<->응답 바이트 배열 변환

*** SuperSocket (+ClientEngine, ProtoBase), Newtonsoft.Json 패키지를 활용합니다. public class MyRequestInfo : IRequestInfo { public string Key => Type.ToString(); /// /// 설비 데이터 요소 /// public class Element { /// /// 속성명 /// public string Name { get; set; } /// /// 값 /// public string Value { get; set; } public Element() { } public Element(string name, string value) { Name = name; Value = value; } public ..

개발괴발🐾/C# 2024.03.07

[QUERY] 테이블 이름으로 컬럼 목록 출력(Data Type, PK, FK, NOT NULL 설정까지)

테이블 이름을 기준으로 컬럼 목록 조회. SELECT a.TABLE_NAME as 'Table Name' , a.COLUMN_NAMEas 'Column Name' , case when a.CHARACTER_MAXIMUM_LENGTH IS null then a.DATA_TYPE else a.DATA_TYPE + '(' + case when ltrim(str(a.CHARACTER_MAXIMUM_LENGTH)) = '-1' then 'max' else ltrim(str(a.CHARACTER_MAXIMUM_LENGTH)) end + ')' end as DATATYPE , case when a.column_name=isnull(b.column_name,'') and c.constraint_type='PRIMARY..