posted by 방랑군 2009. 10. 16. 15:31

Today's Writing

 

You want to apply for the following job. Write a letter to Mr. Moore describing your previous experience and explaining why you would be suitable for the job. 

Waiter/waitress required for evening work. Some experience necessary.

  • You should write at least 150 words.
  • You should spend about 20 minutes on this task.


1.  the following job

2. 



<Model Answer>

 

Dear Mr. Moore, 

Re: Waitress position 

I am writing to express my interest in your recently advertised position for a waitress. Enclosed with this letter is my resume, which further details of my previous experience and qualifications. 

Not only do my qualifications and work experience make me a perfect candidate for the job, my personality is well suited to working as a waitress. I am a very friendly person who can quickly establish rapport with people of all ages. In my last waitress job, I had over a dozen repeat customers each day. And, the fast-paced environment of waiting on tables suits me well, because I thrive on working under pressure. In fact, my former boss was surprised at both my incredible stamina and efficiency in dealing with customers’ orders. 

I would like to meet with you at your earliest convenience, to discuss the possibility of working at your restaurant. I can be reached at 463-9234 during the days and 924-6868 after 6 pm. 

Thank you for your consideration of my application. I look forward to meeting you in the near future. 

Yours sincerely, 

Martha Scott



1. Enclosed with this letter is my resume

    : 쓰는 타입이 특이함..

       나의 이력서를 편지를 통해 동봉합니다.


   Enclosed is~[~을 동봉한다]





 

'ENGLISH > Today's Writing' 카테고리의 다른 글

2009 12 14  (0) 2009.12.14
2009 10 19  (0) 2009.10.19
2009 10 15  (0) 2009.10.15
2009 10 14  (0) 2009.10.14
2009 10 06  (0) 2009.10.06
posted by 방랑군 2009. 10. 16. 09:13



 Topic

 

Is there any difference between your parents’ generation and your generation in study?

'ENGLISH > Today's Speaking' 카테고리의 다른 글

2009 12 14  (0) 2009.12.14
posted by 방랑군 2009. 10. 15. 12:18


Today's Writing

 

One of your pen pals will shortly be visiting your city. For some reasons, you can not manage to meet him at the airport on time.

Write a letter asking him to wait for you at the airport and tell him how to identify you.

  • You should write at least 150 words.
  • You should spend about 20 minutes on this task.

1. 문제파악이 전혀 안되고 있다...
    의역이 안되서 생기는 상황 --;




Model Answer

 

Dear Mary, 

I am very much looking forward to your visit to my city. Just think: after all these years to writing to each other, we will finally have the chance to meet! However, I regret to inform you that I will not be able to meet you at the airport as soon as you arrive. 

The reason is that your flight will arrive early in the morning, and the quickest time I can get to the airport will be about an hour after you land. Please wait for me in the arrival lounge. You should be able to have breakfast there while you wait. 

By the way, as we have never met I must tell you how to recognize me: I am of medium height and have a small mustache. In addition, I will be carrying a copy of the morning newspaper tucked under my left arm. 

Looking forward to our first meeting. 

Yours sincerely, 

Harry



1. "the quickest time I can get to the airport will be about an hour after you land"

 아니 이걸 어떻게 영작했지?

 한국사람이 과연 이런식으로 할수 있단 말인가 --;




'ENGLISH > Today's Writing' 카테고리의 다른 글

2009 12 14  (0) 2009.12.14
2009 10 19  (0) 2009.10.19
2009 10 06  (0) 2009.10.16
2009 10 14  (0) 2009.10.14
2009 10 06  (0) 2009.10.06
posted by 방랑군 2009. 10. 14. 10:23


Today's Writing

 

You have a friend who is about to enter university, and he wants you to advise him on which subject to specialize in – history, in which he is very interested, or computer science, which offers better job prospects.

  • You should write at least 150 words.
  • You should spend about 20 minutes on this task.




<Model Answer>

 

Dear John, 

You have asked me for my advice concerning whether you should study history or computer science at university, and I will try to make some useful suggestions. 

You must keep in mind that, above all, your university training is a preparation for your future career. Therefore, your first consideration should be to study a subject which will best equip you to earn a living. There is no doubt that the field of computers offers far wider job opportunities than history. 

Besides, we are now in the age of the high-technology revolution. For the foreseeable future, not only will it be necessary for everyone to be computer-literate, it will also be necessary for them to be equipped with computer skills merely to earn a living! History, I’m afraid, however fascinating it may be, offers few career prospects. 

Of course, you don’t have to devote all your time at university to studying computers and nothing else. On the contrary, I would recommend that you keep your reading of history in your spare time. That way, you will find that your leisure hours are enriched while you prepare yourself for a worthwhile career in computers. 

Yours sincerely, 

James

'ENGLISH > Today's Writing' 카테고리의 다른 글

2009 12 14  (0) 2009.12.14
2009 10 19  (0) 2009.10.19
2009 10 06  (0) 2009.10.16
2009 10 15  (0) 2009.10.15
2009 10 06  (0) 2009.10.06
posted by 방랑군 2009. 10. 8. 14:06


  나에게는 나만의 고집이 있는 거 같다...
나만이 그럴꺼라는 흐름...

 그 흐름이라는 것이 아닌 것 같은 느낌이 오면 틀리더라도 확인을 하지 않고
결정을 하는 행동을 한다. 잘못 된다는 것은 많은 시간과 돈이 들고 서야...
그 잘못 되었다고 생각된것이 내가 틀렸다고 알아차리기 전까지 정답이 옆에 있음에도
불구하고 내 느낌의 답을 밀고 물어지는 경향이 있다...

 시제... 이거 정말 나에게는 그걸 바로바로 보여주는 문제다..
이걸 하며 내 일반적인 생활 모습에서도 그런 것을 알게 해준다....

 정답은 부지런해야 한다... 게을러서 확인을 하지 않고 쉽게 얻을려고 하는 내 모습에서
나오는 판단인 것이다 ...

EX)
You have just spent a weekend staying at the Lilo Hotel in Adelaide. When you get home you find that you have left a bag at the hotel.

 이걸 읽고 판단하는데 있어서 나는 많은 문제점을 들어내고 있다.
그냥 그 문장을 보지 않고 말이다 --;

1. 현재 집에 와 있는데 리오 호텔에서 보낸 것에 왜 완료형을 썼을까?
   집에오기 직전까지 보낸 것을 의미하기 위해?
   호텔에서 집오는 중간 과정은 호텔에 있지 않았는데 왜 완료형을 썼을까 이다...
   이때부터 뒷문장의 시제는 모두 의심의 대상이 되어 버린다 -00

2. a weekend staying at the Lio Hotel...
   앞 뒤 시제 생각 없이 "a weekend stayed at the Lio Hotel..."
   이것도 되지 않을까? 란 생각을 한다...
   이때부터 전체 내용은 중요치 않게 된다.. (--;)
    a weekend staying 맞고 a weekend stayed 맞지 않을까란 생각을 굴리며
  상황을 생각한다. 두개의 차이점은 멀까...
  동시동작?  완전히 보낸 주말 .. 완료된 시점..
  틀린 말일까? 어떤 걸써도 의미는 비슷하지 않을까..
  듣든 사람 대충 알아듣지 않을까? 등등...

3.   have left
    이건 뭥미.....


    귀찮다... 위 문장 볼때 느꼈던 궁금증 쓰기.. --;




'ENGLISH' 카테고리의 다른 글

so .... as ... 구문들  (0) 2009.10.21
목적보어... 형용사  (0) 2009.10.19
[동사] 동사의 변형과 우리말의 어미변화  (0) 2009.10.19
and, or, but 의 사용법  (0) 2009.10.19
[문법] 영어 테스트 사이트 좋은 곳  (0) 2009.10.06
posted by 방랑군 2009. 10. 7. 11:24

참조 : http://dalbong2.net/entry/C-20-iterators
         http://www.hoons.kr/board.aspx?Name=cshaptip&BoardIdx=1021&Page=1&Mode=2

1. Iterators

using System; 
using System.Collections.Generic; 
class Test 

  public static void Main() 
  { 
       foreach (string s in GetItems()) 
           Console.WriteLine(s); 
  }

  private static IEnumerable GetItems() 
  { 
       yield return "Hello yield 1"; 
       yield return "Hello yield 2"; 
       yield return "Hello yield 3"; 
       yield return "Hello yield 4"; 
       yield return "Hello yield 5"; 
  } 


"yield return" 문이 있는데, iteration의 다음 값을 반환한다고 한다. 
"yield break" 문도 있단다. 

『The yield return statement produces the next value of the iteration. 
  The yield break statement indicates that the iteration is complete.』 

GetItems() 메소드의 리턴 타입이 IEnumerable 이라는 것도 주목할 부분이다. 


참조 문서 
c# 2.0 iterators - 
http://community.bartdesmet.net/blogs/bart/archive/2006/07/06/4121.aspx

2. Partial

// MyForms1.cs
partial public class MyForms
{
  public BusinessLogic(){}

// MyForms2.cs
partial public class MyForms
{
  public PresentationLogic(){}
}

Partial 클래스는 하나의 클래스를 여러 개의 파일로 나누어 작성할 수 있는 기능이다. 이 기능은 Windows Forms이나 Web 응용 프로그램을 협업으로 개발해 왔다면 가장 크게 매력을 느낄 것이다. Partial 클래스를 이용하면 한 클래스를 여러 가지 로직(비즈니스 로직과 프리젠테이션 로직)으로 나누어 개발할 수 있다. 물론 각 로직을 각각의 클래스로 구현하는 것이 바람직했지만, Forms 클래스는 어쩔 수 없이 여러 로직이 공존할 수 밖에 없는 경우가 많았다(특히 프리젠테이션 로직은 자동으로 생성되는 코드가 대부분이다). 비단 그러한 문제가 아니더라도 여러 명의 개발자가 자신이 맡은 메쏘드를 나누어서 개발할 수 있다면, 이보다 더 좋은 협업 방법이 없을 것이다. 이는 형상 관리 측면에서도 큰 이점을 제공한다.

Partial 클래스는 기존의 클래스 앞에 partial 키워드를 추가하여 작성할 수 있다. 물론, partial 키워드를 사용한 클래스는 여러 파일에 나뉘어 존재할 수 있다.
위 소스의 MyForms 클래스는 비즈니스 로직을 구현한 MyForms1.cs 파일과 프리젠테이션 로직을 구현한 MyForms2.cs 파일로 나뉘어져 있다. 컴파일러는 이와 같이 나뉘어져 있는 파일을 조합하여 하나의 MyForms 클래스를 작성한다.

Partial 클래스를 작성할 때 다음과 같은 사항을 유의해야 한다.

1. Partial 클래스는 동일한 어셈블리/모듈(dll 또는 exe)에 존재해야 한다.
2. 한번이라도 partial로 선언된 클래스는 모두 동일하게 partial로 선언되어야 한다.

partial public class MyForms {}

public class MyForms {} // 컴파일 오류

3. Generic으로 사용될 매개 변수들이 일치해야 한다.
4. public/private/protected/internal 등을 사용할 수 있다.
5. 중첩된 클래스에 대해서도 Partial 클래스를 작성할 수 있다.
6. Partial 클래스에 적용된 특성(Attribute)들은 컴파일 시에 모두 병합된다.

3. Nullable
 만약 값 타입과 참조 타입의 큰 차이점이 무엇이냐고 묻는다면, 널(null) 값을 설정할 수 있는지의 여부일 것이다. 참조 타입은 널 값을 설정할 수 있는 반면 값 타입은 불가능하다. 이는 값 타입 입장에서 보면, 상당히 불합리한 처우가 아닐 수 없다. 왜 값 타입은 언제나 초기화가 필요한 것일까? 참조 타입은 널 값을 설정함으로써 구체적으로 객체를 생성하는 것을 뒤로 미룰 수 있지만, 값 타입은 변수를 선언함과 동시에 개발자가 원하든 원하지 않든 간에 어떤 값으로 설정되기 때문에 개발자가 할 수 있는 일이라곤 0이나 -1을 널 대신 사용하는 정도이다. 0과 -1이 해당 변수에서 특별한 의미를 지니고 있다면, 그나마도 불가능하다.

Nullable 타입은 기본 타입에 물음표(?)를 추가하여 선언한다. 예를 들어, int?와 같이 선언하면 기본 타입인 int의 Nullable 타입이 선언된다. 이 때 선언된 타입은 널인지에 대한 여부를 확인할 수 있는 기능을 지원한다는 점을 제외하면 내부적으로 기본 타입(int 형)과 동일하다. 이와 같은 기능이 가능한 이유는 바로 Generic 덕분이다.

 <리스트 3> Nullable 타입의 예

int? x;
if (x != null)
  Console.WriteLine(x.Value);
else
  Console.WriteLine("Null");

C# 언어 스펙을 보면 Nullable 타입은 다음 <리스트 4>와 같이 HasValue와 Value 속성을 노출하는 Generic 구조체이다. 이때 HasValue가 false이면 널인 경우이고 HasValue가 false일 때, Value 속성 값을 설정하면 System.InvalidOperationException 예외가 발생하도록 구현되어 있다.

 <리스트 4> Nullable Generic 클래스의 기본 구조

public struct Nullable where A : struct {
  bool HasValue { get; }
  A Value { get; }

  public Nullable(A value);
}

따라서 int? x = 123; 과 같은 코드를 작성하면 컴파일러는 Nullable x = new Nullable(123); 을 생성한다.

지금까지 Nullable 타입에 대해서 간단하게 살펴보았는데, Nullable 타입은 탄생 배경부터 여러 가지 이슈들을 동반하고 있다(예를 들면, int?와 int??의 사용). 따라서 Nullable 타입에 관한 보다 자세한 정보는 MSDN의 블로그를 통해서 확인하도록 한다.@




'IT > C#' 카테고리의 다른 글

닷넷 트랜잭션 정리  (0) 2009.09.30
C#2.0 , C# 3.0 New Features  (0) 2009.09.15
C# 3.0 개요  (0) 2009.09.11
[C# 2.0] Generics, Iterator, Anonymous, Partial  (0) 2009.08.24
[.net Framework] System.Activator 객체  (0) 2009.08.24
posted by 방랑군 2009. 10. 7. 10:47

미니 팝업창

트레이 아이콘


모니터 제어

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        // 모니터 ON/OFF 관련

        const int WM_SYSCOMMAND = 0x0112;
        const int SC_MONITORPOWER = 0xF170;
        const int MONITOR_ON = -1;
        const int MONITOR_OFF = 2;
        const int MONITOR_STANBY = 1;

        [System.Runtime.InteropServices.DllImport("User32")]
        private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);
        }
    }
}

posted by 방랑군 2009. 10. 6. 16:47



DI (Dependency Injection)은 크게 보면 객체간 의존성을 객체에게 맡기는 것이 아니라, 컨테이너가 필요한 시점에 필요한 관련 객체를 만들어 의존성을 해소시켜주는 것이며, 이 과정에서 자연스럽게 생성한 객체들의 라이프 싸이클을 관리하는 기능도 제공하게 된다. 따라서 DI 컨테이너를 사용할 경우에는 이를 사용하지 않을 때에 비해 성능상 약간의 영향을 받게 된다. DI 컨테이너를 사용치 않았을 때는, 다른 객체를 필요로하는 주체가 필요한 객체의 생성자를 직접 호출하여 사용하였기 때문에 직관적이며 이렇게 생성된 코드는 다른 사람이 이해할 때 훨씬 쉬운 면이 있다. DI 컨테이너가 개입되면 객체 생성이 간접적으로 이루어지기 때문에 성능상 약간의 오버헤드도 감안해야 하며, 컨테이너 자체에 대한 교육이나 이해가 필요하게 되어  전반적으로 프로젝트의 복잡도는 약간 증가하게 된다. 따라서, 유행처럼 DI 컨테이너에 대한 관심이 증가하고 있지만, 개발하는 프로그램의 성격상 객체간 의존성이 많지 않고, 의존성이 있다손 치더라도 그다지 복잡하지 않은 경우에는 DI 컨테이너의 사용은 추천할만한 것이 못된다. 객체간 혹은 클래스가 의존성이 많고 복잡하며 이의 해소를 컨테이너에 의지하여 추상화하고자 할때 혹은 런타임시에 이들 객체간 의존성을 변경할 필요가 있을 시에는 Unity와 같은 DI 컨테이너의 적용을 고려해볼 만 하다.

'GET > FrameWork' 카테고리의 다른 글

방랑이가 생각하는 Spring.NET...  (0) 2009.10.06
Spring.NET - 레퍼런스 문서 한글화 사이트..  (0) 2009.09.30
객체의 생명주기  (0) 2009.09.30
Spring 컨테이너와 아키텍처 구성  (0) 2009.09.30
Spring.NET 생명 주기  (0) 2009.09.30
posted by 방랑군 2009. 10. 6. 16:26
posted by 방랑군 2009. 10. 6. 15:30


 난 국어가 약하다. 언어로써 받아들이는 능력이 정말 형편없다는 걸 느낀다 ... --;

Spring framework 가장 중요한 것은 IoC 컨테이너다.

 먼 뜻일까? 먼가 거대한 숨어있는 기술이 있을거라고 생각하며
수많은 레퍼런스와 사이트를 뒤지며 간단히 설명하는 것을 찾기 위해
삽질하기 수일...
 허망 그 자체 --;

Spring 프레임워크는 AOP 기반 프레임워크라고 한다..
ㅋㅋ AOP...
개념은 "타겟 객체에 대한 호출을 중간에서 인터셉트할 수 있는 방법"이라는 것이다.

나에게 있어서 Spring 는 자유로움 빼았긴 프레임워크이다...

 아주 간단히 설명해서...
프레임워크에 필요한 설정과 바뀔수 있는 값들을 config 항목 즉, Spring  에서 정한
원칙적인 XML 틀에서 움직이는 프레임워크이다..
즉, Config 항목을 XML 의 항목을 다 알고 있어야 쓸수 있다느 것이다..

된장...... 이거 정말 안좋다...

1. 언제 그 항목을 다 마스터 하냐는 것이다....
   다 알아야 머가 필요없는지 뺄꺼 아닌가 ㅋㅋ
2. 기술 구현 프레임워크도 부담스러운데 거기다가 환경파일까지 ...
   부담이 2배다...
3. 사용자 CONFIG 를 하려면 .... 이건 확인 안해봤지만,
   된다면 지겨운 정해진 CONFIG 를 알려고 하기보단
   자기에 맞는 CONFIG 구성해서 기술구현에 끼워맞출려고 할 것이다.
4. 무엇보다 남 만든거 맞추는 거 정말 싫다...

역쉬 안좋다 --;

 이제 그만하련다 Spring ...
IoC 부분은 그만하고 각 필요한 부분의 기술만 좀 보고 말련다..

Spring 별로 매력없다..



   
posted by 방랑군 2009. 10. 6. 10:22

다른 것도 있으나 문법적으로 사지 선다형이므로 확인 공부하는 것으로 좋아 보임.

http://www.carmenlu.com

'ENGLISH' 카테고리의 다른 글

so .... as ... 구문들  (0) 2009.10.21
목적보어... 형용사  (0) 2009.10.19
[동사] 동사의 변형과 우리말의 어미변화  (0) 2009.10.19
and, or, but 의 사용법  (0) 2009.10.19
시제.. 문제는 나만의 틀....  (0) 2009.10.08
posted by 방랑군 2009. 10. 6. 10:03

MP3 는 카페에서...

 

script

 Marcel thanks for posting that question.

In fact all the sentences you wrote are correct but the most common one in English is the first one, ‘I thought they would still be alive’. With adverbs like ‘still’, the most natural positioning is between the auxiliary/modal and the base verb.’ Still’ is used to say that something in the present, not the past, has surprisingly not finished. Listen to these examples:

She’s still sleeping. 
You’re not still working are you? 
They are still arguing about the phone bill.

Right, back to your sentences. Even though the first and second sentence mean the same, there is a difference in emphasis, they stress different things. What I mean is this:

I thought they would still be alive - here ‘alive’ is emphasised as the most important aspect. 
I thought they would be alive still - in this example ‘still’ is stressed as the most important aspect.

Your third sentence, 'I thought they would be still alive’, is the most unusual and unnatural way of expressing the sentence. It doesn’t sound like modern English at all so I suggest you focus on the structure presented in the first two sentences. Just choose between them according to the emphasis that you'd like to express. 

key vocabulary

 

 

 


posted by 방랑군 2009. 10. 6. 10:00

  오늘은 전체 파악만 --;


Today's Writing


You have just spent a weekend staying at the Lilo Hotel in Adelaide. When you get home you find that you have left a bag at the hotel.

  • You should write at least 150 words.
  • You should spend about 20 minutes on this task.

-- 나만의 해석 및 궁금증.
 :  let me check out. [체크하기] ??
 1.  have just spent - 보냈었다??
 2.  staying at the Lilo Hotel  - 호텔에 머무르면서??
 3. have left a bag - 가방을 남겨두고 ??
     : 왜 완료문?



<Model Answer>

 

Dear Mr. Simpson, 

I stayed in your hotel on the 23rd and 24th of October. I was in Room 603. When I arrived home, I discovered that I had left one of my bags at the hotel. Could you please check your Lost and Found Department and see if my bag is there? 

The bag is a small black leather, document case with a narrow strap. Inside the bag, you will find several business cards, a fountain pen, a small address book, three copies of a business proposal and a silver pocket calculator. These things are not very valuable in money terms, but they have a lot of personal value. 

I would appreciate it if you could contact me as soon as possible, particularly since I need the proposals for a presentation this week. If you could send the bag to me by courier service, I would be most grateful. I have arranged to pay for the service. 

Thank you for your help. 

Yours sincerely, 

Michael Johnson



-- 나만의 해석 및 궁금증.


1. 상황 제현 - 문제에 대한 답변 형식은 시험보는 사람맘




# KEY WORDS.

Lost and Found Department : 분실물 센터










'ENGLISH > Today's Writing' 카테고리의 다른 글

2009 12 14  (0) 2009.12.14
2009 10 19  (0) 2009.10.19
2009 10 06  (0) 2009.10.16
2009 10 15  (0) 2009.10.15
2009 10 14  (0) 2009.10.14
posted by 방랑군 2009. 10. 6. 09:24


직렬화란 무엇인가
영어 원어로부터 이야기를 시작해 보겠다. 시리얼(serial)이라는 표현은 영어 사전을 찾아보면 영화나 TV의 연속물, 연재물을 뜻하는 명사이거나 ‘연속적인’, ‘순차적인’이라는 의미의 형용사라는 것을 알 수 있다. 여기서 요점은 ‘순서가 있는 연속물’이라는 점이다. 2부를 1부보다 먼저 하는 경우는 없다. 컴퓨터 제품이나 소프트웨어를 구입하면 시리얼 번호라는 것을 흔하게 볼 수 있다. 시리얼 번호의 한글 번역은 ‘일련 번호’에 해당한다. 각 제품의 순차적인 번호를 적은 것이다.
serialize는 ‘serial하게 만든다’는 뜻의 동사로서, 연재물로 상영한다 또는 순서대로 나열하다라는 뜻이다. 최종적으로 이 동사의 명사화인 serialization은 ‘무엇인가를 연속적인 형태로 나열하는 행위’를 말한다.
정의하자면, 직렬화란 우리가 프로그램에서 다루고자 하는 모든 객체를 쉽게 저장하거나 네트워크로 전송할 수 있게, 컴퓨터의 가장 원초적인 자료 표현 형식인 바이트(byte)의 연속 형태로 변환하는 과정을 말한다. 당연히 디스크에 파일 형태로 저장되어 있거나 네트워크를 통해 전송받아 메모리에 저장한 바이트 연속물(byte stream)을 다시 원래의 객체로 변환하는 복원 과정도 항상 고려해야 한다. 이를 de-serialization이라 한다

[출처] 시리얼라이즈|작성자 썬더스

'IT > 기본에충실' 카테고리의 다른 글

값, 참조 타입  (0) 2009.09.30
[ASP.NET] 페이지 CacheTest  (0) 2009.09.15
[C#] pdb 파일  (0) 2009.09.15
[ASP.NET] Transfer, Redirect, Excute..  (0) 2009.09.15
기본... 여기는...  (0) 2009.09.15
posted by 방랑군 2009. 10. 6. 09:21


the Critical Skills List (CSL)

the Migration Occupations in Demand List (MODL)
posted by 방랑군 2009. 10. 5. 17:20
Microsoft BizTalk ESB Toolkit 2.0 자료가 있네요. 다운로드에서 받아보시구요.

설명은 여기를 보시면 되겠습니다.



Dd897973.6295a095-201a-4211-b4f7-552f1673f968(en-us,MSDN.10).png

Figure 2 
The architecture and components of the BizTalk ESB Toolkit

'BIZTALK' 카테고리의 다른 글

BizTalk Version  (0) 2009.12.28
SOA(Service Oriented Architecture)란?  (0) 2009.12.22
MS BizTalk Server 소개  (0) 2009.12.22
미들웨어란 무엇인가?  (0) 2009.12.22
BizTalkDTADb  (0) 2009.11.29
posted by 방랑군 2009. 10. 5. 14:44

해커스토익받아쓰기 (초급)

http://www.hackerstoeic.com/Games/dictation/start.htm

 

뉴토익대비 해커스 LC 매일매일받아쓰기 (중급)

http://www.hackerstoeic.com/Games/dictation/start.htm?smode=lc

 

토마토토익받아쓰기 (중급)

http://tomato.et-house.com/dictation/mainfrm.asp

'ENGLISH > IELTS' 카테고리의 다른 글

ielts 리딩가이드  (0) 2009.10.20
[BASE] 아이엘츠 초보가 꼭 알아둬야 할 접속사!!!  (0) 2009.10.05
posted by 방랑군 2009. 10. 5. 11:12


'ENGLISH > IELTS' 카테고리의 다른 글

ielts 리딩가이드  (0) 2009.10.20
받아쓰기 하기 좋은 사이트들..  (0) 2009.10.05
posted by 방랑군 2009. 9. 30. 16:41


 주소  : http://kune.tistory.com/category/Spring.NET


그 많은 영어를 한글화 하시고 있는 분이다...
맨땅에 헤딩을 안해주시고 있어서 고맙긴 한데......

 핵심 기술만 알고 프로젝트에 적용하고 싶은 FRAMEWORK 은 아니다 .. 솔직히.....


-- 중요 포인트 --

1. Spring framework 의 가장 중요한 것은 IoC 컨테이너다.   
   - 이것만 다룰줄 알면 될 듯....

2. Spring.NET은 all or nothing 솔루션이 아니며모듈은 독립적으로 기능을 사용할 수 있다.
   - 필요한 것만... 물론, 핵심인 결정해야하는 단 한가지는비즈니스 로직을 Spring IoC 컨테이너를 이용하고 웹 레이어를 WebApplicationContext 와 멀티티어 서비스를 제공하느냐 이다.[Spring.Core 인 듯..]

3. 모듈

2.3. 모듈

Spring framework 는 잘구성된 모듈로서 많은 특징을 아래의 그림과 같이 가진다아래 그림은Spring.NET의 핵심 모듈을 보여준다.

Spring.Core 는 어플리케이션에서 DI를 사용하도록 설정하는 가장 기초적인 부분을 담당한다

Spring.Aop 는 Aspect-Oriented Programming ( 이하 AOP) 의 공통 기능을 수행한다. Spring  aspect 라이브러리는 transaction, logging, performance monitoring, caching, method retry, exception handling 에 사용하기 쉽게 정의되어 있다.

Spring.Data  data에 access하기 위해 더 효율적이고 일관된 기능을 제공한다

Spring.Data.NHibernate   ADO.NET  NHibernate 수행을 같은 transaction 에서 쉽게 제공하기위해Spring 의 선언적 transaction 관리 모듈이다. NHibernate 1.0 사용자는 data access 동작 수행을 API를 통해 쉽게 사용할 수 있다.

Spring.Web, Spring.Web.Extensions  ASP.NET web 어플리케이션 의 추상화 레벨로서databindingvalidation, page/control/module/provider 구성의 공통적인 방법을 효율적으로 제공한다.

Spring.Services  .NET remoting, Enterprise Service, ASMX web service같은 분산 기술에서 사용하는 .NET 개체를 처리하기 위한 모듈. 이런 서비스는 AOP 의 'decorated' 와 DI을 통해 구성할 수 있다

Spring.Testing.NUnit  NUnit 를 통해통합 테스트를 위한 모듈 제공

Spring.Core 모듈은 다음과같은 기능을 추가적으로 제공한다.

l  Expression Language - 런타임에 개체의 조작과 효율적인 쿼리 제공

l  Validation Framework - 비즈니스 개체의 복잡한 유효성 확인에 선언적이거나 프로그래밍적 방법을 제공하는 견고한 UI agnostic 프레임워크

l  Data binding GGramework - 데이터 바인딩을 수행하는 견고한 UI agnostic 프레임워크

l  Dynamic Reflection - 높은 성능의 reflection API 제공

l  Threading - Latch, Semaphore, Thread Local Storage 같은 additional 동시성의 추상화를 제공

l  Resource abstraction - file 로 부터의 InputStream 과 다형성과 프로토콜 독립적인 방법의 URL 을 처리하는 공통 인터페이스 제공

    
 


'GET > FrameWork' 카테고리의 다른 글

DI (Dependency Injection) 관련 프레임워크.  (0) 2009.10.06
방랑이가 생각하는 Spring.NET...  (0) 2009.10.06
객체의 생명주기  (0) 2009.09.30
Spring 컨테이너와 아키텍처 구성  (0) 2009.09.30
Spring.NET 생명 주기  (0) 2009.09.30
posted by 방랑군 2009. 9. 30. 15:32

참조 : http://resisa.tistory.com/52

이번 포스트에서는 클래스의 생성자와 소멸자를 통해서 객체의 생명주기에 대해서 알아보고 난 후에 Spring.NET에서 IoC컨테이너에서 객체의 생명주기에 알아보겠습니다.

먼저 변수는 값 타입과 참조 타입이 있으며 값 타입에는 int, double, char 등이며 참조 타입은 class 등입니다. 값 타입은 스택이라는 영역의 메모리에 저장됩니다. 반면에 참조 타입은 new라는 연산자를 통해서 객체가 생성되면 멤버변수들은 힙이라는 영역의 메모리에 저장되며 이 객체 변수는 힙 영역에 메모리를 가리키는 주소값을 가지며 스택에 저장이 됩니다. 그래서 참조 타입이라고 불립니다. 그리고 .NET에서는 가비지 수집기가 존재하여 C++에서 처럼 delete를 해주지 않아도 시점을 알 수는 없지만 가비지 수집기가 힙 영역에 사용하지 않는 메모리를 정리를 해줍니다. 그렇다면 .NET에서는 메모리에 대해서 개발자는 신경쓰지 않아도 될까요? 정답은 상황에 따라서 다릅니다. 우리가 선언하는 변수를 리소스라고 생각할 때 리소스에는 두 가지가 존재합니다. 바로 관리되는 리소스와 네이티브 리소스입니다. 관리되는 리소스는 사용자가 직접 만든 클래스나 .NET Framework에서 제공하는 클래스입니다. 네이티브 리소스는 파일핸들이나 API를 사용하는 리소스입니다. 이 네이티브 리소스는 힙 외부에 할당된 메모리를 사용하기 때문에 가비지 수집기에서 메모리를 해제할 수 없습니다. 네이티브 리소스를 사용하는 프로그램에서는 이 부분에 대한 메모리를 관리해주어야 메모리 누수가 발생하지 않게 됩니다. 그러면 이러한 리소스들을 정리해주는 IDisposable 패턴에 대해서 알아보고 객체의 수명주기에 대해서도 알아보도록 하겠습니다.

public class DisposableClass : IDisposable

{

    private SqlConnection connection;

    private IntPtr fileHandle;

 

    public DisposableClass()

    {

        System.Diagnostics.Debug.WriteLine("생성자입니다.");

    }

 

    ~DisposableClass()

    {

        Dispose(false);

        System.Diagnostics.Debug.WriteLine("소멸자입니다.");

    }

 

    [System.Runtime.InteropServices.DllImport("Kernel32")]

    private extern static Boolean CloseHandle(IntPtr handle);

 

    public void Dispose()

    {

        Dispose(true);

        GC.SuppressFinalize(this);

 

        System.Diagnostics.Debug.WriteLine("Dispose() 호출.");

    }

 

    protected virtual void Dispose(bool disposing)

    {

        if (disposing)

        {

            if (connection != null)

                connection.Dispose();

        }

 

        if (fileHandle != IntPtr.Zero)

        {

            CloseHandle(fileHandle);

            fileHandle = IntPtr.Zero;

        }

    }

 

}

=> DisposableClass 클래스는 관리되는 리소스인 SqlConnection과 네이티브 리소스인 IntPtr를 멤버변수로 가지고 있습니다. 또한 IDisposable 상속받아 구현하고 있는 것을 볼 수 있습니다. 여기서 IDisposable 패턴에 대해서는 자세히 설명하지 않겠지만 Dispose 메소드에서는 Dispose메소드가 호출이 되면 소멸자를 호출할 필요가 없다는 것을 가비지 수집기 에 알려주기 위한 부분(GC.SuppressFinalize(this))이 있으며 매개변수를 가지고 있는 Dispose 메소드가 있어 매개변수가 true일 때는 관리되는 리소스와 네이티브 리소스를 모두 정리하는 것을 알 수 있지만 false일 때(소멸자에서)는 네이티브 리소스만을 정리하는 것을 볼 수 있습니다. IDisposable 패턴에 대한 자세한 사항은 아래의 사이트를 참고 하세요.
http://msdn.microsoft.com/ko-kr/magazine/cc163392.aspx

그러면 이제 DisposableClass 클래스를 생성하도록 해보겠습니다.
 1번 : using 키워드 미사용
DisposableClass disposableClass = new DisposableClass();
 2번 : using 키워드 사용
using (DisposableClass disposableClass = new DisposableClass())

{

      

}

=> 2번처럼 using키워드를 사용하면 자동으로 Dispose메소드를 호출해주어 리소스를 해제시켜주는 것을 알 수 있습니다. 이렇게 using 키워드를 사용하기 위해서는 당연히 IDisposable
상속받아 구현해주어야 합니다.

여기서 저는 한가지 궁금증이 생겼습니다. SqlConnection과 같이 관리되는 리소스를 using키워드와 함께 객체로 생성하면 변수 connection의 값도 모두 해제되는 것인줄 알았습니다. 하지만 Dispose메소드는 변수 connection의 멤버변수들(리소스)을 해제해주는 것이지 connection의 값(참조주소)이 해제되는 것은 아닙니다. 물론 이 참조값은 int형의 4바이트뿐이 안됩니다. 또한 이 값은 가비지 수집기에 의해서 해제가 됩니다. 가비지 수집기는 어떻게 이 참조값을 해제해주는지 알 수 없지만 가비지 수집기에 명시적으로 이 값을 해제시키는 방법은 있습니다. 바로 connection변수에 null를 넣어주는 것입니다. GC.Collect()란 메소드는 명시적으로 가비지 수집기에게 메모리를 정리하라는 것을 알려줍니다. 만약에 connection변수에 null이란 값을 넣어주고 GC.Collect()를 호출하면 connection변수의 참조값을 바로 해제해줍니다. 실제적으로 코드가 생성되는 것을 한번 살펴보아야 확실히 알 수 있겠지만 제 생각으로는 uisng키워드에서 생성된 객체는 {}에서만 사용할 수 있으며 다른 곳에서는 사용할 수 없는 값이기 때문에 아마 {}안에서 마지막에 null를 대입해주는 것이 아닐까라는 생각이 듭니다.
posted by 방랑군 2009. 9. 30. 15:21

참조 : http://resisa.tistory.com/53

저번 포스트에 이어서 Spring 컨테이너 대해서 아키텍처와 함께 알아보도록 하겠습니다. 먼저 일반적으로 아키텍처를 구성은 프리젠테이션 레이어(PL) -> 비지니스 로직 레이어(BLL) -> 데이터 액세스 레이어(DAL)로 구성되고 모든 레이어에서는 테이블과 매핑되는 도메인 모델을 참조합니다. 이번 포스트에서는 비지니스 로직 레이어에 해당하는 클래스와 데이터 액세스 레이어에 해당하는 클래스를 만들고 두 레이어 간의 관계를 DI기능과 함께 살펴보도록 하겠습니다.

먼저 DAL에 클래스를 먼저 살펴보겠습니다.

public class DAL

{

    public DAL()

    {

        System.Diagnostics.Debug.WriteLine("데이터 생성자 호출");

    }

 

    ~DAL()

    {

        System.Diagnostics.Debug.WriteLine("데이터 소멸자 호출");

    }

 

    public void ExcuteDal1()

    {

        System.Diagnostics.Debug.WriteLine("데이터 Excute1() 호출");

    }

 

    public void ExcuteDal2()

    {

        System.Diagnostics.Debug.WriteLine("데이터 Excute2() 호출");

    }

 

    public void ExcuteDal3()

    {

        System.Diagnostics.Debug.WriteLine("데이터 Excute3() 호출");

    }

}

=> 생성되는 시점과 소멸되는 시점을 알기 위해서 출력창에 스트링을 찍어줍니다. 그리고 3개의 메소드를 가지고 있습니다. 실질적으로 여기서 DB와 커넥션을 하기 위한 패턴이나 프레임워크를 사용하여야 하는데 이번 포스트의 목적은 아키텍처 관점에서 두 레이어 사이의 관계와 레이어에서 생성되는 객체의 생명주기에 대해서 알아보기 위한 것이므로 생략하였습니다.

그럼 이제 BLL클래스를 만들어 보겠습니다. 2가지 방식으로 BLL 클래스를 만들어 보도록 하겠습니다.
1번째로 DAL클래스를 멤버변수로 가지고 있을 경우입니다.

public class BLL

{

    private DAL dal = new DAL();


    //private DAL dal;

 

    //public DAL Dal

    //{

    //  get { return dal; }

    //  set { dal = value; }

    //}


   
public BLL()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 생성자 호출");

    }

 

    ~BLL()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 소멸자 호출");

    }

 

    public void ExcuteBll1()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 Excute1() 호출");

 

        dal.ExcuteDal1();

        dal.ExcuteDal2();

    }

 

    public void ExcuteBll2()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 Excute2() 호출");

 

        dal.ExcuteDal2();

        dal.ExcuteDal3();

    }

}


2번째로는 BLL클래스의 메소드 안에 DAL클래스를 사용하는 경우입니다.

public class BLL

{

    public BLL()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 생성자 호출");

    }

 

    ~BLL()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 소멸자 호출");

    }

 

    public void ExcuteBll1()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 Excute1() 호출");

       

        DAL dal = new DAL();

        dal.ExcuteDal1();

        dal.ExcuteDal2();

    }

 

    public void ExcuteBll2()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 Excute2() 호출");

 

        DAL dal = new DAL();

        dal.ExcuteDal2();

        dal.ExcuteDal3();

    }

}

=> 1번과 2번에 차이는 무엇일까요? 1번에서는 BLL 객체를 만들면 DAL 클래스의 생성자가 호출이 되고 BLL 클래스의 생성자가 호출됩니다. 2번에서는 BLL 객체를 만들면 BLL 클래스의 생성자만 호출됩니다.
Spring에서 DI의 기능을 사용하기 위한 일반적인 방법은 생성자(Constructor Injection)나 프로퍼티(Setter Injection)를 이용해서 주입시키는 방법으로 바로 1번에 해당하는 구조입니다. 1번 구조로 DI기능을 이용해서 BLL 객체를 만들어보겠습니다. 1번 구조에서 new키워드를 사용한 부분을 제거하고 주석 부분을 해제한 후에 DI기능으로 DAL 객체를 생성해보겠습니다. 아래는 환경설정 파일과 컨테이너에서 BLL 객체를 가져오는 코드입니다.

<object id="dal" type="ObjectLifeCycle.DAL, ObjectLifeCycle" singleton="false"/>

 

<object id="bll" type="ObjectLifeCycle.BLL, ObjectLifeCycle" singleton="false">

  <property name="Dal" ref="dal" />

</object>

IApplicationContext ctx = ContextRegistry.GetContext();

BLL bll = ctx["bll"] as BLL;

 

bll.ExcuteBll1();

//bll.Dal = null;

//GC.Collect();

bll.ExcuteBll2();

=> 컨테이너에서 BLL 객체를 가져올 때와 1번 구조와의 차이점은 BLL과 DAL 객체의 생성시점입니다.
1번 구조에서는  위에서 말했듯이 DAL 생성자가 호출되고 BLL 생성자가 호출됩니다. 반면에 컨테이너에서 BLL 객체를 가져오면 BLL 생성자가 호출이 되고 DI기능에 의해서 DAL 생성자가 호출됩니다. 어느것이 먼저 생성되느냐에 차이점만 있습니다. 처음에 DI기능을 이용하면 프로퍼티를 호출하는 시점에 DAL 객체를 가져오는 줄 알았습니다. 하지만 BLL 객체를 생성한 이후에 바로 DI기능에 의해서 DAL 객체가 생성이 됩니다. 또한 이 구조에서는 DAL객체를 환경설정 파일에서 prototype으로 생성했지만 BLL 객체가 소멸되기 전까지 DAL 객체는 소멸이 되면 안됩니다. 왜냐하면 이전 포스트에서 가비지 수집기에 객체를 수집할 수 있는 방법으로 null을 대입해주는 방법이 있다고 하였고 위의 예에서 주석 부분을 제거하고 실행하면 예외가 발생하기 때문입니다. bll.ExcuteBll2()이 실행되기 직전에 가비지 수집기에 의해 DAL 객체가 소멸되었기 때문입니다.

그렇다면 바로 2번 구조처럼 BLL 클래스에 종속되지 않으면서 필요한 경우에 DAL 객체를 만들어서 사용하는 방법은 없을까요? 그 방법은 바로 메소드(Method Injection)로 주입해주는 방식입니다. 메소드로 주입해주는 방법은 두 가지 있으며 한 가지는 IObjectFactoryAware를 상속받는 방법과 Lookup Method Injection 방법입니다. IObjectFactoryAware 방법은 Spring 문서에서 권장을 하지 않기 때문에 두 번째 방식으로 구현해보겠습니다.
<object id="dal" type="ObjectLifeCycle.DAL, ObjectLifeCycle" singleton="false"/>

 

<object id="bll" type="ObjectLifeCycle.BLL, ObjectLifeCycle" singleton="false">

  <lookup-method name="Dal" object="dal" />

</object>


public abstract class BLL

{

    protected abstract DAL Dal();

 

    public BLL()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 생성자 호출");

    }

 

    ~BLL()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 소멸자 호출");

    }

 

    public void ExcuteBll1()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 Excute1() 호출");

 

        DAL dal = Dal();

        dal.ExcuteDal1();

        dal.ExcuteDal2();

    }

 

    public void ExcuteBll2()

    {

        System.Diagnostics.Debug.WriteLine("비지니스 Excute2() 호출");

 

        DAL dal = Dal();

        dal.ExcuteDal2();

        dal.ExcuteDal3();

    }

}

=> 환경설정 파일에서는 lookup-method란 키워드와 object라는 프로퍼티(ref가 아닙니다)를 사용하고 있음을 볼 수 있고 BLL 클래스에서는 DAL 객체를 얻기 위한 추상 메소드 Dal()과 추상 메소드를 가지기 위해서 BLL 클래스가 추상 클래스로 변경되었습니다. 그리고 이전처럼 Spring 컨테이너에서 BLL 객체를 생성하고 BLL 객체의 메소드를 실행하면 DAL 객체가 메소드마다 각각 생성되는 것을 확인하실 수 있습니다. 이외에 예제 코드를 이용해서 BLL과 DAL클래스를 singleton과 prototype으로 번갈아 가면서 설정해서 실행해보면 실제로 객체들이 언제 만들어지고 언제 사라지는지를 알 수 있습니다. 또한 Spring에서 제공해주는 AdoTemplate를 singleton으로 생성할 때의 DB커넥션 문제라던지 lookup-method방식에의 추상클래스로 인한 TDD코드 작성시에 혹 나타날 문제점이라던지 추상클래스를 Base클래스로 사용하면서 아키텍처를 구성해보는 방법 등등 여러가지 테스트가 더 필요할 것 같습니다.

2번에 걸쳐 객체의 생명주기에 대해서 알아보았습니다. 객체에 생명주기에 관심이 없으신 분들은 객체 하나 만드는데 너무 복잡한거 아니냐 가비지 수집기가 있는데 왜 그런거에 관심을 가져야 하느냐 반문 하실 수 있습니다. 하지만 진짜 프로그래머라면 어떻게 하면 좀 더 효율적으로 프로그래밍을 할 것인가에 대한 고민은 밥을 먹는것과 같은거 아닐까요?

'GET > FrameWork' 카테고리의 다른 글

방랑이가 생각하는 Spring.NET...  (0) 2009.10.06
Spring.NET - 레퍼런스 문서 한글화 사이트..  (0) 2009.09.30
객체의 생명주기  (0) 2009.09.30
Spring.NET 생명 주기  (0) 2009.09.30
Hands-on Labs for EL 4.1 and Unity 1.2  (0) 2009.09.29
posted by 방랑군 2009. 9. 30. 15:19


 Spirng.NET의 IoC 컨테이너에서 객체의 생명주기에 대해서 알아보도록 하겠습니다. 먼저 IoC는 이제까지 new라는 연산자를 사용해서 객체를 생성해주던 것을 환경설정 파일에서 객체에 대한 설정을 해주고 프로그램에서 그 객체를 사용하는 것을 의미합니다. 환경설정 파일에서 객체를 생성해 줄 때 윈폼에서는 두 가지 방법이 있습니다. 바로 singleton과 prototype입니다. 아래는 두 가지 방식입니다. 디폴트로 singleton=true입니다.

<object id="car" type="ObjectLifeCycle.Car, ObjectLifeCycle" singleton="true"/>

 

<object id="car" type="ObjectLifeCycle.Car, ObjectLifeCycle" singleton="false"/> 


설정 파일에서 설정한 객체를 사용하기 위해서는 아래와 같이 사용합니다.
IApplicationContext ctx = ContextRegistry.GetContext();

 

Car car = ctx["car"] as Car;

Debug.WriteLine(car.GetHashCode().ToString());

=> IoC컨테이너를 불러와서 그 중에서 아이디가 "car"인 객체를 가져와서 그 객체의 고유한 값인 해쉬코드 값을 출력창에 보여줍니다. 이전에는 무조건 인터페이스 사용해야되는 줄 알았는데 그렇지 않는 것을 알 수 있었습니다. 그리고 여기서 singleton 방식은 해쉬코드값이 당연히 계속 같은 값을 찍을 것이고 prototype방식은 해쉬코드값이 계속 바뀔 것입니다.

다음 포스트에서는 여기에 DI기능을 추가하고 아키텍처에 Spring.NET를 사용할 경우에 객체의 생명주기를 어떤 방식으로 해야 더 효율적인가에 대해서 알아보도록 하겠습니다~
posted by 방랑군 2009. 9. 30. 15:17

1. prototype 패턴 (쌍둥이)
이미 생성된 객체를 복제해서 새로운 객체를 생성하는 방법

(게임블리오에서 clone() 개념으로 오브젝트의 정점 구성정보는 같지만 위치행렬와 같이 서로 다른 정보를 가져야하는것은 다르게 할수 있다)

- 객체 생성 방식이나 구성 형태, 표현 방식 등과 무관하게 객체를 생성 하고 싶을때 유용
- 생성할 객체가 run-time 시에 결정 되어 질때 유용


2. singleton 패턴 (단 한개!)
객체가 생성되는 개수를 제한 하는 형태의 설계가 singleton 패턴 이라 하고 극단적으로 제한되는 객체의 개수가 1개일 때를 감안한 패턴 (최대 N개 까지만 객체를 생성 하도록 제한)
- 패턴 구현시 모든 생성자는 protected 영역에 정의 되어야 함.
- 상속 관계에 놓인 클래스들에 대해 전체적으로 생성되는 객체의 최대 개수를 제한 하고자 할때 유용

'GET > Patten' 카테고리의 다른 글

singleton pattern 싱글톤 패턴  (0) 2009.09.30
posted by 방랑군 2009. 9. 30. 15:04
변수는 값 타입과 참조 타입이 있으며 값 타입에는 int, double, char 등이며 참조 타입은 class 등입니다. 

 값 타입은 스택이라는 영역의 메모리에 저장됩니다. 

 반면에 참조 타입은 new라는 연산자를 통해서 객체가 생성되면 멤버변수들은 힙이라는 영역의 메모리에 저장되며 이 객체 변수는 힙 영역에 메모리를 가리키는 주소값을 가지며 스택에 저장이 됩니다. 
그래서 참조 타입이라고 불립니다.

'IT > 기본에충실' 카테고리의 다른 글

Serialize  (0) 2009.10.06
[ASP.NET] 페이지 CacheTest  (0) 2009.09.15
[C#] pdb 파일  (0) 2009.09.15
[ASP.NET] Transfer, Redirect, Excute..  (0) 2009.09.15
기본... 여기는...  (0) 2009.09.15
posted by 방랑군 2009. 9. 30. 14:20

참조 : http://resisa.tistory.com/34


이번 프로젝트를 하면서 트랜잭션에 대해서 다시 한번 생각해보게 되었고 아래의 사이트들을 통해서 좋은 정보를 얻었다.

트랜잭션에 대한 정리를 해놓은 MS 장현춘 부장님의 블로그 링크이다.
http://kingcrap.com/entry/닷넷-트랜잭션-정리

System.Transactions(TransactionScope)
대해서 정리를 해놓은 드원테크놀로지의 유경상 수석님의 블로그링크이다.
http://www.simpleisbest.net/articles/996.aspx


위을 내용을 아주 간단히 요약을 해보겠다~
먼저 트랜잭션 처리는 1. 로컬 트랜잭션(수동) 2. 분산 트랜잭션(자동)으로 나뉜다. 가지의 방법은 서로 장단점있는데 속도의 측면에서는 로컬 트랜잭션이 편리성 측면에서는 분산 트랜잭션이 좋다. 하지만 TransactionScope 사용하면 Promotion이라는 기능이 있고(TransactionScope 트랜잭션이 발생할  로컬 또는 분산 트랜잭션인지를 자동으로 처리해주는데 로컬 트랜잭션으로 실행하다가 다른 DB 접속을 하는 순간에 자동으로 분산 트랜잭션으로 전환이 되는데 이러한 것을 Promotion이라고 한다.) 이러한 Promotion MSSQL 2005, 2008에서만 지원을 한다고 한다.
이번에 내가 프로젝트에서 DB Oracle여서 TransactinoScope 사용하려고 했더니 oramts.dll 필요하다며 예외가 발생했다. Ora MTS 설치하면 TransactionScope 사용할 있었다.

Ora MTS
대해서는 아래의 링크를 보자.
http://www.simpleisbest.net/archive/2005/08/23/208.aspx

다음은 Ora MTS 다운받는 링크이다.
http://www.oracle.com/technology/software/tech/windows/ora_mts/htdocs/utilsoft.html

테스트 환경은 윈도우 서버 2003에서 Oracle 9i 클라이언트와 Ora MTS 9.2.0.7.0 버전을 사용해서 해본 결과 TransactionScope 사용할 있었다. 위의 첫번 링크(장현춘님) 가보면 비스타에서도 Ora MTS 10.2.0.4.0버전을 사용해서 분산 트랜잭션으로 MSSQL Oracle 묶어 프로젝트에서 사용하고 있다는 말이 제일 마지막에 나온다. 하지만 비스타에서 Ora MTS(버전:10.2.0.1, 10.2.0.2) 설치 오류가 나서 테스트를 해볼 수가 없었고 Ora MTS 10.2.0.4.0버전을 구할 수도 없었다. 아마 무엇인가 문제가 있어서 배포를 잠시 중단한게 아닌가 싶다.

<<
수정일자 : 1220>>
Ora MTS 10.2.0.4.0
버전이 아니라 Oracle Database 10g Release 2 (10.2.0.4.0) Patch Set 버전이다. Ora MTS 10.2.0.2.0 설치하면 된다. 또한 Ora MTS 오류가 나는 것의 원인은 Office 2007 때문이였다. 설치를 하다가 javaw.exe프로세스가 종료되었다는 메시지와 함께 설치가 종료되는데 Office 지우고 설치를 하면 설치가 된다. 이것이 설치되었다고 해서 비스타에서TransactionScope 사용해서 분산 트랜잭션을 사용할 있는 것이 아니다. Oracle Database 10g Release 2 (10.2.0.4.0) Patch Set까지 설치해야한다. Oracle Meta Link에서 이것을 다운을 받을 있는데 Meta Link 오라클과 계약을 맺어 인증번호가 있어야 사용할 있다. 패치까지 받고 테스트는 안해봤지만 아마도 것이다사용자등록을 했는데 관리자가 있어 패스워드를 받아야한다. 하나 해보기 힘들다. 차후에 패치를 받고 테스트를 마친후에 정리를 해야할꺼 같다.

저작자 표시비영리


기사 보기...

'IT > C#' 카테고리의 다른 글

C#2.0 Iterators,Partial 클래스,Nullable 타입  (0) 2009.10.07
C#2.0 , C# 3.0 New Features  (0) 2009.09.15
C# 3.0 개요  (0) 2009.09.11
[C# 2.0] Generics, Iterator, Anonymous, Partial  (0) 2009.08.24
[.net Framework] System.Activator 객체  (0) 2009.08.24
posted by 방랑군 2009. 9. 30. 14:10



올해 초에 웹타임 교육센터에서 교육을 받은 내용을 나름대로 정리한 내용이다.

내용은 많고 시간은 부족(?)해서 설명 부분이 많이 부족하다.

그래서 버전은 0.9이다.. +_+

차후에 보완 수정하여 더욱 더 유용한(?) 자료로 거듭났으면 좋겠다 ㅋ

posted by 방랑군 2009. 9. 30. 14:04

참조 :http://elky.tistory.com/215

1 . 데이터의 결합방법

1) 가로로 연결 : JOIN

     - 의미 있는 연결을 위해서는 로우(ROW)의 공통 요소를 이용하여 연결할 경우 사용

2) 세로로 연결 : UNION

     - 컬럼(Colum)의 공통된 형식을 어기면 연결 불가

2 . JOIN

가로(수평적)로 하나의 결과 집합과 다른 결과 집합을 연결하는 것

(집합 : 테이블, 뷰, 인라인뷰, 테이블변수....)

조인의 종류

 ◎ INNER JOIN

 ◎ OUTER JOIN (LEFT , RIGHT 모두)

 ◎ FULL JOIN

 ◎ CROSS JOIN

 ◎ SELF JOIN

1) INNER JOIN

 두 집합간의 하나나 그 이상의 공통 필드들에 기반해서 레코드들을 일치

 INNER JOIN 은 배타적(exclusive) 결합 이다.

 두 집합(테이블) 모두에서 일치하는 것이 없으면 그 레코드는 반환되지 않는다.

 ▷ 구문

<ANSI>

 SELECT <선택_목록>

 FROM <결과집합1> INNER JOIN <결과집합2>  ON <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 

 SELECT <선택_목록>

 FROM <결과집합1> JOIN <결과집합2>  ON <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 

<T-SQL>

 SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2>  WHERE <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 ▷ 예제

       USE Pubs

       SELECT discounttype ,discount ,s.stor_name

       FROM discounts d JOIN stores s

                               ON d.stor_id = s.stor_id

1) OUTER JOIN

JOIN 이전에 나오는 테이블은 왼쪽(LEFT) 테이블이 되고 , JOIN 이후에 나오는 테이블이 오른쪽(RIGHT) 테이블이 된다.

LEFT OUTER JOIN 은 왼쪽 테이블로부터 모든 정보를 포함시키며

RIGHT OUTER JOIN 은 오른쪽 테이블로부터 모든 정보를 포함시킨다

 ▷ 구문

 <ANSI>

 SELECT <선택_목록>

 FROM <결과집합1> LEFT OUTER JOIN <결과집합2>  ON <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 

<T-SQL>

 SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2>  WHERE <결과집합1>.<조인조건1> *= <결과집합2>.<조인조건2>

 <ANSI>

SELECT <선택_목록>

 FROM <결과집합1> RIGHT OUTER JOIN <결과집합2>  ON <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 

<T-SQL>

SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2>  WHERE <결과집합1>.<조인조건1> =* <결과집합2>.<조인조건2>

 

▷ 예제

       USE Pubs

       SELECT discounttype ,discount ,s.stor_name

       FROM discounts d LEFT OUTER JOIN stores s

                               ON d.stor_id = s.stor_id

       USE Pubs

       SELECT discounttype ,discount ,s.stor_name

       FROM discounts d RIGHT OUTER JOIN stores s

                               ON d.stor_id = s.stor_id

 

※ OUTER JOIN 을 이용하여 일치하지 않는 레코드들 찾기

-- 할인 레코드를 가지지 않은 모든 상점들의 이름 찾기

 

       USE Pubs

       SELECT s.stor_name AS [Store Name]

       FROM discounts d RIGHT OUTER JOIN stores s

                               ON d.stor_id = s.stor_id

       WHERE d.stor_id IS NULL

3) FULL JOIN

JOIN 양쪽의 데이터를 모두 일치 시켜서 양쪽 모두를 포함시키는 것이다.

어느쪽에도 중점을 두지 않고 양쪽 모두의 데이터를 보려 할 때를 위하여 만들어진 것

간단히 FULL JOIN 은 RIGHT JOIN 과 LEFT JOIN 을 동시에 적용하는 것이라 할 수 있다.

 ▷ 구문

<ANSI>

 SELECT <선택_목록>

 FROM <결과집합1> FULL JOIN <결과집합2>  ON <결과집합1>.<조인조건1>=<결과집합2>.<조인조건2>

 

<T-SQL>

 SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2>  WHERE <결과집합1>.<조인조건1> *= <결과집합2>.<조인조건2>

 UNION

 SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2>  WHERE <결과집합1>.<조인조건1> =* <결과집합2>.<조인조건2>

▷ 예제

       USE Pubs

       SELECT discounttype ,discount ,s.stor_name

       FROM discounts d FULL JOIN stores s

                               ON d.stor_id = s.stor_id

4) CROSS JOIN

한쪽의 모든 레코드를 그 반대쪽의 모든 레코드들과 결합시킨다.

간단히 CROSS JOIN 은 '데카르트의 곱(Cartesian product)' 이라 할수 있다

CROSS JOIN 의 구문 구조는 ON 연산자가 없다는 점만 빼고는 다른 JOIN 들과 동일하다.

테스트용 데이터를 만드는 용도로 사용한다.

 ▷ 구문

<ANSI>

 SELECT <선택_목록>

 FROM <결과집합1> CROSS JOIN <결과집합2> 

 

<T-SQL>

 SELECT <선택_목록>

 FROM <결과집합1> ,<결과집합2> 

▷ 예제

       USE Pubs

       SELECT discounttype ,discount ,s.stor_name

       FROM discounts d CROSS JOIN stores s

5) SELF JOIN

필요에 의해 JOIN 구문에 같은 테이블이 두번 이상 등장하는 경우이다.

 

자신의 상급자를 매핑하기위해 SELF 조인을 사용한 예제이다.

▷ 예제

       USE Northwind

       SELECT a.EmployeeID, a.LastName, a.FirstName, b.EmployeeID, b.LastName, b.FirstName

       FROM employees a, employees b

       WHERE a.reportsTo = b.employeeid

2 . UNION

2개이상의 데이터 집합을 세로(수직적)로 연결하는 방법으로

결합되는 각 컬럼간의 형식이 일치하면 하나의 집합으로 도출 가능하다.

 

▷ 주의점

 ◎ UNION 으로 쿼리들을 결합할 때, 모든 쿼리들의 SELECT 목록에 있는 열들의 개수는 같아야 한다.

 ◎ 결합된 결과의 제일 처음에 나타날 헤더들은 오직 첫번째 쿼리에 의해서만 결합된다.

 ◎ 결합될 쿼리들의 각 열들은 동일한 데이터 형식이거나 적어도 묵시적으로 변환될 수 있는 것들이어야 한다.

 ◎ UNION 의 경우 기본적으로 DISTINCT 가 적용된다. 중복된 행을 표시하고 싶들떄는 UNION ALL 을 사용한다.

 

Northwind 에 관련된 모든사람에게 우편물을 보내고자 할 때의 UNION 을 통해 모든 사람의 주소를 가져오는 쿼리

▷ 예제

       USE Northwind

 

       SELECT CompanyName as Name, Address, City, Region, PostalCode, Country

       FROM Customers

       UNION

       SELECT CompanyName , Address, City, Region, PostalCode, Country

       FROM Suppliers

       UNION

       SELECT FirstName + ' ' + LastName , Address, City, Region, PostalCode, Country

       FROM Employees

 
3 . 요약

RDBMS 에서는 데이터를 둘 이상의 테이블에 분산시켜야 하는 경우가 많다.

따라서 JOIN 및 UNION 을 이용하여 여러 테이블들의 있는 데이터를 결합시켜 사용 할 수 있다.

 ◎ 일치하지 않는 열들을 제외하고자 할 경우에는 INNER JOIN 을 사용한다.

 ◎ 일치하는 것들을 뽑아야 할 뿐만 아니라, JOIN의 한 쪽에 있는 테이블의 모든 것들을 포함시키려 할 때는 OUTER JOIN 을 사용한다.

 ◎ 일치하는 것들을 뽑아야 할 뿐만 아니라, 양쪽에 있는 테이블의 모든 것들을 포함시키려 할 때는 FULL JOIN 을 사용한다.

 ◎ 두 테이블의 대해 행들에 기반한 데카르트 곱을 수행하려 할 때에는 CROSS JOIN 을 사용한다. 과학계산이 필요하거나 테스트 데이터를 생성할때 유용하다.

 ◎ 여러 쿼리들의 결과를 수직적으로 결합할 때에는 UNION 을 사용한다.

posted by 방랑군 2009. 9. 30. 14:03

참조 : http://elky.tistory.com/214


용어 정리
Driving Table : 조인에서 기준이 되는 테이블 (= Outer Table)
Drived Table : 조인에서 결합 되어지는 테이블 (= Inner Table)

Nested Loop
- 두개 이상의 테이블에서, 하나의 집합을 기준으로 상대방 테이블의 Row를 결합하여 원하는 결과를 추출하는 방식. (기준 테이블 한 행당, 상대 테이블 전체가 수행된다.)
- 부분 범위 처리 가능 (정지, 재개 가능. 예를 들어 조건에 만족하는 데이터 1000개만 얻어낸 상태에서, 요청이 들어올경우 1001~2000번째 값을 얻어오는 것이 가능)
- Driving Table에서 상대 테이블로 비교할 데이터 량이 적은 것이 효율에 좋다.
- 기준 테이블과 상대 테이블 간에 서로 대응하는 값에 인덱스가 걸려있는 것이 효율에 좋다.
- 특정 범위만 알아오는 쿼리에 유용.
- Any Join에서 사용 됨.

Sort Merge
- 쿼리에 따라 기준 테이블, 상대 테이블 각각 조인에 포함될 데이터들만 추려내 테이블로 구성한 후 (집합을 구성), 추린 테이블의 데이터를 정렬한다.
(상황에 따라 테이블 전체를 정렬해서 사용하는 경우도 있다.)
- 두 테이블의 크기가 다를 경우, 유후 시간 발생 (정렬 되는 시간이 동일하지 않기 때문에)
- 지그 재그 계단식 비교 방식을 취함 (읽고 있는 데이터 포인터를 기억한 후, 다음 데이터를 읽을 때 이미 읽은 위치를 다시 읽지 않는 방식으로 검색량을 줄인다.)
- 지그 재그 계단식 비교를 하기에, 겹치는 값이 존재할 경우 이미 읽은 데이터를 다시 읽어야 되는 상황이 발생하기도 한다. (같은 값이 여러개일 경우, 방금 읽었던 값도 또 읽어야 하기에) 그래서, 겹치는 값이 존재할 경우 DBMS가 Hash Join을 사용할 가능성이 높다.
- 추려진 결과가 한번에 나오고, 그 전에는 결과를 낼 수 없기에, 처리 속도가 중요한 쿼리에서는 사용되지 않는다.
- Any Join 에서 가능 하지만 주로 Equal Join 에서 유용.

Hash

- 테이블 내의 모든 데이터에 해시 함수를 적용하여 해시 버킷에 담는다. 값 별로 버킷에 나누어 담기에, 해당 버킷을 읽음으로써 같은 값을 사용하는 집합에 억세스. (버킷에 담긴 데이터를 연속으로 읽을 수 있으므로)
- 해시 테이블 구성 비용 (CPU, 메모리)이 크다.
- 값 별로 버킷에 담기기에 버킷 억세스는 같은 값을 찾는 경우에만 빠르다. 그래서, Equal Join 에서만 가능하도록 되어있다.

posted by 방랑군 2009. 9. 30. 14:02
참조 :http://elky.tistory.com/212

1. Clustered Index만 존재했을 때
CI의 정렬 기준으로 실제 데이터를 정렬해 둡니다. 데이터를 찾을 때 CI를 타느냐, 테이블 스캔 하느냐의 차이만 존재합니다. 

1-2. 구조
루트페이지와 리프페이지의 2중 구조

루트페이지에는  검색기준이  리프페이지에는 실제 데이터가 검색기준에 맞쳐 분류되어있음

쿼리시  루트 페이지에서 해당 검색기준을 통해 리프페이지(실제데이터)를 검색하여 결과처리

데이터 변경작업시 루트페이지에 맞쳐서  리프페이지를 다시 분류작업함

2.
Non-Clustered Index만 존재했을 때

이 경우 NI의 키 값 대로 정렬된 데이터가 존재하고, 키 값에 대응하는 실제 데이터의 주소 (파일, 페이지, 행번호) 를 가집니다.

NI에서의 키 값에 매칭되는 값을 찾은 후, 실제 데이터를 찾아가는 과정만큼의 비용이 필요합니다.
이 비용이 크기 때문에, 일반적으로 NI를 이용해서 찾는 데이터가 전체 데이터의 3~5%이내 일 때만 NI를 이용하고, 그렇지 아닐 경우 테이블 스캔을 합니다.

2-1. 구조
루트페이지와 리프페이지. 실제데이터의 3중구조.

루트페이지에는 검색기준, 리프레이지에는 실제데이터를 참조한 분류 ,실제데이터에는 데이터

select 시에는 3중구조임으로 클러스터형 인텍스보다 비효율적임

그러나. 데이터 변경작업시에는 실제데이터에는 변경이 없음으로 클러스터형 보다 효율적.

3. Non-Clustered Index와 Clustered Index 공존시

이 경우 NI가 실제 데이터의 행번호를 가리키는 것이 아니라, CI의 키 값을 가리킵니다.

장점은 CI가 변경될 때, NI에 적은 영향을 줍니다. (CI로 정렬 되어 있는 만큼, 테이블 중간에 데이터가 끼어들거나 삭제되면 페이지 분할등이 일어나 행번호가 바뀔여지가 있습니다. 행번호가 바뀌어도 행번호가 아니라, CI의 키 값을 가리키기 때문에 NI에 적은 영향만을 주고 데이터를 변경할 수 있게 됩니다.)

3-1. 구조
루트페이지(비클러스터형)  -> 리프페이지 (비클러스터형) ->  루트페이지 (클러스트형) -> 리프페이지 (클러스트형) 의 4중구조 (실제데이터는 리프페이지 - 클러스트형)

'IT > DB' 카테고리의 다른 글

데이터 결합 방법 정리  (0) 2009.09.30
MS-SQL 조인 내부 처리 방식 정리  (0) 2009.09.30
인덱스 정리  (0) 2009.09.30
인덱스가 있지만 인덱스를 안 타는 경우  (0) 2009.09.30
MS-SQL 실행 계획 확인  (0) 2009.09.30
posted by 방랑군 2009. 9. 30. 14:01

참조 : http://elky.tistory.com/211

데이터를 찾는 과정이 필요한 모든 일 (Select, Update, delete, Insert 모두) 에 영향을 준다.

데이터를 빠르게 찾기 위해 필요하다.

인덱스 추가시 인덱스 관리 비용(처리하는 일, 인덱스 관리용 공간 필요)

인덱스는 항상 타는게 아니다. 인덱스를 탈 때 통계를 참고하는데, 이 통계가 최적 수행 방법을 산출하려면, 통계가 최신에 가까워야 좋다.

하지만, 통계 갱신에는 비용이 존재하므로, 적절한 수위를 유지하는 것이 좋다.

인덱스가 걸려 있는 경우에는 정렬이 필요하다.  1Page가 꽉 찬 상태에서, 데이터가 중간 삽입 될 경우, 들어갈 데이터를 포함해 데이터를 반으로 쪼개서 두개의 페이지에 넣는다. 이 것을 페이지 분할이라 부른다. 

페이지 분할이 자주 일어날꺼라 생각되면 인덱스 생성시 채우기 비율 설정으로, 미리 페이지 분할 해두는 것이 가능하다.

이렇게 할 경우, 페이지를 여러개로 나누는 만큼 페이지를 읽어오는 양이 늘어나는 부담이 생긴다.
검색에 사용된 인덱스가 유니크 인덱스일 경우에는, 데이터를 찾자마자 검색 과정을 중단하면 되기에 검색시에 더 빠르다.

인덱스 검사하는 법
explain select * from Table_Name where A='a' and B='b' order by C,D,E ;
해당 쿼리문이 인덱스를 타는지 안타는지 알기 위해서는 쿼리문 앞에 explain을 붙여주면 인덱스를 타는지 안타는지 알 수 있습니다.
type의 결과값이 ALL일 경우 인덱스를 타지 않고 있습니다. range,index등일 때 인덱스를 타고 있습니다.(system,const,eq_ref,range,index,ALL,fulltext)
key의 값이 해당 쿼리문이 타고 있는 인덱스입니다.


인덱스 관련 용어 정리
-
Table Scan
인덱스를 사용하지 않고 테이블 전체를 읽는것.

- Index Seek
인덱스를 사용해서 데이터를 찾은 것.

- Random Access
 여러 데이터를 찾을 때, 순차적으로 다음행을 읽지 못하고, 데이터 하나당 검색을 수행해야 하는 경우를 말함.

- Clustered Index (CI) 
실제 데이터를 키에 따라 정렬 하는 것이다.
페이지 분할시 실제 데이터도 분할해야 하는 것이 단점이다.
범위 처리에 일반적으로 유용하다. (쿼리에 따라 다르지만)

- Non-Clustered Index (NI) 
키 + 주소로 설정된 별도의 저장소를 가진다.
일반적으로 CI보다 크기가 작으므로, 한 페이지에 많이 들어간다. 데이터 검색시 페이지 간 이동이 CI보다 적다는 장점이 있다.
키에 따라 검색이 끝나도 실제 주소를 찾으러 가야하기 때문에, 범위 처리가 CI보다 느리다.

Covered Query : Index에 포함된 값만 필요로 해서 (a, b컬럼이 복합 인덱스로 걸려 있을 때 select a, b from table), 인덱스만 읽어서 결과를 보여줄 수 있는 쿼리를 말합니다.