• 카테고리
    • 전체 글

    • 카테고리1
    • 카테고리2
    • 카테고리3
    • 카테고리4
  • 태그
  • 방명록

'분류 전체보기'에 해당되는 글 1246건

  • 2014.11.12 MS SQL 저장 프로시저 Source 추출하기.
  • 2014.10.23 log4net 코드로 활성화 방법
  • 2014.10.02 HP Workstation xw4600 용 HDD 나사 구함
  • 2014.10.01 Bye Bye 옥션
  • 2014.09.29 전화로 영업하는거.. 이러는 것은 아닌 듯... 2
  • 2014.09.26 개발팀 내 암적인 프로그래머
  • 2014.09.23 C# Winform(WebBrowser Control) <--> Javascript 연동 3
  • 2014.09.15 [판매완료] k램 팝니다.

MS SQL 저장 프로시저 Source 추출하기.

기술자료 2014. 11. 12. 11:13

MS SQL 작업을 하다보면 무척 많은양의 저장프로시저들이 쏟아질 때가 있는데, 문제는 해당 로직을 모두 검색해봐야 할 때가 있다. ( 테이블 의존 관계나, 사용형태라든가...)

그렇다고, 매번 체크하고 싶은 저장프로시저마다 소스를 열어볼 수도 없다.

방법은 간단하다.

   
USE MYDB;
select ROUTINE_NAME, ROUTINE_DEFINITION 
  from information_schema.routines 
 where routine_type = 'PROCEDURE';

위와 같이 하면 전체 목록이 나오는데, 적당한 이름으로 csv로 저장하면,
전체 소스를 Text 파일로 얻어낼 수 있다. USE MYDB 부분에서 MYDB 부분만 자신의 DB 이름을 넣어주면 된다.

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

log4net 코드로 활성화 방법

기술자료/.NET 2014. 10. 23. 17:25

프로젝트를 하다 보니, 자연스럽게 log4net을 사용하게 되었다.
Visual Studio의 IDE 기반으로 된 디버그 기능은 매우 훌륭해서, 브레이크 포인트를 잡고 하는 디버깅을 사용하면 보다 쉽고 편하게 할 수 있지만, 간혹 백그라운드로 동작하는 기능이나, 데이터 흐름의 끊김 없이 쭉 보고자 할 때는 역시 로그 기능은 필수이다.
대개 실행 프로그램 프로젝트( WinForm 프로젝트, 콘솔 프로그램 프로젝트 )의 경우 app.config 라는 XML 기반 설정 파일을 잘 구성해서 넣어주면 log4net을 바로 쓸 수 있다. 설정도 바로 app.config 내에서 수정하면 즉시 즉시 발동되니 편하다.
그런데, 이번 프로젝트는 DLL 기반의 프로젝트로, 해당 DLL은 외부 프로그램에서 Run을 해주게 된다. 이러다 보니, 외부 프로그램에서 log4net을 활성화 시켜주지 않는 이상 내가 만드는 c# dll 안에서는 도무지 로그를 쌓을 수 없었다.

고민 고민하다가, 이전에 만들어 놓았던, log4net용 관리 클래스를 꺼내봤는데, 생각보다 그다지 썩 좋지 않은 방법을 이곳 저곳을 써서 그대로 쓸 수 없었다. 게다가, 설정 기능을 이리저리 끊어놔서 생각보다 쉽지는 않았다.

그래서 아예 Log 기능을 활성화시키는데 주안점을 두고 정리해봤다.

아래의 코드가 log4net을 활성화 시키는 코드들이다.

// log4net의 기본 구조를 꺼낸다.
// log4net의 기본 구조를 꺼낸다.
log4net.Repository.Hierarchy.Hierarchy hierarchy = (log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository();
// log4net의 설정 기능을 활성화 시킨다.
hierarchy.Configured = true;

// log4net을 이용하여 로깅을 할 때, 어떤 방식으로 로그를 남길지를 설정한다.
// 파일, DB, 이벤트로그, 등등 다양한 위치에 로그를 쌓을 수 있는데,
// 아래의 예제는 RollingFile 기반 ( 일정 사이즈가 되거나, 날짜가 변경되면 자동으로 새로운 파일을 생성해서 로그를 
// 남기는 방식 )으로 구현했다.
// 만약 다른 방식으로 변경하려면, rollingAppender의 클래스와 설정을 변경하면 된다.
log4net.Appender.RollingFileAppender rollingAppender = new log4net.Appender.RollingFileAppender();
rollingAppender.File = @"C:\DEV\Log\cupps.log";
rollingAppender.AppendToFile = true;
// RollingFile 방식을 설정한다.
rollingAppender.RollingStyle = log4net.Appender.RollingFileAppender.RollingMode.Composite;
// 로그 파일 최대 크기를 설정한다.
rollingAppender.MaxFileSize = 1024 * 1024 * 2;
// 로그 파일 작성시, 동시 Write 방지 Locking Model 방식을 설정한다.
rollingAppender.LockingModel = new log4net.Appender.FileAppender.MinimalLock();
// 날짜 변경시 기존 로그 파일이름을 어떤식으로 변경할지에 대해서 설정한다.
rollingAppender.DatePattern = "_yyyyMMdd\".log\"";
// 로그 파일 내에 로그(한 줄)를 어떤식으로 기록할지에 대한 Format을 설정한다.
log4net.Layout.PatternLayout layout = new log4net.Layout.PatternLayout("%date %-5level %logger - %message%newline");
rollingAppender.Layout = layout;
// 위에서 설정한 Appender 섲렁을 활성화시킨다.
rollingAppender.ActivateOptions();
// Logger에다가 위에서 설정한 Appender를 추가한다.
hierarchy.Root.AddAppender(rollingAppender);
// 여기까지가 Appender 추가 방법.

// 로그를 남기는 레벨 설정 ( INFO, DEBUG, WARN, ERROR, ALL 등이 있다 )
hierarchy.Root.Level = log4net.Core.Level.All;

이 활성화는 프로그램 맨 처음에 한번만 해주면 된다.

로그를 남기려면 클래스 맨 앞에 static 형태로 변수 하나 설정한 뒤, 그 변수를 이용하여 로그를 남기면 된다.
다음 예제 클래스가 그 용도다.

class Class1
{
    private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    public Class1()
    {
        log.Debug("Enter Constructer~");
    }
}

static을 이용해 log 라는 변수를 생성한 뒤, 로그를 쌓고 싶은 곳에서 log. 이라는 것으로 시작하여 로그를 기록하면 된다. 매 클래스에서 저 static 변수를 모두 넣는 것이 좋다. 그 이유는 로그를 쌓을 때, 어느 클래스에서 발생된 로그인지를 바로 알 수 있기 때문이다.

앞서 로그를 설정할 때, PatternLayout 이라는 값을 설정했다.

 %date %-5level %logger - %message%newline 

이 값들 중, %logger 부분이 로그를 발생시킨 대상을 표시하는 영역이 되는데, %logger 에 들어갈 문장을 "System.Reflection.MethodBase.GetCurrentMethod().DeclaringType"를 통해 넣게 되는 것이다.
그러면 아래와 같은 로그가 쌓이게 된다.

2014-10-23 17:23:11 DEBUG MyApps.Class1 - Enter Constructor ~

"MyApps.Class1" 이라는 부분이 그 부분이다.

귀찮더라도, 매 클래스 마다 아래의 줄을 추가하면 최소한 그 클래스 내부에서 로그를 쌓을 때 편하게 로그를 작성해서 구성할 수 있게 된다.

private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

HP Workstation xw4600 용 HDD 나사 구함

잡글 2014. 10. 2. 20:33

지금 HP Workstation xw4600을 사용중인데요.

HDD를 확장하려다 보니, HDD 베이에 결착시켜주는 나사가 부족하네요.
(기본적으로 담긴 4개가.. 전부네요. 그 외의 나사는 ODD연결용.. )

혹시 이런 나사 남는 분?

20141002_201522

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

Bye Bye 옥션

잡글 2014. 10. 1. 11:23

이번에 옥션에서 물건을 하나 주문했다가, 가격 표기 오류로 인해 강제 취소되었다.
http://itempage3.auction.co.kr/DetailView.aspx?itemno=A952069614


사실 인터넷 물품을 올리는 작업이 무척 간단하게 되어 있기 때문에, 간혹 "0"이 빠지던가, 아니면 9를 8로 적는 등 사용자 오류가 의외로 종종 발생하곤 한다. 판매자 스스로도 주의 깊게 보면 되겠지만, 사람이니 당연히 이런 오류는 어쩌다 한번씩 발생할 수 있다.

여기까지는 나도 동의하고 이해해준다.
하지만, 최소한 자신이 저지른 실수를 이 물건을 구매하려 했던 손님들에게 넘기는 듯한 행동을 하는 부분에서 도무지 동의할 수 없는 분노가 치밀었다. 결론적으로 옥션에 불만 메시지 남기고, 탈퇴해버렸다.

사실 이 부분은 "상도덕"을 지키며, 자신의 "신뢰"를 중요하게 생각하고, 고객을 "존중"했다면, 아주 간단히 해결될 문제였다고 생각한다. 판매자의 실수는 실수지만, 일방적으로 취소처리가 아닌 각 고객께 양해의 글을 전달하고, 시스템에서 자동으로 뿌리는 메시지가 아닌, 진심 어린 사과를 보내던가, 아니면 다른 물건으로 사죄를 요청해야 한다. 분명 실수라도 자신이 올린 글에 대한 책임은 지어야 하지 않을까?

여기에 결정적으로 판매자와 손님간의 댓글 놀이도 아주 가관이였다.

"고객님 좋은 정보 감사합니다" <- 이건 뭐 하자는 건지...

상호간의 신뢰를 한번에 무너뜨리는 한마디 같았다.
이 결과, 이런 판매자에 대한 질책이나 별도 사과는 없이, 기계적인 취소 공지 식의 메일만 도착.

이런 판매자의 행위를 옥션도 한팔 거들 뿐.

G마켓이든, 11번가든, 인터파크 든, 다들 대응이 비슷하겠지만, 지금 내 눈에 띈 것은 옥션이였고, 그간 조금 비싸든 말든 계속 같이 거래하며 나름 신뢰감을 가지고 이용해 왔는데, 아주 뒤통수 맞은 듯한 느낌에, 결국 나의 시야에서 버려 버렸다. 뭐 소송이나 이런 적극적이면서 귀찮고 짜증나는 일은 하지 않을 것이다. 그냥 눈 돌리고, 이렇게 소극적인 불만을 제기하고 기록할 뿐. 어차피 어마어마한 수의 회원수를 보유하고 계신 옥션이시니, 나하나쯤 회원 해지 신청했다고 티는 안나겠지만, 얼마가 더 싸게 물건이 나오든 말든 이제 더 이상의 "옥션"은 내 이후 구매 이력에서는 없어질 회사다.

결론적으로 내가 필요로 했던 것은 "상도덕"과 "신뢰" 그리고 나에게 대한 "존중" 이 세가지다.
일단 일방적인 취소로 "상도덕"과 "신뢰"는 저버린지 오래고, 고객에 대한 진정한 사과없이, 시스템이 기계적으로 내린 사과가 고작인 이런 곳에서 나에게 대한 "존중"이 있었을까?

자존심으로 손해 보겠네, 뭘 이런거 가지고 이러나 싶기도 하지만, "신뢰"는 상호간 지켜야 될 약속. 약속은 돈 몇 푼 때문에, 이리 저리 휩쓸리는 것이 아닌 아주 중요하고 꼭 필요한 인간관계, 상호관계라고 생각이 되고, 내 나름대로의 규칙이기 때문이다.

판매자도, 중계자도 어차피 그 사이 사이 마진을 통해 이익을 먹고 살고 있는 입장이니, 이런 책임에서 벗어나려 해서는 절대 안된다고 생각된다.

Bye Bye 옥션

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

전화로 영업하는거.. 이러는 것은 아닌 듯...

잡글 2014. 9. 29. 11:41

에이스 손해 보험 유지팀인지 뭔지.. 전화가 왔다.

치아 보험 유지를 잘 하고 계시고, 치과 다녀오셔서 청구하시라고.
안그래도 치과를 갈건데 뭐...

그런데 이번에는 가족 것도 하란다. 집 사람과, 아들 이렇게...
안 그래도 튼튼한 이를 자랑하는 집사람도, 나이 먹으면 분명 필요할 것 같았고, 아들 것도 조만간 필요할 것 같다.그리고, 조만간 치아 보험 규정이 바뀌게 되어, 구강 검진 결과가 있어야 가입이 된다고 한다. 그러니, 아직 구강 검진이 필요없는 지금 시점에 가입하라고 권유를 해왔다. 가입은 필요하고 조건도 맞는 상황.

하지만, 요 근래 금액 단속 중이고, 기존 보험도 점점 정리하고 있다. 이런 상황에 뜬금없이 새로운 상품 가입이라. 물론 이야기 하고 잘 설명하면 큰 반발 없이 가입하라고 하긴 할 듯. 내 것도 아니고 아들 것이라고 하는데 뭐라 하겠는가? 하지만, 지금은 아니라는 생각이 들었고, 다음에 가입하려 했다. 그리고 이런 부분은 매 달 지출 금액이다 보니 집사람이랑 논의도 필요했다.

그런데 전화 상담원은 끈질기게 요청을 했다. 그 직업 정신은 높이 사줄만 했지만, 당장 나에게 필요없는 사항이기 때문에, 후에 다시 연락을 주었으면 하는 바램이였다. 하지만, 상담원은 이 좋은 기회 놓치면 안된다고 "구강 검진 필요"라는 카드까지 꺼내들었다. 이쯤되니 슬슬 가입은 필요없고, 전화 끊을 구색이 필요했다. 그래서 난 집사람 카드를 꺼냈다.

그러자...

"안사람 되시는 분께 제가 연락해서 말씀드려도 될까요"

란다...

아.. 이거 뭐지...  대단한 설득가 하나 나셨다는 생각이 들었다. 지가 뭔데 왜 집사람까지 연락해보겠다는 건가? 마치 내가 설득이 안먹히니 집사람을 설득해보겠다는 자신감인가? 아니면 내 말 못믿겠으니, 진짜 어려운지 확인차 하겠다는 건가.

쌍욕나올려는거 다시 마음 가라 앉히고, 다시 이야기 했다.

"필요 없구요. 만일 필요 할 즈음에 다시 연락하겠습니다. 지금 제가 가입한 것도 확인해보면 알겠지만, 가입 권유 보고 가입한게 아니고, 내가 필요해서 가입했다... "

라고 해줬다.

또 뭐시기 뭐시기 하면서 위협은 아니지만, 마치 지금 안하면 손해 보시고, 나중에 가입이 어렵다는 식이다.

아... 이렇게 더 나오면 지금 내가 가입했던 것 마저 다 해지시켜버리고 싶어진다.

어쨌던 전화는 마쳤다.

 

가입율 높이기 위한 직업 정신은 높이 사지만, 이렇게 치근덕 대는 꼴은 정말이지 보기도 싫고 원하지도 않는다.

필요하면 어련히 알아서 찾아볼까.. 가입 받으러 영업을 뛰기 보다, 정말 필요한 사람이 찾을 때 쉽고 편하게 찾아서 가입할 수 있도록 제공하는게 더 좋지 않나? ( 2011년 경에 치아 보험 가입할 때, 어디다 전화 해야 할지 모른 적이 있었다. -_-;;; )

그리고 아니라고 이야기 하면, 설득하려 하지 말고, 다음에 다시 좋은 기회 때 연락 드리겠다고 해라 좀...
지금은 아닐지도 모르지만, 나중에는 필요해질지도 모르지 않는가?

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

개발팀 내 암적인 프로그래머

기술자료 2014. 9. 26. 14:40

예전 개발자들의 대부분의 성향은 자신이 개발하는 것에 대한 책임감이 무척 강해서, 자신이 만든 소스들이 자신의 자식인양 애지중지 한적이 많았다. 그래서 자신의 코드 부분에서 버그가 발생되면 누구보다 앞장서서 수정하고, 전반적인 책임을 가지고 진행을 하는 모습을 많이 보아왔다.

그런데, 당시에는 Unix내 모듈단위 개발이라, 실제 컴파일하기 위한 Object 파일은 많아도 50개 내외였다. 물론 코드 라인 수는 많아서, 복잡하게 보이기는 했지만, 역할이나, 기능은 요즘 통합 시스템 로직에 비하면 매무 심플한 구조였다. 요즘은 하나의 시스템 내에서 동작되는 규칙은 매우 복잡해지고, 다양한 기능을 수행하다보니, 예전 처럼 1인 프로그래머로 개발하기에는 버거운 구조를 갖추게 되었다. 최소한 2~3인이 팀이 여러 개의 팀으로 구성되어 하나의 시스템을 구축하곤 한다. 그러다 보니, 점점 자신의 코드라는 개념은 서서히 사라지고, 버그는 모두 함께 해결해야 하는 로직적 버그가 많아지기 시작했다. 혼자 해결하기는 점점 어려워지고, 같이 협업해서 없애려고 노력한다.

그런데, 간혹 구세대 프로그래머처럼 자신이 손댄 코드들은 모두 자기 것이라고 판단하고 공유하지 않은 채 혼자만 안고 가는 프로그래머들이 종종 눈에 띈다. 이해는 할 수 있다. 이 코드들은 자신이 이해해서 구성/수정하면서 구축해왔고, 자신 밖에 모르기 때문에, 자신의 자리보전을 위한 중요한 무기가 될 수 있다고 생각하는지도 모르겠다. 점점 노쇠해가는 자신의 능력 대비 서서히 줄어가는 자신의 업무를 바라보면서 말이다.

개인을 바라보면 이해는 하지만, 이것이 팀 그리고 회사의 입장에서 보면, 매우 암적인 존재라는 사실이다. 들어가면 나오지 않는 블랙홀 같은 소스 저수지가 되어가고, 그 만큼 그 사람에게 의존은 하는데, 원하는 퀄리티는 나오지 않아, 매번 회사는 고객에게 욕을 먹는다. 퀄리티가 좋아도, 기한을 맞추지 못하는 괴이한 상황에 빠진다. 그렇다고, 인원을 충원해도 방법이 없다. 블랙홀에서 나오지 않는 코드와 기술은 후임자에게 전달되지 않으니까. 결국 남는 것은 자신에게만 쌓이는 일거리들 ( 유지보수, 개선 사업 등등 )이고, 빠르게 해소되지 않는 병목의 주요한 원인이 되버리는 것이다. 프로젝트는 이 개인에 집중하게 되고, 해결, 개선은 보이지 않게 되는 것이다.

냉정하게 바라보자. 결과적으로도 문제지만, 애초의 시작자체가 잘못되었다는 것을 확인할 수 있다. 마치 자신이 손댄 코드나, 자신의 기여한 코드는 자신의 코드이므로, 이 제품자체의 소유가 자신의 것이 되었다고 생각하는 그 자체를 말이다.

진짜 자신이 손댄, 기여한 코드는 자신의 것인가? 이 질문을 던지는 원인은 바로 그 소스코드들이 생긴 흐름 전체를 바라볼 때 생각을 해보도록 하자는 것이다. 먼저 그 소스코드를 만들 때, 자신의 돈과, 시간이 전부 들었는가? 부터 시작할 수 있다. 애초에 자신이 가진 돈을 가지고 자신을 고용하고, 자신의 개인적인 시간을 투자하여 개발했냐는 것이다. 대부분 회사 내 소속된, 팀에 소속된 경우에는 애초에 이 부분에 해당되지 않는다. 돈은 고객에서부터 나와 회사에서 지급된다. 그리고 온전히 자신만의 소스라고 말하기 어려운 것은, 소규모 1인 프로젝트와 같은 것이 아닌 이상, 1인 개발로 처음부터 끝까지 하는 프로젝트는 거의 없다는 사실이다. 대부분 선임자, 혹은 후임자가 함께 설계하고, 코딩을 하고, 같이 고민해서 해결하게 된다. 물론 일부 로직은 전부 자신이 짜기도 하지만, 제품 단위로 볼 때, 과연 제품 전체 자신만의 코드들로 가득 차 있냐는 것이다.  결국 당위성을 말하기 어렵다는 것이다.

혼자 문제 수정 및 개선 작업을 했으니 이제 내 제품이 되었다고 반론하고 싶은가? 그렇다면, 무엇을 근거로 수정하고, 개선 작업을 했다는 것인가? 만일 그렇다면, 해당 소스 코드 없이, 완전히 빈 프로젝트(솔루션)을 열어 지금 자신이 수정/개선하는 프로젝트를 비슷하게라도 만들어 낼 수 있을까? 애초에 이런 것이 불가능하다면, 온전히 자신의 소스라고 말할 수 없다는 것이다.

개발작업이나 개선작업은 쭉 수행해온 부분에 대해서 존중 받아야 되며, 그 기술에 대해서 인정해주어야 한다. 하지만, 그 소스와 기술은 홀로 안지 말고, 회사 구성원, 팀 구성원과 공유해야 한다. 자신의 기술을 뺏기는 것이 아니고 나눈다고 생각하도록 한다. 평생 그 프로젝트만 하면서 노닥거릴 생각이라면 모르겠지만, 자신의 직위와 급여가 오르고, 다양한 경험을 요구 받는 입장이면, 이제 과거에 만들었던, 개선, 수정 했던 프로젝트들은 같은 구성원에게 건네 주고, 새로운 업무에 뛰어들어 더 발전된 모습을 보여주어야 한다. (그냥 무턱되고, 왜 내 급여는 왜 안 오르냐고 따지지 말고 말이다. )

이번에 사내에 프로젝트 관리 솔루션을 하나 작게 구축했다. 개인적으로 사용하던 프로젝트 관리 솔루션을 통해 얻은 경험들을 기반으로 이번에 무료 솔루션 중, 이질감이나 관리의 편의성이 좋은 제품을 도입해봤다. 구축해보고, 테스트해보고, 내가 담당한 프로젝트를 등록해봤다. 사실 프로젝트의 성공적인 수행을 위한 관리라는 포커스 보다, 프로젝트 이력 관리라는 측면을 강조한 구축이라고나 할까…
구두로 형식적인 인수인계가 아닌 실질적인 히스토리를 공유할 수 있는 그런 공간 말이다.

제발 이제 이런 암적인 존재인 프로그래머들이 이런 솔루션 속에 녹아내리면서 암적인 유전자 변이가 좀 제 정신을 차릴 수 있도록 할 예정이다..(뭐 말기면 쳐내야 겠지만 )

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

C# Winform(WebBrowser Control) <--> Javascript 연동

카테고리 없음 2014. 9. 23. 16:07

출처 : http://tarotcrd.tistory.com/154

위의 출처에서 해당 글의 내용을 보고 참 도움을 많이 받기는 했는데, 가독성이 떨어지는데다, 해당 소스 부분을 직접 긁어 코드화 시킬 수 없어서 여기에 다시 정리해서 올린다.

Winform-WebBrowser Control을 이용하면, 웹의 내용을 그대로 띄울 수 있다.
그래서 WinForm과는 다른 유연하게 제공되는 표(Table)을 표현 할 수 있고, 각종 Form을 구성할 수도 있다.

그런데, 이런 웹 기반의 프로그램을 이런 저런 구성하다가 보면, 웹의 내용을 표출하는 것 뿐만 아니라, 웹에서 입력된 각종 값들을 WinForm에서 활용하고 싶을 때가 있다. 이 경우 Javascript를 통해 웹 상의 정보를 읽는 것은 가능한데, 이 정보를 WinForm에 어떻게 전달할까?

역으로, WinForm에서 특정 작업을 수행했는데, 이 정보를 WebBrowser Control을 통해 웹 상에 전달 하고 싶을 때는 어떻게 할까?

위의 질문에 대한 답을 아래에 제시할 수 있다.

Web(Javascript) –> WinForm(Webbrowser Control)

맨 먼저 할 작업은 웹에서 제공되는 정보를 winform에서 받아서 처리하는 방법이다.

웹에서 먼저 javascript를 구성하도록 한다.

<html>
<head>
	<title>Test Page</title>
	<script type="text/javascript">
		function submitToForm()
		{
			var textboxvalue = document.getElementById('text1').value;
			window.external.CallForm(textboxvalue);
		}
	</script>
</head>
<body>
	<form>
		<input type="text" id="text1" name="text1"></input>
		<input type="button" id="btn1" name="btn1" value="submit" onclick="submitToForm()"></input>
	</form>
</body>
</html>

HTML 소스 중, Javascript만 보면, 다음과 같은 코드가 있다.

window.external.CallForm(textboxvalue);

바로 window.external 부분이 핵심인데, window.external까지 쓰고, 그 뒤에 C# Winform 상에서 실행할 함수 명과, 값을 넘겨줄 때 사용할 파라미터를 건네면 된다.

이제 웹브라우저 컨트롤을 Windows Form에 넣고 다음과 같이 코드를 수정하도록 한다.

TestApp 라는 솔루션 내에 Form1이라는 Winform을 하나 생성한 뒤에, 디자이너 화면에서 webbrowser 컨트롤을 폼에다 넣으면 된다. 자동적으로 webBrowser1 이라는 변수가 생성이 된다.




자 이제 소스 부분을 열도록 한다. 그리고 using을 사용해서 다음 두개의 네임스페이스를 추가한다.

using System.Security.Permissions;
using System.Runtime.InteropServices;

Form1에서 Form Load 이벤트 핸들러를 생성한다. (Form1_Load 함수가 자동으로 생성된다.). 그리고 그 안에 다음과 같은 속성을 설정하도록 한다.

webBrowser1.ObjectForScripting = true;

이제 javascript에서 호출받을 함수를 만든다. 위의 Javascript에서 CallForm 이라고 만들었으므로, 여기서도 CallForm이라는 이름의 함수를 새로 만들어 추가하면 된다.외부에서 노출되어야 되기 때문에, 반드시 public으로 만들어야 하며, 파라미터가 있을 시에는 파라미터 갯수만큼 object로 변수를 만든다.

public void CallForm(object msg)
{
	string sMsg = (string)msg;
	{
		// 받은 msg 값을 가지고 처리하는 로직.
	}
}

사실 Javascript에서는 데이터 형(문자열, 숫자, 날짜 등등)에 관계 없이 무조건 쓸 수 있지만, C#에서는 그 형이 정해져야 한다. 그렇다고, Javascript에서 맞춰줄 수는 없다. 방법은 Javascript에서 파라미터를 받을 때, object로 받아, 그 값의 형에 따라 캐스팅을 하는 방법을 제시한다.

위의 수정 내용을 다 합친 코드는 아래와 같다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Security.Permissions;
using System.Runtime.InteropServices;

namespace TestApp
{
    [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
    [ComVisible(true)]
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.ObjectForScripting = true;
        }

        public void CallForm(object msg)
        {
            string sMsg = (string)msg;
            {
                // 받은 msg 값을 가지고 처리하는 로직.

            }
        }
    }

WinForm –> Web(Javascript)

이제 역으로 WinForm에서 webBrowser 컨트롤 내에 띄워진 Javascript를 실행하는 방법을 제시한다.
이 부분은 앞서 설명한 방법과는 다르게 webControl에게 시키기만 하면 된다.

먼저 Winform에서는 다음과 같은 코드를 작성한다.

private void ExecJavascript(string sValue1, string sValue2)
{
	try
	{
		webBrowser1.Document.InvokeScript("CallScript", new object[] { sValue1, sValue2 });
	}
	catch
	{
        }
}

보면 Javascript를 부를 때, Document.InvokeScript를 사용한다는 것을 쉽게 알 수 있다. 해당 함수의 첫번째 파라미터에는 호출 할 Javascript의 함수 이름을 넣고, 두 번째에는 object 배열로 해서 파라미터를 넘기면 된다. ( c#의 invoke를 사용해 본적이 많으면 쉽다.) 만일 파라미터가 여러 개인 경우에는 갯수에 맞게 개수를 늘려 배열로 생성해주면 된다.

자 이제 javascript 부분을 살펴보자. 다른 HTML 부분은 필요없고, script 섹션 내에 위의 설정한 “CallScript”라는 함수를 생성해주면 된다.

function CallScrript(va1, va2)
{
	alert('Val1 : ' + val1 + " / Val2 : ' + val2);
}

이제 WinForm에서 webbrowser1.Document.InvokeScript를 실행하면, webBrowser 컨트롤 내의 HTML Script가 실행 됩니다.

 

정리

Javascript –> WinForm을 호출하는 방식은 Javascript에서 ActiveX 를 호출하는 것과 비슷하다. 보안적인 이슈만 없다면, HtML 위에 작성된 javscript 호출하는 것 역시 간단하다.사실 webBrowser 컨트롤이 WinForm과 거의 한몸이기 때문에 이런 방식이 가능하다. 

스스로 예제를 작성해서 구성해 보면 좀 더 확실하게 이해 할 수 있을 것이다. 

728x90
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

[판매완료] k램 팝니다.

카테고리 없음 2014. 9. 15. 13:10

램 팝니다. 

이번에는 집에 묵혀져 있던 램들을 모두 처분합니다.

노트북용 

PC3-8500S 1G * 2

PC2-6400S 1G

PC2-5300S 1G * 2


데스크톱용

PC2-4200U 512M * 2

PC-3200U 1G

PC-2100U 256M * 2


문제는 램 중에서 노트북 램들은 테스트가 되었는데,

데스크톱 램은 테스트를 전혀 안해서... 사실 그냥 덤에 가까운 램들입니다.













728x90
저작자표시 (새창열림)
블로그 이미지

하인도1

[하인드/하인도/인도짱 의 홈페이지] 저만의 공간입니다. 다양한 소재들을 나열하는 아주 단순 무식한 홈페이지 입니다. 다양한 문서 자료도 있겠지만, 저의 푸념들도 있답니다.

  • «
  • 1
  • ···
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • ···
  • 156
  • »
250x250

블로그 내에 소스 코드 삽입 이사온 기념 스킨도... RSS 전문 기능 비활성화 관련. 스킨 바꾸어 보았습니다. 서버 파일 정리 좀 했습니다.

«   2025/06   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

windows Azure me2dayzm SharePoint Tutorial 오류 Buscuit java WSS me2photo e-book MOSS 2007 Visual Studio twi2me 협업 개발환경 비스킷 moss 2010 인터파크 매뉴얼 지름신 Google Apps Engine 좀 블로그 친구 것 me2sms 수 불만

  • Total :
  • Today :
  • Yesterday :

Copyright © 2015-2025 Socialdev. All Rights Reserved.

Copyright © 2015-2025 Socialdev. All Rights Reserved.

티스토리툴바