달력

2

« 2025/2 »

  • 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
2007. 3. 28. 09:56

Daily English 2007.03.28 생활/영어2007. 3. 28. 09:56

A : Hey, sis. What did we say about sharing personl info with a relator?
    Once they think you've got cash, they jack up the price.
B : All I said was I worked at a brokerage firm.
A : Look, just stick to the plan. Choosing the house is your thing, haggling is mine.
B : Fine.

A: 누나. 부동산중개업자에게 사적인 이야기 하는 거에 대해, 우리 어떻게 얘기했었지? 일단, 그들은 누나가 돈이 있다고 생각하면, 가격을 엄청나게 올린다고 했잖아.
B: 나는 내가 투자회사에서 일한다는 이야기만 했어.
A: 알겠어, 그냥 계획대로 하자. 집을 선택하는 건 누나고, 흥정은 내가 하는 거야.
B: 알았어.

brokerage firm : 투자회사
stick : 고수[고집]하다, (약속등을)충실히 지키다
haggle : (값, 조건 등을) 끈질기게 깎다

1. We ought to make _____ for the fact that there are language and culture gaps between us.
(A) eliminations
(B) reservations
(C) missions
(D) allowances

make allowances for ~을 고려하다
elimination 제거

2. Greer, who had invested in both earlier rounds, stayed with Federal Express for what became a ____ lucrative investment for the VC firm.
(A) very
(B) well
(C) too
(D) much

very : (형용사/부사)의 원급 수식
         현재분사, 형옹사화한 과거분사 수식
         the very + 최상급
well : 능동과 수동의ㅡ 동사 수식
        수동의 과거 분사 수식
        전치사 구/부사절 수식
too  : 부정적 의미
much : (형용사/부사)의 비교급/최상급 수식
         과거분사, 서술적으로만 쓰는 형용사 수식
        동사/too 수식
        much the + 최상급
so   : very와 거의 의미가 겹침
        that과 함께 쓰임(so ~ that ... 너무 ~ 해서 그 결과 ... 하다)
enough : 후치수식
invest in : ~에 투자하다
stay with : ~와 관계를 유지하다
lucrative : 유리한
VC(Venture Capital) : 벤처투자

3. The kids _____ about going to the zoo. They're looking forward to seeing the lions and other animals.
a : excited
b : are exciting
c : were exciting
d : were excited

excite : 흥분시키다

4. I love scuba diving. Undersea life _____ !
a : fascinates
b : is fascinating
c : fascinated
d : is fascinated

fascinate : 매혹하다, 황홀하게 하다

5. This felt-tip pen _____ really well!
   The door _____ by the janitor
a : writes - open
b : is written - was opened
c : writes - was opened
d : is written - open

수동형은 두 대상 사이의 인과관계가 분명한 경우에 쓰임

6. In an earlier statment, the governor made it clear that he opposes taxes on Internet _____.
a : servants
b : opponents
c : accusations
d : transactions

statement : 성명(서)
governor : 주지사
make it clear that ~ : ~을 분명히 하다
oppose : 반대하다
opponent : 반대자
accusation : 비난, 고소

7. After comparing several computerized billing systems, I find the Dyna-Bill to be the most _____ for our applications
a : billable
b : payable
c : suitable
d : comparable

suitable for : ~에 적합한
billable : 기소할 수 있는

8. A recent survey found that nearly half of unmarried people read a newspaper _____ eating breakfast.
a : over
b : while
c : during
d : as long as

over, during : 전치사
as long as + 절
over : ~ 하면서

9. The failure analysis found that the main system and the backup _____ not properly synchronized
a : did
b : were
c : could
d : should


'생활 > 영어' 카테고리의 다른 글

Daily English 2007.05.02  (0) 2007.05.02
DailyEnglish 2007.04.23  (0) 2007.04.23
Daily English 2007.03.22  (0) 2007.03.22
Daily English 2007.03.14  (0) 2007.03.14
Daily English 2007.03.13  (0) 2007.03.13
:
Posted by 뽀기
2007. 3. 23. 14:53

색상 코드표 입니다 생활/정보2007. 3. 23. 14:53


 

※ 원하는 색깔을 드래그해서 복사하십시오.
#93DAFF #98DFFF #9DE4FF #A2E9FF #A7EEFF #ACF3FF #B0F7FF #B4FBFF #B9FFFF #C0FFFF
#87CEFA #91D8FA #A5D8FA #AFDDFA #B9E2FA #C3E7FA #CDECFA #D7F1FA #E1F6FA #EBFBFF
#00BFFF #0AC9FF #14D3FF #1EDDFF #28E7FF #32F1FF #3CFBFF #46FFFF #96FFFF #C8FFFF
#00A5FF #00AFFF #00B9FF #00C3FF #00CDFF #00D7FF #00E1FF #00EBFF #00F5FF #00FFFF
#1EA4FF #28AEFF #32B8FF #3CC2FF #46CCFF #50D6FF #5AE0FF #6EE0FF #6EEAFF #78F3FF
#1E90FF #289AFF #32A4FF #3CAEFF #46B8FF #50C2FF #5ACCFF #64D6FF #6EE0FF #78EAFF
#96A5FF #A0AFFF #AAB9FF #B4C3FF #BECDFF #C8D7FF #D2E1FF #DCEBFF #E8F5FF #F4FFFF
#86A5FF #90AFFF #9AB9FF #A4C3FF #AECDFF #B8D7FF #CCE1FF #E0EBFF #EBF5FF #F9FFFF
#6495ED #6E9FED #78A9ED #82B3ED #8CBDED #96C7ED #A0D1F7 #AADBFF #B4E5FF #BEEFFF
#0078FF #0A82FF #148CFF #1E96FF #28A0FF #32AAFF #3CB4FF #46BEFF #50C8FF #5AD2FF
#0064FF #0A6EFF #1478FF #1E82FF #288CFF #3296FF #3CA0FF #46AAFF #50B4FF #5ABEFF
#0000FF #3232FF #5050FF #646EFF #6478FF #6482FF #648CFF #6496FF #64A0FF #64AAFF
#4169E1 #4B73E1 #557DE1 #5F87E1 #6991E1 #739BE1 #7DA5E1 #87AFEB #91B9F5 #9BC3FF
#0064CD #0A6ECD #1478CD #1E82CD #288CD2 #3296D7 #3CA0E1 #46AAEB #50B4F5 #5ABEF5
#5A5AFF #6464FF #6E6EFF #7878FF #8282FF #8C8CFF #A0A0FF #B4B4FF #C8C8FF #D2D2FF
#7B68EE #8572EE #8F7CEE #9986EE #A390EE #AD9AEE #B7A4EE #C1AEEE #CBB8EE #D5C2EE
#6A5ACD #7E6ECD #8878CD #9282CD #9C8CCD #A696CD #B0A0CD #BAAAD7 #C4B4E1 #CEBEE1
#0000CD #2828CD #4646CD #6464CD #6E6ED7 #7878E1 #8282EB #8C8CF5 #9696FF #A0A0FF
#00008C #14148C #28288C #3C3C8C #50508C #646496 #7878AA #8C8CBE #A0A0C8 #B4B4DC
#483D8B #52478B #5C518B #665B8B #70658B #7A6F95 #84799F #8E83A9 #988DB3 #A297BD
#000069 #1E3269 #323C73 #3C467D #3C5087 #3C5A91 #46649B #506EA5 #5A78AF #6482B9
#3DFF92 #47FF9C #51FFA6 #5BFFB0 #65FFBA #6FFFC4 #79FFCE #75FFCA #7AFFCF #7FFFD4
#55EE94 #5FEE9E #69EEA8 #73EEB2 #7DEEBC #87EEC6 #91F8D0 #9BFFDA #A5FFE4 #AFFFEE
#66CDAA #70D2B4 #7AD7BE #84DCC8 #8EE1D2 #98EBDC #9DF0E1 #A2F5E6 #A7FAEB #ACFFEF
#AAEBAA #B4F0B4 #BEF5BE #C8FAC8 #D2FFD2 #DCFFDC #E1FFE1 #E6FFE6 #EBFFEB #F0FFF0
#80E12A #8AE634 #94EB3E #9EF048 #A8F552 #B2FA5C #BCFF66 #C1FF6B #C6FF70 #CBFF75
#52E252 #5CE75C #66EC66 #70F170 #7AF67A #84FB84 #89FB89 #8EFB8E #93FB93 #98FB98
#64CD3C #6ED746 #78E150 #82EB5A #8CF064 #96F56E #9BFA73 #A0FA78 #A5FA7D #AAFA82
#13C7A3 #18CCA8 #1DD1AD #22D6B2 #27DBB7 #2CE0BC #31E0C1 #36E0C6 #3BE0CB #40E0D0
#46B4B4 #50BEBE #5AC8C8 #64D2D2 #6EDCDC #73E1E1 #78E6E6 #7DEBEB #82F0F0 #87F5F5
#20B2AA #2ABCB4 #34C6BE #3ED0C8 #48DAD2 #52E4DC #57E9E1 #5CEEE6 #61F3EB #66F8F0
#5F9EA0 #69A8AA #73B2B4 #7DBCBE #87C6C8 #91D0D2 #96D5D7 #9BDADC #A0DFE1 #A5E3E6
#3CB371 #46BD7B #50C785 #5AD18F #64DB99 #6EE5A3 #73EAA8 #78EFAD #7DF4B2 #82F9B7
#2E8B57 #389561 #429F6B #4CA975 #56B37F #60BD89 #65C28E #6AC793 #6FCC98 #74D19D
#228B22 #2C952C #369F36 #40A940 #4AB34A #54BD54 #5EC75E #63CC63 #68D168 #6DD66D
#497649 #538053 #5D8A5D #679467 #719E71 #7BA87B #80AD80 #85B285 #8AB78A #8FBC8F
#006400 #0A6E0A #147814 #1E821E #288C28 #329632 #3CA03C #41A541 #46AA46 #4BAF4B
#008C8C #0A9696 #14A0A0 #1EAAAA #28B4B4 #32BEBE #37C3C3 #3CC8C8 #41CDCD #46D2D2
#008080 #0A8A8A #149494 #1E9E9E #28A8A8 #32B2B2 #37B7B7 #3CBCBC #41C1C1 #46C6C6
#FFB6C1 #FFBBC6 #FFC0CB #FFC5D0 #FFCAD5 #FFCFDA #FFD4DF #FFD9E4 #FFDEE9 #FFE3EE
#FFAAAF #FFB4B9 #FFBEC3 #FFC8CD #FFD2D7 #FFDCE1 #FFE1E6 #FFE6EB #FFEBF0 #FFF0F5
#FF9E9B #FFA8A5 #FFB2AF #FFBCB9 #FFC6C3 #FFD0CD #FFD5D2 #FFDAD7 #FFDFDC #FFE4E1
#FF7A85 #FF848F #FF8E99 #FF98A3 #FFA2AD #FFACB7 #FFB1BC #FFB6C1 #FFBBC6 #FFC0CB
#FF5675 #FF607F #FF6A89 #FF7493 #FF7E9D #FF88A7 #FF92B1 #FF9CBB #FFA6C5 #FFB0CF
#FF82FF #FF8CFF #FF96FF #FFA0FF #FFAAFF #FFB4FF #FFBEFF #FFC8FF #FFD2FF #FFDCFF
#FF7DB4 #FF87BE #FF91C8 #FF9BD2 #FFA5DC #FFAFE6 #FFB4EB #FFB9F0 #FFBEF5 #FFC3FA
#FF69B4 #FF73BE #FF7DC8 #FF87D2 #FF91DC #FF9BE6 #FFA5F0 #FFAAF5 #FFAFFA #FFB4FF
#FF1493 #FF1E9D #FF28A7 #FF32B1 #FF3CBB #FF46C5 #FF50CF #FF5AD9 #FF64E3 #FF6EED
#DB7093 #DB7A9D #DB84A7 #E08EB1 #E598BB #EAA2C5 #EAB1D4 #EFACCF #F4BBDE #F4B6D9
#D7567F #DC6089 #E16A93 #E6749D #EB7EA7 #F088B1 #F592BB #FA9CC5 #FFA6CF #FFB0D9
#C71585 #C71F8F #C73399 #C73DA3 #CC47AD #D151B7 #D65BC1 #E065CB #EA6FD5 #F479DF
#CD1039 #CD1F48 #CD2E57 #CD3861 #CD426B #D24C75 #D7567F #DC6089 #E16A93 #E6749D
#B9062F #B91A4D #BE2457 #C32E61 #C8386B #CD4275 #D24C7F #D75689 #DC6093 #E16A9D
#FAEB78 #FAF082 #FAF58C #FAFA96 #FAFAA0 #FAFAAA #FAFAB4 #FAFABE #FAFAD2 #FAFAD2
#FFDC3C #FFE146 #FFE650 #FFEB5A #FFF064 #FFF56E #FFFA78 #FFFA82 #FFFF8C #FFFF96
#FFC81E #FFD228 #FFD732 #FFDC3C #FFE146 #FFE650 #FFEB5A #FFF064 #FFF56E #FFF978
#FFB400 #FFBE0A #FFC314 #FFC81E #FFCD28 #FFD232 #FFD73C #FFDC46 #FFE150 #FFE65A
#FDCD8C #FDD296 #FDD7A0 #FDDCAA #FDE1B4 #FDE6BE #FDEBC8 #FDF5D2 #FDF5DC #FDF5E6
#FAC87D #FACD87 #FAD291 #FAD79B #FADCA5 #FAE1AF #FAE6B9 #FAEBC3 #FAEBCD #FAEBD7
#FFA500 #FFAF0A #FFB914 #FFC31E #FFCD28 #FFD732 #FFDC37 #FFE13C #FFE641 #FFEB46
#FF9100 #FF9B00 #FFA500 #FFAF00 #FFB900 #FFC300 #FFC800 #FFCD00 #FFD200 #FFD700
#FF8200 #FF8C0A #FF9614 #FFA01E #FFAA28 #FFB432 #FFB937 #FFBE3C #FFC341 #FFC846
#FFA98F #FFB399 #FFBDA3 #FFC7AD #FFD1B7 #FFDBC1 #FFE0C6 #FFE5CB #FFEAD0 #FFEFD5
#FFA374 #FFAD7E #FFB788 #FFC192 #FFCB9C #FFD0A1 #FFD5A6 #FFDAAB #FFDFB0 #FFE4B5
#FF9473 #FF9E7D #FFA887 #FFB291 #FFBC9B #FFC6A5 #FFD0AF #FFD0AF #FFD5B4 #FFDAB9
#FF7F50 #FF895A #FF9364 #FF9D6E #FFA778 #FFB182 #FFBB8C #FFC091 #FFC596 #FFCA9B
#CD853F #CD8F49 #D29953 #D7A35D #DCAD67 #E1B771 #E6C17B #EBC680 #F0CB85 #F5D08A
#D2691E #D27328 #D27D32 #D7873C #DC9146 #E19B50 #E6A55A #EBAA5F #EBAF64 #F0B469
#AE5E1A #B86824 #C2722E #CC7C38 #D68642 #E0904C #E59551 #EA9A56 #EF9F5B #F4A460
#8B4513 #8B4F1D #8B5927 #8B6331 #906D3B #957745 #9F814F #A48654 #A98B59 #AE905E
#FF9696 #FFA0A0 #FFAAAA #FFB4B4 #FFBEBE #FFC8C8 #FFD2D2 #FFDCDC #FFE6E6 #FFF0F0
#F08080 #F08A8A #F09494 #F59E9E #FAA8A8 #FAB2B2 #FAB7B7 #FABCBC #FAC1C1 #FAC6C6
#F56E6E #F57878 #F58282 #F58C8C #F59696 #F5A0A0 #F5AAAA #FAB4B4 #FABEBE #FAC8C8
#F06464 #F06E6E #F07878 #F08282 #F08C8C #F09696 #F4A0A0 #F4AAAA #F4B4B4 #FEBEBE
#FF0000 #FF3232 #FF4646 #FF5050 #FF5A5A #FF6464 #FF6E6E #FF7878 #FF8282 #FF8C8C
#EB0000 #EB3232 #EB4646 #EB5050 #EB5A5A #EB6464 #F06E6E #F57878 #FA8282 #FA8C8C
#CD0000 #CD3C3C #CD4646 #CD5050 #D25A5A #D76464 #DC6E6E #E17878 #E68282 #EB8C8C
#CD5C5C #CD6666 #CD7070 #CD7A7A #D28484 #D78E8E #DC9898 #E6A2A2 #EBACAC #F0B6B6
#B90000 #B93232 #B93C3C #B94646 #B95050 #BE5A5A #C35F5F #C86464 #CD6969 #D26E6E
#B22222 #B24040 #B24A4A #B25454 #B75E5E #BC6868 #C17272 #CB7776 #CB7C7C #D08180
#A52A2A #AA3E3E #AF4848 #B45252 #BE5C5C #C36666 #CD7070 #CD7A7A #D28484 #D78E8E
#800000 #803232 #853C3C #8F4646 #945050 #9E5A5A #A36464 #AD6E6E #B77878 #C18282
#CD853F #CD8B45 #CD904A #D2954F #D29A54 #D79F59 #D7A45E #E1A963 #E1AE68 #E6B36D
#DB631F #E56D29 #E57733 #EA813D #EF8B47 #EF904C #F49551 #F49A56 #F49F5B #F4A460
#D2691E #D27328 #D77D32 #D7873C #DC9146 #E19B50 #E6A055 #EBA55A #F0AA5F #F5AF64
#A0522D #A05C37 #A06641 #A5704B #AA7A55 #B4845F #B98E69 #C39873 #CDA27D #D7AC87
#8B4513 #8B4F1D #8B5927 #8B6331 #906D3B #9A7745 #A4814F #AE8B59 #B89563 #C29F6D
#DA70D6 #DF75DB #E47AE0 #E97FE5 #EE84EA #F389EF #F88EF4 #FD93F9 #FF98FE #FF9DFF
#BA55D3 #BF5AD8 #C45FDD #C964E2 #CE69E7 #D36EEC #D873F1 #DD78F6 #E27DFB #E782FF
#9932CC #9E37D1 #A33CD6 #A841DB #AD46E0 #B24BE5 #B750EA #BC55EF #C15AF4 #C65FF9
#9400D3 #9905D8 #9E0ADD #A30FE2 #A814E7 #AD19EC #B21EF1 #B723F6 #BC28FB #C12DFF
#942894 #9E329E #A83CA8 #B246B2 #BC50BC #C65AC6 #D064D0 #DA6EDA #E478E4 #EE82EE
#8c008c #960a96 #a014a0 #aa1eaa #b428b4 #be32be #c83cc8 #d246d2 #dc50dc #e65ae6
#800080 #8a0a8a #941494 #9e1e9e #a828a8 #b232b2 #bc3cbc #c646c6 #d050d0 #da5ada
#834683 #8d508d #975a97 #a164a1 #ab6eab #b578b5 #bf82bf #c98cc9 #d396d3 #dda0dd
#828282 #8c8c8c #969696 #a0a0a0 #aaaaaa #b4b4b4 #bebebe #c8c8c8 #d2d2d2 #dcdcdc
#000000 #282828 #323232 #3c3c3c #464646 #505050 #5a5a5a #646464 #6e6e6e #787878


출처 : 인터넷

:
Posted by 뽀기
2007. 3. 22. 09:26

Daily English 2007.03.22 생활/영어2007. 3. 22. 09:26

civil engineering
=> a study of the repair, planning and building of public buildings such roads, bridges, harbours
=> The US Civil Engineering Research Foundation operates a clearinghouse that tracks the development of
   new technologies and materials and informs industries in other countries of their uses and availability.

diagonal
=> a straight line connecting any two vertices of a polygon that are not adjacent
=> Mr.Lee drew a diagonal with fine brush.

damaging
=> causing harm or injury
=> He believes that the relentless push for economic growth is deeply damaging to the environment.

epic tale
=> a story which is alike a long narrative poem telling of a hero's deeds.
=> One reviewer called the film "a truly epic tale - a masterpiece and a classic."

relief crops
=> A team who transports the sick or injured
=> Another Austrailian relief crops was wounded

bad property
=> illegal loan
=> Due to bad property and commercial loans in the early 1990's,
   the entire banking systems of some Scandinavian cuontries had to be baild out by government regulators.


1. Last Thursday, while Gray _____ home from work, he _____ control fo his steering and hit another car.
   He wasn't hurt, but his car was damaged.

  a : drove - lost
  b : wasdriving - was losing
  c : was driving - lost
  d : drove - was losing

2. Elena : You're late again, Steve. Where the hell were you?
   Steve : Sorry. I ____ for a place to park.

  a : look
  b : am looking
  c : looked
  d : was looking

3. Last night I _____ a noise and woke up.
   There was a storm outside and the branches of the trees _____ the window.

  a : heard - were scraping
  b : was hearing - scraped
  c : heard - scraped
  d : was hearing - were scraping


 

'생활 > 영어' 카테고리의 다른 글

DailyEnglish 2007.04.23  (0) 2007.04.23
Daily English 2007.03.28  (0) 2007.03.28
Daily English 2007.03.14  (0) 2007.03.14
Daily English 2007.03.13  (0) 2007.03.13
Daily English 2007.03.12  (0) 2007.03.12
:
Posted by 뽀기
2007. 3. 20. 10:36

DOM(Document Object Model) 그거/Tech2007. 3. 20. 10:36

DOM

DOM(Document Object Model)

  • W3C's definition

    "The Document Object Model is a platform- and language-neutral interface that will allow programs and scripts to dynamically access and update the content, structure and style of documents.

  • DOM 의 역할
    • dynamic access and update
      • XML/HTML 문서의 접근 및 수정 => 내용/구조/스타일 정보의 검색 및 수정
      • 대상 문서 : XML1.0 또는 HTML4.0, 기타 웹문서
      • 컨텐츠의 조작 : 문서 요소에서 text 등 컨텐츠의 검색/질의, 추가/수정/삭제
      • 구조의 탐색 및 조작 : 각 요소와 속성에 대한 검색/질의, 추가/수정/삭제
    • interface
      • 응용 프로그램 인터페이스 (API) - 각종 메소드 및 속성을 정의
      • 플랫폼 및 언어 중립적(스크립트 포함) : Java, JavaScript, ASP, ...
  • DOM level
    • DOM level 1 : 1998.10 W3C 표준안
    • DOM level 2 : 2000.11 W3C 표준안
    • DOM level 3 : 2001.8 W3C Working Draft

DOM and XML Parser

  • Parser 의 역할
    • XML 문서를 읽고 해석 : well-formed, valid 검사
    • 응용프로그램 개발시 파서 사용 이유
      • 파서가 메모리에 DOM 트리를 생성 : XML 문서트리와 일치
      • 세부적인 XML 문법으로부터 프로그램 격리

  • [참고] SAX 기반 Parser

DOM 구조적 모델

  • DOM 트리에서 노드/객체의 종류
    • Document : 문서 객체, 최상위 노드
    • Element, Attribute : 문서의 구조를 구성하고 있는 요소
    • Text : 컨텐츠의 내용, 항상 단말 노드
    • Collection : 일종의 노드 집합
  • DOM 트리의 예

    <parent>
        <child  id="123">text here</child>
     </parent>

     

  • 인터페이스(API)의 예
    • 객체의 속성과 메소드를 사용하기 위한 사양
    • DOM 인터페이스 예
      - 문서.childNodes[1].nodeName
      - 문서.firstChild.firstCild.firstCild.nodeName
      - 문서.firstChild.firstCild.firstCild.nodeValue
  • DOM Core Interface (Object Hierachy) 교재 p.414 (표9-3)

DOM 주요 API

  • DOM 인터페이스의 공통 속성
    • type, name, value
    • 예) Node 객체의 경우 nodeType, nodeName, nodeValue 속성
      • nodeType은 위 그림과 같이 여러 가지가 있다 (p.418 표 9-6, 9-7)
  • 주요 객체/속성/메소드 - 진행하면서 지속적으로 참조

    객체(Object)

    속성(Properties)

    메소드(methods) 

    Node 객체

    nodeName, nodeType, nodeValue, childNodes, parentNode, childNode, firstChild, lastChild, previousSibling, nextSibling, attributes, ownerDocument, ..., 
    (
    text, xml) [표9-8]

    [표9-10] 노드 정보 구하기
    getNodeName, ..., getAttributes, ...
    [표 9-11] 문서 조작
    appendChild, insertBefore,
    removeChild, replaceChild, cloneNode
    [표 9-12] 트리 순회 관련
    getParentNode, getChildNode, ...
    hasChildNodes, ...

    Document 객체

    doctype,
    documentElement, implementation, ...

    (async, readyState)
    * W3C 표준이 아니라  MS에서 제공하는 인터페이스

    [표9-13] 문서관련 정보
    egtDoctype, getImplementation, ...
    [표 9-14] 트리 순회 관련
    getDocumentElement, getElemenmtByID,
    getElementByTagName, ...
    [표 9-15] 문서 작성
    createElement, createAttribute, createTextNode, createCDATASection, createComment, createEntityReference, ...

    DOMImplementation 객체


    [표 9-16] hasFeature, createDocument, ...

    DocumentFragment 객체

    * Node 객체와 동일

    * Node 객체와 동일

    NodeList 객체

    length

    [표 9-17] getLength, item

    Element 객체

    tagName

    [표 9-18] Element의 속성에 접근
    getAttribute, setAttribute, getAttributeNode, setAttributeNode, removeAttribute, ...,
    [표 9-18]Element 객체에 접근
    getTagName, hasAttribute, ...

    NamedNodeMap 객체

    length

    [표 9-19] getNamedItem, setNamedItem, removeNamedItem, item, getLength

    Attribute 객체

    name, value

    [표 9-20] getName, getValue, setValue, ...

    CharacterData 객체

    data, length

    [표 9-21] appendData, deleteData, insertData, replaceData, substringData, ...

DOM 프로그래밍 시작 - Document 객체

  • 문서 객체 새로 만들기 : DOMDocument 객체를 생성
    • Msxml.DOMDocument 객체를 새로 만들기
    • 또는 HTML에서 <xml> 태그 이용

    JavaScript (JScript)

    <Script language="Javascript">
       
    var xdoc1,xdoc2
       
    xdoc1 = new ActiveXObject("Msxml.DOMDocument");
       
    xdoc2 = new ActiveXObject("Msxml.DOMDocument");
        ...
    xdoc1.load("ex08.xml");  xdoc2.load("ex09.xml");
    </script>
    VBScript 의 경우 <Script language="VbScript">
      Dim xdoc1,xdoc2
      Set xdoc1 = CreateObject("Msxml.DOMDocument")
      Set xdoc2 = CreateObject("Msxml.DOMDocument")
      ...
    xdoc1.load("ex08.xml"); xdoc2.load("ex09.xml");
    </Script>

    HTML에서 <xml>  태그 이용

    - MSXML 파서 설치안한 경우

    <HTML> <HEAD>
        <Script language="Javascript">
            xdoc.load("ex08.xml");    </script>
    </HEAD>
    <BODY>
        <xml id="xdoc1"></xml>
        <xml id="xdoc2" src="ex09.xml"></xml>
    </BODY> </HTML>

    Java의 경우

    import java.xml.parsers.*;
    ...
    class xxxxxx
    {
      public static void main(String[] args) throws Exception
      {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder  db = dbf.newDocumentBuilder();
        Document  xdoc1 = db.parse(new FileInputStream(arg[0]));
    ...

  • 기존의 XML 문서 읽기
    • DOMDocument 객체 읽기 - async 속성, load 메소드, xml 속성 : MSXML에서 제공
    MSXML 파서 설치한 경우   MSXML 파서 설치안한 경우  
    <HTML>
    <HEAD>
    <Script language="Javascript">
    function xload0()
    {
       
    var xdoc = new
            ActiveXObject("Msxml.DOMDocument");
        xdoc.
    async = false;    xdoc.load("ex08.xml");
       
    alert(xdoc.xml);
    }
    </script>
    </HEAD>
    <BODY>
    <input type="button" value="XML 로드0"
        onClick="xload0()">
    </BODY>
    </HTML>  
    <HTML>
    <HEAD>
    <Script language="Javascript">
    function xload1()
    {
        xdoc.async = false;
        xdoc.load("ex08.xml");

         alert(xdoc.xml);
    }
    </script>
    </HEAD>
    <BODY>
    <input type="button" value="XML 로드1"
        onClick="xload1()">
    <xml id="xdoc"></xml>
    </BODY>
    </HTML>
    VBScript 의 경우
    <Script language="VbScript">
      Dim xdoc
      Set xdoc = CreateObject("Msxml.DOMDocument")
      xdoc.
    async = False;
      xdoc.
    load("ex08.xml");  MsgBox  xdoc.xml
    </Script>
  • 신규 XML 문서의 작성
    • loadXML 메소드  
     xdoc.async = false;
     xdoc.
    loadXML( "<book><title>XML 입문</title><author>일지매</author></book>");
     alert(xdoc.xml);  
     xdoc.async = false;
     xdoc.
    loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </author> </book>");
     alert(xdoc.xml);  
  • 공백의 처리 : preserveWhiteSpace 속성
     xdoc.async = false;
     xdoc.preserveWhiteSpace = true;
     xdoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </author> </book>");
     alert(xdoc.xml);  
     xdoc.async = false;
     xdoc.preserveWhiteSpace = true;
     xdoc.load("ex08.xml");
     alert(xdoc.xml);  
  • XML 문서의 저장 : save 메소드
  • 에러 처리 : parseError 객체
    • parseError.errorCode, parseError.line, parseError.linepos, parseError.reason
     xdoc.async = false;
     xdoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </authors> </book>");
     alert(xdoc.xml);  
     xdoc.async = false;
     xdoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </authors> </book>");
     if (xdoc.parseError)
        alert("에러 위치 : " + xdoc.parseError.line + "번째 라인 " + xdoc.parseError.linepos 
                  + "번째 문자 에러 이유 : " + xdoc.parseError.reason);
     else
    alert(xdoc.xml);  
  • 루트 노드 찾기 (루트 에리먼트)
    • documentElement 속성
     xdoc.async = false;
     xdoc.load("ex08.xml");
     var xroot = xdoc.
    documentElement;
     alert(xroot.nodeName);  
     xdoc.async = false;
     xdoc.loadXML( "<book> <title> XML 입문 </title> <author> 일지매 </author> </book>");

     var xroot = xdoc.
    documentElement;
     alert(xroot.nodeName);  

Node 객체의 정보구하기 - Node 객체

  • 속성 : nodeName, nodeType, nodeValue, attributes, text 속성
  • nodeType
    • 1 (element), 2 (attribute), 3 (text) , 4 (CDATA), 5 (Entity Reference)...
  •  xdoc.load("ex08.xml");
     var xroot = xdoc.documentElement;
     alert('nodeName: '+xroot.nodeName+' nodeType: '+xroot.nodeType+
           ' nodeValue: '+xroot.nodeValue+' attributes: '+xroot.attributes.length);
     alert('xroot.text : ' + xroot.text);
     

실습 프로그램

  • 파일 LOAD 및 DOM 명령 실행 (교재 s20-03.htm 과 s20-05.htm 혼합)

    XML 파일 경로를 직접 입력하거나  '찾아보기'로 선택, 'LOAD'로 파일을 메모리에 로드
    경로 :  =>

    또는 미리 작성되어 있는 파일 사용하기  

    사용하고자 하는 DOM 구문을 아래에 입력하고 '확인' 버튼을 클릭  (예 : xdoc.text, xdoc.documentElement.firstChild.nodeName, ...) 구문 :    

     <SCRIPT language="Javascript">
            var xdoc, rootNode;
            function
    FileLoad(filename)
            {
                    xdoc = new ActiveXObject("Msxml.DOMDocument");
                    xdoc.async = false;
                    if (filename) xdoc.load(
    filename);
                    else xdoc.load(
    "file://"+path.value);
                    if (xdoc.parseError.errorCode != 0)
                        alert("파일을 메모리로 로드하는데 실패하였습니다 : " + xdoc.parseError.reason);
     
                    rootNode = xdoc.documentElement;
                    alert("[파일로드 성공] 루트 엘리먼트 : " + rootNode.nodeName);
            }
            function Execute()
            {
                    var selectionString;
                    try {
                            selectionString = eval(syntax.value);
                    } catch(e) {
                            selectionString = null;
                    }
                    alert(selectionString);
            }
    </SCRIPT>  
     ...
    <BODY>
     ... 경로 : <input  type="file"  size="40"  id="
    path">
         <input  type="button"  value="LOAD"  onclick="
    FileLoad()">
     ... 미리 작성되어 있는 파일
         <input  type="button"  value="서점 책 list"  onclick="
    FileLoad("ex08.xml")">
     ... 구문 : <input  size="50"  id="
    syntax"  value="xdoc.">&nbsp;
         <input  type="button" onclick="
    Execute()" value=확인>
     ...
    </BODY>

'그거 > Tech' 카테고리의 다른 글

JSTL(JavaServer Pages Standard Tag Library)  (0) 2007.03.29
Velocity  (0) 2007.03.29
패턴과 프레임워크  (0) 2007.03.14
Crossing borders: JavaScript의 특징 (한글)  (0) 2007.03.13
JSON vs. XML  (0) 2007.03.13
:
Posted by 뽀기
2007. 3. 14. 13:44

패턴과 프레임워크 그거/Tech2007. 3. 14. 13:44

패턴과 프레임워크

패턴과 프레임워크, 다소 어려워 보일 수 있는 주제이지만 프로그래머로써 한 단계 거듭나기 위해 거쳐야 할 과제입니다. 이제까지 기본기로만 싸워왔다면 이제부터는 좀 고난이도의 기술과 새로운 무기들을 써 봅시다. 지금부터가 정말 즐거운 프로그래밍의 세계로 들어가는 길입니다.

탈무드에는 배고픈 자식에게 고기를 잡아주기보다 고기를 잡는 방법을 가르쳐주라는 말이 있습니다. 좋은 프로그램을 고기라고 본다면 좋은 프로그램을 만들어주는 것보다 좋은 프로그램을 만드는 방법을 가르쳐야 한다는 말이 되겠죠. 하지만 그러기엔 마소 주니어의 지면은 넉넉지 않습니다. 사실 초급자는 잡지에서 새로운 것을 익히려 하기보다 입문서에서 배워야 합니다.

 

그렇다면 이 한정된 지면에서 할 수 있는 최선은 자세한 내용을 기술하는 것이 아니라 무엇을 공부해야 하는지, 어디서 정보를 얻을 수 있는지, 요즘 추세는 어떤지를 알려주는 것이겠지요. 말하자면 좋은 프로그램이 아니라 그것을 만드는 방법을 고기로 보고 이것을 잡는 방법을 제시하겠다는 뜻입니다.

 

필자의 짧은 세 번의 연재에는 모두 이런 생각이 담겨 있고 그래서 기술적인 상세 내용 설명보다는 무엇을 공부해야 하는가에 대한 내용에 치중했습니다. 이번 글 역시 디자인 패턴, 프레임워크, XP 세 가지를 다루고 있지만 각각의 상세한 설명보다는 이런 개념들을 어떻게 이해하고 활용해야 하는가에 초점을 맞출 것입니다.

디자인 패턴과 프레임워크는 먼저 용어에 대한 설명부터 시작합니다. 그리고 그것들의 목적과 가치에 대해 살펴보고 몇 가지 예를 살펴볼 것입니다. XP는 제목에 포함시키긴 했지만 이것은 디자인 패턴과 프레임워크를 XP의 시각에서 바라본다는 의미이고 개별적인 주제로는 다루지 않습니다.


용어로서의 디자인 패턴
디자인 패턴이란 프로그래밍에서 발생하는 여러 가지 문제 영역에 대한 해결 방법들을 모아서 정리해놓은 것입니다. GoF(Gang of Four)가 여러 가지 패턴들을 모아 『디자인 패턴』이라는 책을 내면서부터 디자인 패턴이라는 용어가 일반화되기 시작했습니다. GoF의 디자인 패턴 중 하나를 예로 들면 데코레이터(Decorator)라는 패턴이 있습니다. 랩퍼(Wrapper)라는 말로도 쓰이는데 이것은 어떤 객체에 기본적인 동작은 유지하면서 부가적인 기능을 넣고 싶을 때 사용합니다.

이 패턴의 간단한 예로 JDBC에서 수행한 쿼리를 로그로 남기고 싶을 때 로깅을 위한 데코레이터를 사용할 수 있습니다. 보통 JDBC에서는 Connection 객체를 이용해서 Statement 객체를 생성하고 이것을 이용해서 쿼리를 수행하게 되는데 이 때 Statement 대신 LoggableStatement를 사용하는 것입니다.

 

LoggableStatement는 Statement를 상속하며 생성자에서 Connection 객체가 만든 Statement 객체를 받아서 멤버로 갖고 있습니다. 그리고 쿼리 요청이 오면 먼저 로깅을 하고 실제 쿼리는 생성자에서 받은 Statement 객체에 위임합니다. 이런 방식으로 Statement의 동작은 그대로 유지하면서 로그를 남기는 기능을 추가할 수 있습니다.

 

이런 것이 디자인 패턴입니다. 수학 공식처럼 같은 종류의 문제들에 대해 이미 정리된 해결책을 이용함으로써 매번 같은 문제를 해결하는데 중복으로 투자되는 노력을 줄이려는 것이죠.

하지만 디자인 패턴을 그대로 사용하는 것이 좋은 것만은 아닙니다. 오용의 위험성이 크기 때문입니다. 사실 어떤 문제 상황에 어떤 패턴을 적용하면 되는가를 판단하기란 쉬운 일이 아니기 때문에 필요하지도 않은 복잡한 패턴을 도입하는 경우가 많습니다. 그 때문에 간단하게 해결될 문제가 더 복잡해지기도 하죠. 그래서 안티 패턴 같은 이야기도 나오고 있습니다. XP(eXtreme Programming)에서도 디자인 패턴을 의식하지 말라고 합니다.

 

그보다 원하는대로 동작할 수 있는 가장 간단한 방법으로 코딩을 하다가 중복이 생기거나 코드가 지저분해지면 리팩토링을 합니다. 그러면서 자연스럽게 코드가 디자인 패턴의 모습을 갖추어 나가는 것이 바람직합니다.

 

이처럼 디자인 패턴의 원래 목적은 문제 해결 시간을 단축시키는 것이었지만 문제 영역과 패턴을 정확히 매칭시키기 어렵고 Over-Engineering이 나오는 경우가 많기 때문에 실제 개발에서는 디자인 패턴을 직접적으로 사용하지 않는 것이 좋습니다.

 

디자인 패턴의 가치는 그보다도 의사소통 비용을 줄여줄 수 있다는 데 있습니다. 서로가 패턴에 대해 잘 알고 있다면 복잡한 설명 없이도 아주 간단하게 의사소통이 이루어질 수 있죠. 이를테면 이 예를 설명하기 위해 복잡하게 LoggableStatement의 구조를 설명하는 것 대신에 ‘이 LoggableStatement 클래스는 Statement의 데코레이터로 로깅을 추가로 하게 되어 있어’라고 말할 수 있다는 것입니다. 즉 패턴은 해결책으로서보다 의사소통을 위한 용어로서 활용하는 거라고 생각하는 것이 좋습니다.

 

자바빈즈의 해악
패턴 오용의 한 예로 자바빈즈를 들 수 있습니다. ‘해악’이라는 표현까지 써가면서 자바빈즈를 언급한 것에 대해 놀라는 사람도 많을 것입니다. 자바를 배우면서 보통 자바빈즈의 장점에 대한 이야기를 많이 듣게 되니까요. 하지만 점점 자바빈즈를 해로운 것으로 인식하는 사람들이 많아지고 있습니다. 먼저 자바빈즈가 무엇인지부터 다시 살펴봅시다.

 

자바빈즈는 원래 컴포넌트 아키텍처를 자바에서 구현하기 위해 도입된 기술입니다. 객체의 프로퍼티의 조작 메커니즘을 제공하여 재사용성이 높고 유연한 컴포넌트를 만드는 것이 목적이죠. 자바빈즈의 특징으로 언급되는 것이 여러 가지가 있지만 다른 자바 객체와 구별되는 특징은 프로퍼티 관리 방식입니다. 프로퍼티로 private 필드를 두고 그 필드에 대한 public getter/setter를 만들어서 이를 이용해서 프로퍼티에 접근을 합니다.

 

사실 이것은 일반적인 필드 인캡슐레이션(field encapsulation)과 크게 다르지 않습니다. 다른 점은 이 프로퍼티의 이름과 getter/setter의 이름에 네이밍 룰을 부여해서 빈즈 API를 통해서 프로퍼티의 이름으로 이 프로퍼티를 읽거나 쓸 수 있다는 점입니다.

 

예를 들어 name이라는 프로퍼티가 있다면 getName, setName이라는 이름으로 getter/setter를 만들고 빈즈 API에서는 name이라는 이름으로 프로퍼티에 접근할 수 있습니다. 즉, 일반적인 필드 인캡슐레이션을 하면 프로퍼티에 접근하기 위해 메쏘드명을 코드에 직접 써야 하지만 빈즈 규약에 맞게 getter/setter를 만들고 빈즈 API를 이용하면 String으로 주어진 프로퍼티에 접근하는 것이 가능해진다는 것입니다.

 

이 점을 이용하면 복잡한 애플리케이션에서 자바빈즈 객체의 프로퍼티를 동적으로 쉽게 조작할 수 있습니다. 그래서 정보 은폐(information hiding, data hiding)와 동적인 프로퍼티 접근의 두 마리 토끼를 동시에 잡는 것이 자바빈즈의 목적입니다.

 

그러면 무엇이 문제일까요? 우선 첫 번째 목적인 정보 은폐가 제대로 되지 않습니다. 사실 필드 인캡슐레이션은 정보 은폐를 위한 것이라고 하지만 이것은 허구에 불과합니다. 실질적으로 프로퍼티에 대한 접근성은 public field와 private field, public getter/setter가 완전히 동일합니다. 똑같이 읽고 쓸 수 있는데 뭐가 다르겠습니까. 단지 좀 더 조심스럽게 쓰지 않을까라고 추측하는 것뿐입니다. 그래서 자바빈즈를 사용할 때 꼭 필요한 경우가 아니라면 setter는 만들지 않기를 권하기도 합니다.

하지만 일반적인 필드 인캡슐레이션이라면 setter를 만들지 말라는 조언을 할 수 있겠지만 자바빈즈는 그 목적이 프로퍼티를 동적으로 조작하는 것이므로 컴포넌트로서의 역할을 제대로 하려면 setter도 당연히 필요합니다. 결국 필드 인캡슐레이션으로 인해 코드는 길어졌지만 정보 은폐는 달성하지 못했으므로 실질적인 이득이 없습니다.

 

또 다른 문제는 자바빈즈의 한계에 관한 것입니다. 동적으로 프로퍼티의 내용에 접근할 수는 있지만 프로퍼티를 추가하거나 없애는 정도의 유연성은 소화할 수 없습니다. 많은 경우 자바빈즈를 데이터 전송 객체(Data Transfer Object)로 사용하는데 이런 경우는 프로퍼티의 내용 뿐 아니라 프로퍼티 종류 자체가 자주 변합니다. 그런데 자바빈즈로 만들게 되면 프로퍼티가 늘어날 때마다 필드와 메쏘드를 추가해야 합니다. 그리고 데이터의 종류가 달라질 때마다 새로운 클래스를 만들어야 하구요. 자바 컬렉션에 Map이 있는데 이런 비효율을 감당해야 할 이유는 별로 없습니다.

 

Map에서는 프로퍼티에 동적으로 접근하는 것은 물론이고 프로퍼티가 자유롭게 늘어나거나 줄어들 수 있습니다. 게다가 빈즈 API는 String으로 주어진 프로퍼티명에 대한 getter/setter를 호출하기 위해 내부적으로 Introspection이라는 기술을 사용하는데 이것은 자바의 Reflection API를 이용합니다. 때문에 성능상에서도 해싱(Hashing)을 이용하는 HashMap에 비해 나은 것이 없습니다.

 

그래서 자바빈즈의 단점에 대해 많은 사람들이 공감하기 시작했고 최근에 등장하는 각종 프레임워크들도 이런 경향을 반영하고 있습니다. 초기의 프레임워크들은 자바빈즈를 활용하는 기능들을 제공했으나 최신 프레임워크들은 자바의 컬렉션을 적극적으로 활용하고 있습니다.

 

일반적으로 데이터 전송 객체의 경우는 Map을 그냥 사용하는 것이 좋고 그 외에 복잡한 로직을 수행하는 객체인데 프로퍼티를 많이 사용해야 한다면 Map을 데코레이터로 사용하면 편리합니다. 그리고 일반적으로 클래스를 설계할 때 setter는 되도록 만들지 않는 것이 좋습니다.

 

프레임워크의 가치
프레임워크(framework)란 단어는 여러 가지 의미로 사용되지만 보통은 어떤 영역의 API들을 사용하기 편리한 형태로 포장해놓은 것을 말합니다. 이를테면 자바 컬렉션 프레임워크는 자바에서 각종 컬렉션을 사용하기 쉽게 모아놓은 것이고 자카르타 프로젝트의 BSF(Bean Scripting Framework)는 자바 애플리케이션에서 자바빈즈나 스크립팅을 하기 쉽게 만든 API의 집합입니다. 그리고 지금 논의하려는 웹 애플리케이션 프레임워크는 웹에서 서블릿 API들을 좀 더 편리하고 객체지향적으로 사용할 수 있게 해주는 것입니다.

 

현재 웹 애플리케이션 프레임워크의 주류는 단연 스트럿츠(struts)입니다. 전 세계 자바 웹 개발자의 60%가 스트럿츠를 사용하고 있다고 하죠. 하지만 스트럿츠가 있음에도 계속해서 새로운 프레임워크가 등장하고 있습니다. 현재까지 공개된 프레임워크의 숫자는 이미 60개를 넘습니다. 스트럿츠에는 어떤 부족함이 있길래, 그리고 다른 프레임워크들은 뭐가 부족하길래 개발자들이 새로운 프레임워크를 계속 만들까요.

 

* 프레임워크의 정의

스트럭처(structure), 아키텍처(architecture), 프레임워크(framework)란 용어는 기술과 시대가 변하면서 조금씩 그 의미를 달리해 가는 것 같습니다. 스트럭처라는 용어가 Tree와 같은 계층적인 탄탄한 기반 구조를 말하는 반면, 프레임워크는 다소 수평적인 의미를 가지는 하부 구조를 나타냅니다. 또한 아키텍처라는 것은 이 두 부분을 모두 포함하는 더 포괄적인 개념 체계적인 기반 구조를 나타냅니다.

 

그러나 프레임워크이란 용어는 스트럭처나 아키텍처보다 더 낮은 레벨의 의미를 지닙니다. 즉, 프레임워크의 실체는 때론 API의 집합으로 나타나기도 한다는 것이지요. 썬 마이크로시스템즈의 Java Activation Framework가 그러하고 Java Media Framework가 그러합니다. 그러나 최근에 와서 IBM의 샌프란시스코 프레임워크(San Francisco Framework)라는 용어가 등장하면서 ‘반제품’의 의미를 강하게 띄는 것 같습니다.

 

알다시피 샌프란시스코 프레임워크는 정형화된 업무를 위한 비즈니스 컴포넌트를 미리 만들어 두고, 이를 조립함으로써 생산성을 극대화시키자는 것이 요지입니다. 어쨌거나 현재의 프레임워크란 것은 ‘기반 틀 구조’라는 모호한 추상적인 개념이기보다는 물리적인 실체이면서 반제품 성격의 구체적이고 체계화된 API를 제공하는 개념이라고 봐야 할 것입니다.

- javaservice.net 이원영님의 글

프레임워크의 가치는 기술적인 영역에서 소모적이고 반복적인 코딩을 프레임워크가 소화하여 개발자가 비즈니스 로직에만 전념할 수 있도록 해주는 데 있습니다. 이를테면 웹 프로그래밍을 한다면 HTTP 프로토콜도 어느 정도 알아야 하고 서블릿 API를 익히고 쿠키도 쓸 줄 알아야 합니다.

 

하지만 JSF(Java Server Faces) 같은 프레임워크를 이용하면 일반 자바 GUI 프로그래밍을 하듯이 프로그래밍할 수 있습니다. 서블릿 API를 몰라도 웹 애플리케이션을 잘 만들 수 있는 것이죠. 로깅(logging) 프레임워크가 없다면 개발자가 로그를 남기고 싶을 때 직접 파일을 열어서 파일에 내용을 쓰는 등의 복잡한 코드를 써나가야 하지만 log4j와 같은 프레임워크를 쓰면 단순히 Logger 객체에 로그 메시지를 넘겨주는 것으로 로깅을 할 수 있습니다.

 

EJB도 이런 프레임워크의 일종입니다. EJB가 없다면 분산 트랜잭션이 생길 때마다 개발자가 직접 분산 트랜잭션 관리를 해야 하지만 EJB 엔진이 이를 대신해주면 개발자는 비즈니스 로직의 구현에만 집중할 수 있죠. 이처럼 기술적인 영역이 달라질 때마다 개발자는 새로운 API를 익히고 또 소모적이고 반복적인 코드를 써야 하는데 해당 분야에 좋은 프레임워크가 있으면 중복 코드도 쉽게 제거할 수 있고 기술적인 세부사항에 신경쓰지 않아도 됩니다.

 

결국 프레임워크의 가치는 개발자의 할 일을 줄여주는 데 있는 것입니다.

하지만 간혹 프레임워크의 가치를 유지보수의 용이함에서 찾는 경우가 있습니다. 프레임워크가 꽉 짜놓은 틀 안에서만 코딩을 하면 개발자들이 모두 일관된 방식으로 개발하기 때문에 다른 사람이 작성한 코드를 파악하기 쉬워서 유지보수하기도 쉽다는 것이죠.

 

그러나 이렇게 일관성을 필요 이상으로 강조하면 때때로 문제가 될 수 있습니다. PEAA(Patterns of Enterprise Application Architecture)에서는 기업용 애플리케이션(Enterprise Application)에는 모두 각각의 어려움을 가지고 있는데 이 어려움은 모두 종류가 다르기 때문에 이 모든 어려움을 해결하는 하나의 아키텍처는 불가능하다고 말합니다. 다른 문제 영역에는 다른 해결책을 써야한다는 것이죠. 그런데 프레임워크를 통해서 지나치게 틀을 고정시켜 놓게 되면 그 틀에서 수용할 수 없는 문제를 만났을 때 아주 비효율적인 코딩을 하게 됩니다. 물론 이것은 프레임워크 자체가 가져오는 직접적인 문제는 아닙니다.

 

그보다도 프레임워크의 장점을 ‘일관성’에서 찾는 사람들이 일반적으로 범하는 오류입니다. 일관성의 가치를 지나치게 높게 평가한 나머지 코딩 패턴에 너무 많은 구속을 하게 되고 그 결과로 문제 영역에 맞는 패턴을 사용하는 것이 아니라 패턴에 코드를 끼워 맞추는 코드를 만들게 됩니다. 그래서 결과적으로 프레임워크를 유연하게 활용하지 못하고 오히려 코드가 더 길고 복잡해지는 경우가 많습니다. 앞서 언급한 디자인 패턴의 오용과 같은 것이죠.

 

사실 일관성의 문제는 프레임워크보다도 컨벤션을 통해 해결해야 하는 것입니다. XP에서는 코드에 대한 소유권을 개발자 한 명이 아니라 모두가 갖게 되는 코드 공동 소유(collective code ownership)를 권장합니다. 그래서 다른 사람의 코드를 읽고 수정하는 일은 아주 일상적인 일입니다. 이런 상황에서 개발자 각각의 개성이 강해서 서로의 코드를 읽기 어렵다면 문제가 크겠죠.

그럼에도 불구하고 XP는 프레임워크에 대해 약간의 부정적인 입장을 취하고 있습니다. 이것은 프레임워크가 디자인 패턴과 같은 문제를 발생시킬 수 있다고 보기 때문이기도 하지만 고정적인 패턴에 따라 코딩된 코드보다도 코드 컨벤션이 통일되고 리팩토링이 잘된 코드가 더 읽기 쉽다고 보기 때문입니다. 실질적으로 코딩 패턴의 강제를 통해 얻을 수 있는 것은 그리 많지 않습니다. 어차피 이해하기 가장 어려운 부분은 비즈니스 로직인데 이 부분까지 패턴이나 프레임워크로 강제할 수는 없기 때문입니다.

 

결국 아무리 다양한 기능을 제공한다 해도 결과적으로 개발자가 작성해야 하는 코드를 줄여주지 못한다면 좋은 프레임워크라고 할 수 없습니다. 스트럿츠에 대한 대안이 계속 쏟아져 나오고 있는 것도 실제적으로 스트럿츠가 개발자의 일을 많이 줄여주지 못하기 때문입니다.

 

스트럿츠의 강점으로 컨트롤러(controller)를 꼽는데 사실 스트럿츠의 컨트롤러는 HttpServlet의 역할을 Action으로, web.xml의 역할을 struts-config.xml로 옮겨온 것 밖에 없습니다. 사실 스트럿츠의 컨트롤러 기능 자체는 서블릿 API의 래퍼 몇 개로 완전히 대체할 수 있습니다. 이런 점을 깨달은 개발자들이 정말로 개발자의 일을 줄여주는 것을 목표로 다양한 프레임워크를 쏟아내고 있는 것입니다.

 

프레임워크의 구성 요소
실제로 어떤 프레임워크를 사용하든 그대로 사용하는 경우는 그다지 많지 않습니다. 다른 프레임워크와 결합해서 쓰기도 하고 상속을 통해서 확장하거나 혹은 직접 소스코드를 고쳐서 사용하기도 합니다. 어차피 모든 영역에 맞는 프레임워크는 없기 때문에 각자의 환경에 맞게 커스터마이징하는 것은 바람직한 일입니다. 그래서 이번에는 프레임워크를 구성하는 요소들에 대해 살펴보겠습니다.

 

제어 구조의 반전
요즘 나오는 프레임워크들은 공통적으로 제어 구조의 반전(IoC, Inversion of Control)를 내세우고 있습니다. 제어 구조의 반전이라는 말의 의미는 개발자가 제어하던 것을 프레임워크로 옮겨서 프레임워크에서 제어한다는 것입니다.

 

예를 들면 GUI로 입력을 받는 프로그램을 개발자가 직접 모든 부분을 만든다면 입력 항목을 출력하고 사용자의 입력을 기다린 다음 사용자의 입력을 판단해서 로직을 실행하는 코드를 모두 순차적으로 쓰게 됩니다. 그런데 이걸 GUI 프레임워크를 이용하면 화면과 입력에 관한 부분은 프레임워크가 처리하고 사용자는 단지 사용자가 입력했을 때 반응하는 이벤트 핸들러만 작성합니다. 즉 입력 제어가 개발자에서 프레임워크로 이동하는 것입니다.

 

윈도우 프로그래밍에서 콜백(callback)이라고 부르는 것도 비슷한 개념입니다. 사실 서블릿 자체도 일종의 프레임워크이고 이미 IoC가 일어나고 있습니다. HTTP 요청을 대기하고 받아들여서 서블릿을 실행하는 코드를 개발자가 작성하는 것이 아니라 서블릿 엔진이 제공하고 개발자는 단지 서블릿만을 작성하게 되죠. 결국 이런 컨트롤의 반전을 통해서 중복 코드를 효과적으로 제거할 수 있습니다. 프레임워크의 목적이 소모적이고 반복적인 코드를 제거하는 것인 만큼 대부분의 프레임워크에는 프레임워크 개발자가 의도했든 아니든 IoC가 사용되고 있습니다.

 

하지만 IoC 역시 주의해서 사용해야 합니다. 일상적인 프로그램과는 달리 제어 구조가 거꾸로 되기 때문에 디버깅하기도 어렵고 컨트롤이 반전된 부분에 대한 선행 지식이 없으면 이해하기 어려운 코드가 됩니다. 그래서 IoC는 꼭 필요한 경우가 아니면 사용하지 않는 것이 좋습니다.


MVC 패턴
요즘 프레임워크가 IoC를 강조한다면 스트럿츠처럼 좀 오래된 프레임워크들은 MVC(Model-View-Controller)를 내세웠습니다. UI가 포함된 프레임워크에는 거의 필수적으로 사용되는 패턴입니다. 원래 MVC는 웹보다도 일반 GUI 애플리케이션을 개발할 때 UI(User Interface)와 비즈니스 로직을 효과적으로 분리하기 위해서 고안되었습니다. 현재는 웹에서도 그 효과가 입증되었기 때문에 널리 쓰이고 있습니다.

 

MVC의 구조는 MFC 프로그램에서 등장했던 Document-View 구조를 한 차원 더 발전시킨 것으로 프로그램의 구성 요소를 모델, 뷰, 컨트롤러로 나누어서 각각 다른 역할을 맡게 하는 것입니다. 모델은 비즈니스 로직을 담는 객체를 말하며 이 모델은 PEAA에서 말하는 도메인 모델이 됩니다.

데이터베이스에 접근하는 것도 모델 객체의 몫입니다. 모델 객체들 자체로 UML 클래스 다이어그램을 그린다면 그 자체로 비즈니스 로직의 표현이 될 수 있습니다. 뷰는 화면 UI를 구성하는 요소이며 일반적으로 웹에서는 JSP가 뷰의 역할을 맡습니다.

 

그리고 컨트롤러는 사용자의 요청을 받아서 모델 객체를 실행하고 그 결과를 뷰로 전달하는 역할을 맡게 되는데 일반적으로 이 부분은 프레임워크에서 담당하며 개발자는 어떤 모델을 실행하고 어떤 뷰를 선택할 것인지를 컨트롤러에 알려주기만 하면 됩니다. 이런 구조가 이상적인 MVC 패턴의 구조입니다.

 

MVC 패턴의 가장 큰 장점은 모델과 뷰의 분리를 통해 화면 UI를 위한 코드와 비즈니스 로직을 위한 코드가 섞이지 않는다는 것입니다. 그래서 때때로 화면 UI 개발자와 비즈니스 로직 개발자를 따로 두는 것도 가능합니다. 그리고 이 패턴을 통해 프로그램 디자인의 기본 원칙인 low coupling, high cohesion을 자연스럽게 달성할 수 있죠.

 

무언가 변경하고 싶을 때 여러 컴포넌트들을 같이 변경해야 하는 coupling은 줄이면서 컴포넌트간의 협력(cohesion)은 컨트롤러를 통해 자유롭게 할 수 있는 것입니다. 또한 모델과 뷰가 분리되면 한 모델에 여러 가지 다양한 뷰를 붙이는 것도 가능하고 그 반대의 경우도 가능합니다. 그래서 요구사항의 복잡도는 높지만 규격이 잘 정해진 애플리케이션을 만들 때는 개발자의 일을 획기적으로 줄일 수 있습니다. MVC 프레임워크란 결국 이런 모델과 뷰의 분리를 효과적으로 할 수 있는 컨트롤러를 제공한다는 데에 그 가치가 있습니다.


XML 설정 파일의 역할
프레임워크에서 또 하나 중요한 것은 설정 파일의 활용입니다. 유행처럼 번져나가기 시작한 XML 설정 파일은 요즘 거의 프레임워크의 필수사항처럼 되어가고 있습니다. 초기에 설정 파일이 등장하기 시작한 이유는 소스의 내용 중 상수에 해당하는 값들을 설정 파일로 빼 놓으면 컴파일을 다시 하지 않아도 동작을 변경할 수 있기 때문입니다. C++ 등의 언어에서는 컴파일 후에 링크까지 해야 하기 때문에 이 차이는 적지 않습니다.

 

하지만 자바에서는 필요한 부분만 간단하게 컴파일하면 바로 동작하게 할 수 있고 XP의 지속적인 통합(Continuous Integration)이 일반화되면서 소스를 변경하는 비용이 크게 줄어들었죠. 그래서 사실 지금은 XML 설정 파일에 상수를 넣어두는 것이 자바 코드에 넣는 것보다 개발시의 변경 비용이 적다고 하기 힘듭니다.

 

하지만 여전히 애플리케이션 사용자의 입장에서는 XML이 훨씬 변경하기 쉽습니다. 클라이언트로 배포된 프로그램 혹은 서버에 배치된 프로그램의 설정을 바꾸기 위해 다시 빌드를 할 수는 없는 일이니까요.

 

하지만 이런 비용적인 측면 외에도 XML 설정 파일은 자바 코드보다 좀 더 정보를 서술적(descriptive)으로 담아놓을 수 있다는 장점이 있습니다.

XML은 구조적인 정보와 메타 정보를 포함한 모든 정보를 한 눈에 알아보기 쉽게 정리할 수 있습니다. 또한 자바 코드에서 여러 클래스로 분산될 수 있는 설정 내용을 개발자가 관리하기 편한 단위로 손쉽게 통합해서 관리할 수 있죠.

 

자바의 프로퍼티도 설정 파일 용도로 많이 사용되어 왔습니다만 구조적인 정보를 제대로 정의하기 어렵기 때문에 설정 파일로는 부적합합니다. 게다가 프로퍼티는 한글 문제도 있기 때문에 앞으로 프로퍼티는 쓰지 않는 것이 좋다고 봅니다.

 

뭐든지 잘못 쓰면 해가 된다는 점에서 XML 역시 예외가 아닙니다. XML 설정 파일을 오용하는 대표적인 사례로 Jelly 스크립트가 있습니다. 자카르타 commons 프로젝트의 하나인데 XML로 스크립팅을 할 수 있게 해주는 엔진입니다. Jelly 스크립트의 파워는 여전히 진짜 프로그래밍 언어에 미치지 못하면서 Jelly로 스크립트를 짜면 가독성도 떨어지고 리팩토링하기 어렵기 때문에 점점 지저분한 코드가 되고 맙니다. Ant도 이와 비슷한 문제점이 있습니다. 그래서 복잡한 제어 흐름이 필요한 부분에서는 자바 코드를 직접 이용하고 이것이 무겁다면 좀더 가벼운 스크립트 언어를 자바에 임베딩해서 사용하는 것이 좋습니다.

 

단, SQL의 경우는 언어 자체가 결과물에 대한 정의를 표현하는 것이기 때문에 복잡한 제어 구조가 필요하지 않아 XML로 별 무리 없이 소화가 가능합니다. 실제로 XML과 JDBC를 결합시킨 iBatis에서 XML로 SQL들을 관리해보면 실제 자바 코드보다 훨씬 쉽고 보기 좋게 코딩할 수 있습니다.

또 한 가지 주의해야 할 것은 XML 설정 파일을 이용하게 만들더라도 XML 없이도 프레임워크가 동작하게 만들어야 한다는 것입니다. 앞서의 iBatis는 구현된 기능들이 정말 편리하고 좋지만 각 컴포넌트들이 지나치게 강하게 결합되어 있고 XML 설정 파일 없이는 아무 것도 하지 못합니다. 그래서 추가 기능을 넣고 싶다거나 개선하고 싶은 부분이 있을 때 상속 등의 방법으로는 해결하기 어렵고 거의 대부분 소스를 수정해야 해결할 수 있죠. 그래서 프레임워크를 만들더라도 일단 자바 코드로 모두 만든 다음 마지막에 XML로 설정 내용들을 빼는 작업을 하는 게 좋습니다.

 

살펴볼만한 프레임워크
그림도 코드도 없는 지루한 텍스트를 읽어 내려오느라 지루했을 독자들을 위해 구체적인 프레임워크들을 몇 가지 소개할까 합니다. 웹 애플리케이션 프레임워크 뿐 아니라 여러 영역에서 유용하다고 생각되는 것들을 뽑았습니다. 단지 필자의 경험 속에서 유용했던 것들이므로 한 번 살펴볼 가치가 있다는 정도로 받아들이면 될 것입니다.

 

스트럿츠와 JSF
웹 애플리케이션 프레임워크로는 스트럿츠가 현재의 주류이며 JSF가 일부에서 미래의 주류로 꼽힙니다. 모두 한 사람이 주도한 프레임워크입니다.

필자의 판단을 덧붙이면, 스트럿츠는 실제로 개발자의 일을 거의 줄여주지 못하며 오히려 늘이는 경우조차 간혹 있습니다. 스트럿츠를 쓸 바에는 직접 스트럿츠와 유사한 형태로 서블릿을 직접 사용하도록 재구성하는 것이 좋으리라 생각됩니다. 물론 유효성 검사 기능과 Tiles는 좋은 기능이지만 이들은 스트럿츠와 분리해서도 사용 가능합니다.

JSF는 미래의 주류라고 하기엔 부족함이 너무 많습니다. 썬에서 Java Studio Creator를 통해 멋진 가능성을 내보이긴 했지만 그런 IDE를 사용하지 않을 때의 JSF 코딩은 너무 번잡하고 복잡도도 큽니다. 이는 구조적으로 아직 개선의 여지가 많다는 것이죠. JSF 스펙 역시 꾸준히 발전하고 있으니 미래는 어떨지 모르겠지만 지금 JSF를 사용하는 것은 시기상조라 생각됩니다. 오히려 JSF와 비슷한 구조인 Tapestry가 더 완성도가 높다는 평가를 받고 있습니다.

 

Turbine
Turbine도 꽤 널리 쓰이는 프레임워크 중 하나입니다. 기본 틀은 스트럿츠와 비슷하나 훨씬 많은 부분들을 커버하고 있기 때문에 코딩량은 상당히 줄어듭니다. 개발자의 편의를 위한 클래스들도 많으며 Turbine 개발 과정에서 만들어진 컴포넌트들이 상당수 독립해서 별도의 프로젝트로 진행되고 있습니다. 전에는 유연성이 다소 떨어진다는 것이 단점이었는데 점점 나아지고 있습니다.

 

Spring
Spring은 요즘 주목 받는 프레임워크로 AOP(Aspect Oriented Programming)를 내세우고 있으며 low coupling, high cohesion이라는 디자인 원칙이 잘 지켜진 프레임워크입니다. 딱히 웹을 염두에 두었다기보다 종합적인 애플리케이션 프레임워크이기 때문에 부분별로 사용할 수도 있고 다른 프레임워크에 붙여서 사용하기도 합니다. 데이터베이스와 관련해서 풍부한 API를 제공하며, Mock Object를 프레임워크 자체에서 제공하고 있다는 것도 특이한 점입니다. 현재 가장 추천할 만한 프레임워크입니다.

 

iBatis
데이터베이스와 관련해서는 앞서의 Spring으로도 충분할 수 있지만 XML로 SQL을 관리하고자 한다면 iBatis가 최선의 선택일 것입니다. 내부적인 코드의 품질은 다소 떨어지지만 기능상으로는 별다른 부족함이 없습니다. Spring과 iBatis가 JDBC에 대한 단순 래퍼 수준의 API를 제공한다면 Hibernate는 OR(Object-Relation) 맵핑을 통해서 개발자는 객체만을 바라보고 데이터베이스를 간접적으로 이용할 수 있는 프레임워크입니다. 기본적으로 구조가 깔끔하고 편리하다는 평가를 받고 있으며 비즈니스 로직을 도메인 모델로 직접 다룰 수 있다는 점에서 높이 평가할만 합니다.

 

OSCache, Quartz, JUnit
이외에 웹에서 캐싱 기법으로 성능을 향상시키기 위한 OSCache, 스케쥴러를 만들기 위한 API인 Quartz도 아주 유용합니다. 물론 테스팅 프레임워크로 JUnit은 언급할 필요가 없을 것입니다. 이런 프레임워크들을 꼭 사용하지 않더라도 한 번 살펴보면 배울 만한 점들을 발견할 수 있고 이런 점들이 나중에 도움이 되는 경우가 적지 않을 것입니다.

 

많은 논란거리들
패턴이나 프레임워크는 특정 영역에 대해 어느 정도 검증된 해결책입니다. 그래서 때때로 이에 대한 맹신이 나타나기도 합니다. 검증된 방법이라는 논리로 너무 쉽게 문제 영역에 패턴을 적용하거나 프레임워크를 사용하곤 하죠. 하지만 그 문제 영역이 패턴이나 프레임워크를 활용할 수 있는 바로 그 영역이라는 점은 검증하기 힘든 것입니다. 때문에 패턴 중심적인 사고 방식이나 프레임워크에 끼워 맞추는 코딩을 지양하고 문제 영역의 해결에 충실하면서 패턴을 생각하는 것이 더 좋습니다.

 

바둑 격언 중에 ‘정석은 배우고, 잊어버려라’라는 말이 있습니다. 정석을 익혀서 알고는 있되 실전에서는 정석에 집착하지 말고 상황에 따라 유연하게 대처해야 좋은 바둑을 둘 수 있다는 뜻입니다. 패턴은 프로그래밍의 정석과도 같습니다. 상황에 대한 검증된 해결책이지만 그 상황은 계속 변하고 그 변화에 빠르게 대처해야 합니다.

 

패턴이나 프레임워크에 대한 맹신으로 빠져드는 것을 경계하기 위해 어떤 사람들은 무엇이든지 장단점이 있으니 너무 집착하지 말라고 말합니다. 이것은 옳은 말이지만 사실 큰 의미가 있는 말은 아닙니다. 무엇이든 장단이 있다는 사실은 누구도 부인할 수 없지만 또한 누구도 부인할 수 없는 자명한 사실이기에 의미 없는 말이기도 합니다. 실제 상황에 맞게 잘 쓰려면 구체적으로 장점이 무엇인지, 단점이 무엇인지를 파악하는 것이 중요합니다. 앞서 패턴과 프레임워크를 다루면서 각각의 단점들을 구구절절이 따지고 들어간 것도 그런 이유입니다.

 

나날이 신기술이 쏟아져 나오고 있지만 그에 못지않게 패러다임도 많이 변화하고 있습니다. 유연성 높은 컴포넌트 기술로 주목받던 자바빈즈가 해로운 것이라는 평가를 받기 시작하고, 많이 써야 좋은 것이라고 하던 주석을 이제는 적게 쓸수록 좋은 것이라고 합니다.

 

신기술을 따라가는 것도 필요하지만 이러한 패러다임의 변화를 읽는 것이 더 중요합니다. 현재의 방식이 지금은 가장 효율적인 방식일 수 있겠지만 지금보다 훨씬 더 효율적인 방식이 나오는데 모르고 있으면 도태될 수밖에 없습니다. 흔히 프로그래머는 워낙 기술이 빨리 발전하기 때문에 후배들을 당할 수가 없다는 말을 하곤 합니다.

 

하지만 현실은 결코 그렇지 않습니다. 기술의 변화는 단지 API가 변하는 것 뿐 그렇게 중요한 것은 아닙니다. 프로그래밍의 주요한 패러다임은 그렇게 빠른 속도로 변하지 않으며 또한 그런 패러다임의 변화를 주도하는 것은 반짝이는 아이디어가 아니라 경험 속에서 축적된 고민들입니다. 끊임없이 고민하면서 프로그래밍을 해왔다면 이런 변화를 따라잡는 것은 어려운 일이 아닙니다.

 

좋은 프로그래머가 되기 위해서 폭넓은 지식과 빠른 학습 능력은 물론 필수적인 것입니다만 그보다 더 중요한 것은 늘 고민하는 자세와 깊이 있는 사고 능력입니다. 변화를 따라잡는 힘은 빠른 학습 능력에서 나오는 것이 아니라 변화의 중요성을 인식하고 발전을 위해 고뇌하는데서 나오는 것입니다.

이번 연재는 아마 지난 두 번보다 훨씬 더 많은 논란거리들을 담고 있을 것입니다. 패러다임은 한 사람의 고민에 의해서도 발전하지만 많은 사람들의 머리를 맞댄 토론에서도 발전합니다. 필자의 글에 반론이 있거나 더 깊은 논의를 원하는 독자들은 youngrok.com이나 javaservice.net, 혹은 c2.com에 제시해 주세요. 서로를 발전시킬 수 있는 좋은 기회가 있길 바랍니다.@

 

* 이 기사는 ZDNet Korea의 제휴매체인 마이크로소프트웨어에 게재된 내용입니다.

'그거 > Tech' 카테고리의 다른 글

Velocity  (0) 2007.03.29
DOM(Document Object Model)  (0) 2007.03.20
Crossing borders: JavaScript의 특징 (한글)  (0) 2007.03.13
JSON vs. XML  (0) 2007.03.13
JSON (JavaScript Object Notation) 개요  (0) 2007.03.13
:
Posted by 뽀기
2007. 3. 14. 10:29

Recommended Documents for Beginners 그거/Java2007. 3. 14. 10:29


    서블렛 + JDBC 연동시 코딩 고려사항 -제1탄-
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=968185187

    서블렛 + JDBC 연동시 코딩 고려사항 -제2탄-
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=968522077

    Re: DB Connection Pool: Orphan and Idle Timeout
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=1005294960

    Connection/Statement 최대 동시 Open 수
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=jdbc&c=r_p&n=972287002
    '최대열기 커서수를 초과했습니다' 오류 튜닝법
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=976511779

    Connection Pool & PreparedStatement Cache Size
    http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=995572195

    Understanding JavaServer Pages Model 2 architecture
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=944700949

    Re: 서블릿에서의 Global 변수
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=959175733

    Re: [팁] EUC-KR, KSC5601, euc-kr , etc.. 20010321  손님(guest)
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=985157298

    "/servlet/test?name=이원영&address=서울 도곡동"
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=960356845

    JSP에서 DB연결의 문제
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=954339077

    Re: DB Connection Pool & 그 외의 것들
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=960704622

    Oracle OSDK DB Connection Pool 사용 방법
    http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=oas&c=r_p&n=965358223

    소스 Review 2 - ConnectionPool Q&A -
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=971498129

    73   Hans Bergsten Connectionpool 을 Thread간통신에 붙여보았습니다
    http://www.javaservice.net/~java/bbs/read.cgi?m=dbms&b=jdbc&c=r_p&n=1011919113

    AIX Java App. SIGSEGV 진단 방법에 관한 예
    http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=1000371692

    (웹로직)엔티티 빈 자동 생성 프로그램입니다.
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=weblogic&c=r_p&n=1009036410

    Re: WebLogic JSP와 Servlet에서 한글 깨지는 문제
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=weblogic&c=r_p&n=957179071

    jspSmartUpload 패키지 사용을 금합니다
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=995622233

    파일 Download에 관한 참고
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=992449785

    JDBC 코딩시 Tips - 대량데이타 Select -
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=982581488

    소스 Review 7 - Servlet/JDBC 클래스 디자인
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=983500745

    Re: 특수한 기호를 HTML TAG로 변환하는 방법
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=www&c=r_p&n=934284565

    [자바의 숫자표현] 어디까지 가능할까 !!!
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=920434490

    Object Pool Contorl 기법
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=974750350

    PPC(Peek Point Control) 기법
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=996642473

    Re: 각 환경별 Servlet & JNI 정리
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=956659322
    JNI - Native Method Pooling 기법
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=975913198
    41 JNI 2탄입니다. 
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=963972664
    Java에서 signal 처리 - JNI -
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=978373413

    26   JavaStackTrace(javacore/ThreadDump) 분석방법
    http://www.javaservice.net/~java/bbs/read.cgi?m=etc&b=jdk&c=r_p&n=1039372188

    TCP/IP Socket 프로그램 구현시 고려사항
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=1009171849
    Java Socket Utilities API : SocketUtil.java
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=976117970
    18   parse int and long type from byte[]
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=953537896
    99     Re: C <--> Java 임의의 데이타 타입 주고 받기
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=discussion&c=r_p&n=1029190704
    Re: [답변]자바와 C 간의 소켓 통신상 한글 문제
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=956208406
    109     Re: TCP Status & JNI & Socket Communication
    http://www.javaservice.net/~java/bbs/read.cgi?m=unix&b=unix&c=r_p&n=1022636033
    92   Re: TCP/IP ESTABLISHED & Connection Timeout
     http://www.javaservice.net/~java/bbs/read.cgi?m=unix&b=unix&c=r_p&n=1005195947
    Re: DB Connection Pool: Orphan and Idle Timeout
     http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=servlet&c=r_p&n=1005294960

    89 AIX 4.3.3 FIN_WAIT_1, FIN_WAIT_2, TIME_WAIT
     http://www.javaservice.net/~java/bbs/read.cgi?m=unix&b=unix&c=r_p&n=1002732057
    88 AIX4.3 "netstat -n" shows too many FIN_WAIT_2
     http://www.javaservice.net/~java/bbs/read.cgi?m=unix&b=unix&c=r_p&n=1002693727
    87 AIX 4.3 tcp keepalives & tcp_
     http://www.javaservice.net/~java/bbs/read.cgi?m=unix&b=unix&c=r_p&n=1002689463
    85 Solaris 2.x - Tuning Your TCP/IP Stack and 
     http://www.javaservice.net/~java/bbs/read.cgi?m=unix&b=unix&c=r_p&n=1002605172
    82 TCP/IP Normal Close Sequence
     http://www.javaservice.net/~java/bbs/read.cgi?m=unix&b=unix&c=r_p&n=994674560

    30   RMI 및 Object Serialization 세미나 자료 20011203  絶對高手(juldaegosu)
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=rmi&c=r_p&n=1007358212

    Orion Sever 에서 Apache SOAP 사용하기
    http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=orion&c=r_p&n=985270192
    Orion Server에서 Apache SOAP Server와 Visual Basic SOAP Client 연동하기
    http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=orion&c=r_p&n=985572196

    [세미나자료] 김덕태님의 "XML과 자바"
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=websvcs&c=r_p&n=955159322

    JSP에서 동적으로 생성된 xml보여주기
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=websvcs&c=r_p&n=985450162

    [필수]객체지향 개발자가 꼭 읽어야 할 책 4권 
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=988257203

    173   자바 프로그래밍 언어 정복(Garbage Collection 등 추가)  -출판초고,이덕하-
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=1012451983

    [필수]Design Pattern - javacompanion
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=977108336

    UML modeling 도구입니다.
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=977368627

    UML 개론 프리젠테이션 자료
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=979041227

    139   BROS - JavaBeans 의 변형입니다.
    http://www.javaservice.com/~java/bbs/read.cgi?m=devtip&b=javatip&c=r_p&n=999099977

    [온라인책] "Mastering EJB"- Ed Roman -
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=ejb&c=r_p&n=960552403
    41 EJB책한권 올립니다. (Mastering EJB)
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=ejb&c=r_p&n=1010784800

    EJB 사용을 위한 결정 요소
    http://www.javaservice.net/~java/bbs/read.cgi?m=devtip&b=ejb&c=r_p&n=973909127

    352  To EJB, or not to EJB
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=1010454437

    [TIP]EJB 1.1 트랜잭션 속성에 관한 강좌
http://www.javaservice.com/~java/bbs/read.cgi?m=appserver&b=powertier&c=r_p&n=1002186458

    Usage & Limitations of Txn Control in WebLogic V5.1
http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=weblogic&c=r_p&n=1000771631

    15 응용 S/W 아키텍춰 및 모델링
    http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=930570297

    WEB개발 및 Application Server동향
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=936757537

    Re: [답변] 자바 프로젝트 개발 방향
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=955519088

    Re: 자바 프로젝트 개발 방향 - 답변2
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=956198284

    Re: 자바 기술 Set 구성과 관련된 질문
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=956676463

    RE: Applet에서 WAS의 Connection Pool 이용 ?
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=1007007020

    대표적인 S/W 아키텍쳐 및 기술셋 예제
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=957877865

    웹서비스(WebService) 관련 기술정보/예제 및 기사
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=999508397

    Re: 세션클러스트링
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=959681361

    어플리케이션서버와 데이타서버 분리의 장단점
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=962379253

    Re: 어플리케이션서버와 데이타서버 분리의 장단점
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=962585278

    Re: ◈ 대량의 동시사용자를 위한 조언
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=974615872
   
    81   Re: [쇼핑몰] 대량의 고객정보 관리
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=966762191

    [답변]쇼핑몰 퍼포먼스 관련
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=980794006

    Oracle 8i Performance & Tuning
    http://www.javaservice.com/~java/bbs/read.cgi?m=dbms&b=dbms&c=r_p&n=1002277016

    응답시간 느린 HTTP 요청 두번이상 자동호출될 가능성
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=982251775

    장애진단(Problem Determination) 절차 
    http://www.javaservice.net/~java/bbs/read.cgi?m=resource&b=consult&c=r_p&n=1023729776

    255   성능저하시, 모니터링 방법
    http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=weblogic&c=r_p&n=1012075146

    106   RE: netstat & lsof
    http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=engine&c=r_p&n=1007110331

    대량데이타 조회시 고려사항
    http://www.javaservice.net/~java/bbs/read.cgi?m=qna&b=consult&c=r_p&n=1000186035


◆  Web Application Servers

    어플리케이션서버
    http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=appserver

    ** 이하 ABC 순입니다.

    ATG(Art Technology Group) Dynamo
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=atg
    BEA/WebLogic Application Server
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=weblogic
    Borland AppServer(Inprise Application Server)
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=inprise
    Evermind Orion Server
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=orion
    GemStone's GemStone/J
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=gemstone
    HP Netaction Application Server
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=eserver
    IBM WebSphere Application Server
     http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&b=was&c=r_p&n=1010952419
    IONA iPortal Application Server (iPAS)
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=ipas
    Marc Fleury's JBoss Application Server
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=jboss
    Oracle 9iAS/OAS/OSDK
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=oas
    Persistence PowerTier
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=powertier
    Sun/Netscape iPlanet
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=iplanet
    Sybase EAServer
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=sybase
    TmaxSoft JEUS
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=jeus
    서블렛엔진(JServ,Tomcat,JRun,..)
     http://www.javaservice.net/~java/bbs/index.cgi?m=appserver&b=engine


◆  Java Development Kit
    http://www.javaservice.net/~java/docs/jdk1.1.8/
    http://www.javaservice.net/~java/docs/jdk1.2.2/

    http://www.javaservice.net/~java/docs/j2sdk_1.3.1/
    http://www.javaservice.net/~java/docs/j2sdk_1.3.1/src/

◆  JAVA Specifications

   [Java 관련 Specifications]

   Java Language Specification -Second Edition-
      http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html

   Java Virtual Machine Specification
      http://www.java.sun.com/docs/books/vmspec/
      http://www.java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html
      http://www.java.sun.com/docs/books/vmspec/html/VMSpecTOC.doc.html

   Servlet Specification 2.3 ( Public Draft )
      ftp://ftp.javaservice.net/pub/java/spec/servlet23_PublicDraft1.pdf
      (1,475,499 bytes)

   Servlet Specification 2.2
      ftp://ftp.javaservice.net/pub/java/spec/servlet2_2-spec.pdf

   Servlet Specification 2.1
      ftp://ftp.javaservice.net/pub/java/spec/servlet-2.1.pdf

   JSP (Java Server Page) Specification 1.2 ( Public Draft )
      ftp://ftp.javaservice.net/pub/java/spec/jsp12_PublicDraft1.pdf

   JSP (Java Server Page) Specification 1.1
      ftp://ftp.javaservice.net/pub/java/spec/jsp1_1-spec.pdf

   JSP (Java Server Page) Specification 1.0
      ftp://ftp.javaservice.net/pub/java/spec/jsp1_0-spec.pdf
  
   JSP 0.91 programming reference : The IBM implementation version
http://www-4.ibm.com/software/webservers/appserv/doc/v30/ae/web/doc/whatis/icjspref.html

   OMG CORBA/IIOP 2.2 Specification : The Complete formal/98-07-01
      ftp://ftp.javaservice.net/pub/corba/spec/98-07-01.pdf (5,968,346 bytes)

   EJB(Enterprise JavaBeans) Specification Version 1.0
      ftp://ftp.javaservice.net/pub/java/spec/ejb_10.pdf  (330,603 bytes)

   Enterprise JavaBeans 1.0 CORBA Mapping
      ftp://ftp.javaservice.net/pub/java/spec/ejb-corba_10.pdf (35,377 bytes)

   JavaBeans Specification 1.01
      ftp://ftp.javaservice.net/pub/java/spec/beans_101.pdf (257,046 bytes)

   JDBC 2.0 Core API Specification
      ftp://ftp.javaservice.net/pub/java/spec/jdbc20.pdf (141,137 bytes)

   JDBC 2.0 Standard Extension API Specification (old)
      ftp://ftp.javaservice.net/pub/java/spec/jdbc20_stdext.pdf (154,667 bytes)

   JDBC 2.1 Core API Specification
      ftp://ftp.javaservice.net/pub/java/spec/jdbc2_1-spec.pdf (269,312 bytes)

   JDBC 2.0 Optional Package API specification: (new)
       NOTE: The javax.sql package is also called the JDBC 2.0 Optional Package API
             (formerly known as the JDBC 2.0 Standard Extension API).
      ftp://ftp.javaservice.net/pub/java/spec/jdbc20.stdext.pdf (327,005 bytes)


   Java Remote Method Invocation Specification (JDK 1.1, JDK 1.2)
     http://www.java.sun.com:80/products/jdk/1.1/docs/guide/rmi/spec/rmiTOC.doc.html
     http://www.java.sun.com:80/products/jdk/1.2/docs/guide/rmi/spec/rmiTOC.doc.html

   RMI Architecture and Functional Specification (JDK 1.2)
      ftp://ftp.javaservice.net/pub/java/spec/rmi-spec-JDK1_2.pdf
                                                    (495,423 bytes)

   Java Transaction API specification
      ftp://ftp.javaservice.net/pub/java/spec/jta-090.pdf

   Java IDL Documentation
      http://www.java.sun.com:80/products/jdk/1.2/docs/guide/idl/index.html

출처 : JavaServiceNet

:
Posted by 뽀기
2007. 3. 14. 09:41

Daily English 2007.03.14 생활/영어2007. 3. 14. 09:41

silverware
=> all the things made of silver, especially the cutlery and dishes in a house
=> The hotel silverware was specially designed by Grieve and Co.

landing
=> the act of coming or being put ashore or of returning to the ground.
=> We had an emergency landing.

forfeit
=> to be deprived of
=> Guests failing to notify management of staying over will be assessed a fee of three dollars, and will forfeit their key deposit of an additional two dollars.

resolutely
=> determined in character, action or ideas
=> She resolutely refused to learn about computers

enhanced
=> imporvoed or increased the value, quality or intensity of something
=> It is also belived that eyesight will be able to be enahanced by this advancement.

courseware
=> an educational software
=> Use electronic bulletin boards, e-mail, computer-based video conferencing, decision-support software, multimedia courseware, and more.

endurance
=> the capacity for, or the state of, patient toleration
=> Cross training is good for building speed and endurance.

cordial
=> warm and sincere; friendly
=> His personal relations with Callaghan were far more cordial than they had ever been.

dredge
=> to clear the bottom of deepen ( the sea or a river) by bringing up mud and waste
=> Scientists say the best way to remove the polluted sediments from the river bed is by dredging.


A : Oh, it's a lonely world, Lily.
B : I thought you were over her.
A : I was. I am. She was still maybe my best friend and the only childhood friend that I kept.
    I don't know. I just don't do well with birthdays.
B : I hear they're throwing you a big party. Sometimes you got to let the world be a party.

A : 옆구리가 시리네요, Lily.
B : 그녀를 잊었는 줄 알았는데.
A : 잊었어요. 그럴거고. 그녀는 아직 내 어린시절을 함께한 유일한 친구이고, 최고의 친구에요. 글쎄요. 생일날은 정말 싫어요.
B : 친구들이 큰 파티를 열어준다고 들었는데, 가끔은 그냥 세상을 즐겨봐요.

1. I very much appreciate the __________ extended to me when I visited your company last week.
(A) altruism
(B) cultivation
(C) fondness
(D) hospitality

extend : 베풀다
altruism : 애타주의, 이타주의 <-> egoism : 이기주의
cultivation : 경작, 개간, 교화, 양성
fondness : 애호, 애정, 맹목적인 사랑
hospitality : 환대, 후한 대접, 호의

2. The data we obtained on the seismic activities of the volcanin island seem to be consistent with _____ findings.
(A) quick
(B) before
(C) done
(D) past

명사를 수식할 형용사 자리

before : 부사
done : 명사 뒤에서 상태 등을 설명


'생활 > 영어' 카테고리의 다른 글

Daily English 2007.03.28  (0) 2007.03.28
Daily English 2007.03.22  (0) 2007.03.22
Daily English 2007.03.13  (0) 2007.03.13
Daily English 2007.03.12  (0) 2007.03.12
Daily English 2007.03.05  (0) 2007.03.05
:
Posted by 뽀기
2007. 3. 13. 16:14

Crossing borders: JavaScript의 특징 (한글) 그거/Tech2007. 3. 13. 16:14

프로그래밍 언어의 단점 분석 (한글)





난이도 : 초급

Bruce Tate, President, RapidRed

2007 년 2 월 27 일

JavaScript는 프로그래밍 언어의 골칫거리로 취급을 받곤 합니다. 지극히 많은 개발 툴, HTML 페이지에 대한 복잡하고 일관성 없는 문서 객체 모델, 그리고 일관성 없는 브라우저 구현 등 때문입니다.하지만 JavaScript는 우리가 생각하는 그저 그런 장난감이 아닙니다. 이 글의 저자인 Bruce Tate가 JavaScript의 기능들을 설명합니다.

웹 개발자라면 한번쯤은 JavaScript를 욕한 적이 있을 것이다. 문서 객체 모델(DOM:Document Object Model)이라고 하는 복잡한 프로그래밍 모델, 구현 및 디버깅에 사용되는 형편없는 툴, 일관성 없는 브라우저 구현 때문에 JavaScript는 더욱 욕을 먹고 있다. 최근까지도 많은 개발자들은 기껏해야 필요악으로써, 최악의 경우에는 장난감으로 취급하고 있을 정도이다.

하지만 JavaScript는 중요성이 더해가고 있고, 웹 개발에 광범위하게 사용할 수 있는 스크립팅 언어이다. 일부 업계 리더들은 JavaScript를 새로운 시각으로 바라보고 있다. Asynchronous JavaScript and XML(Ajax) 같은 프로그래밍 기술로 인해 인터랙티브(interactive) 웹 페이지 구현이 가능해졌다. Apache Cocoon 같은 완전한 웹 개발 프레임웍은 JavaScript를 사용하고 있다. ActionScript라고 하는 JavaScript 파생물은 Macromedia의 Flash의 클라이언트 측 프레임웍이다. 그리고 JVM에서 실행되는 Rhino는 JavaScript를 주 스크립팅 언어로 사용한다. (참고자료).

Ajax 전문가인 나의 동료 Stuart Halloway는 "2011년이 되면, 현대적 애플리케이션을 개발하는데 필요한 기능을 갖춘 언어로 JavaScript를 선택하게 될 것이다."라고 말하고 있다. JavaScript 프로그램들은 비슷한 자바 프로그램들 보다 10배 정도 밀도가 있고, 또 그럴 만한 언어 기능들을 증명했다.

시리즈 소개

In the Crossing borders 시리즈에서는 Bruce Tate가 자바 프로그래머들이 다른 방식과 언어를 배울 수 있는 기회를 제공한다. 모든 개발 프로젝트에 자바만이 최고의 선택이었던 시절 이후 프로그래밍 세계는 변했다. 다른 프레임웍들도 자바 프레임웍이 걸어왔던 길을 걷고 있고, 다른 언어에서 배운 개념들도 자바 프로그래밍에 접목시킬 수 있다. Python (또는 Ruby 또는 Smalltalk) 코드는 자바 코딩 방식을 변화시킬 수 있다.

이 시리즈에서는 자바 개발과는 매우 다르지만, 적용할 수 있는 프로그래밍 개념과 기술을 소개한다. 어떤 경우, 이를 활용하기 위해서는 기술을 통합해야 한다. 또는, 이 개념들을 직접 적용할 수도 있을 것이다. 툴과 같은 경우, 다른 언어들과 프레임웍들이 자바 커뮤니티의 개발자, 프레임웍, 기본 방식들에 영향을 미칠 수 있는 개념만큼은 중요하지는 않다.

이 글에서는 매우 매력적인 JavaScript의 기능을 살펴보도록 하겠다.

  • Higher-order functions. Higher-order function은 인자로서 함수들을 취하거나 함수를 리턴하는 함수이다. JavaScript 프로그래머들은 자바 언어가 할 수 없는 방식으로 함수들을 조작할 수 있다.

  • Dynamic typing. 바인딩을 지연시켜서 보다 정확하고 유연한 JavaScript로 만든다.

  • A flexible object model. JavaScript의 객체 모델은 일반적인 자바 클래스 기반의 객체 모델 대신, 프로토타입(prototypes)이라고 하는 상속에 대해 비교적 특이한 접근 방식을 사용한다.

여러분은 아마도 다른 Crossing borders 기술자료에서 설명한 동적 타이핑 모델(dynamic typing model), Higher-order function 형태의 함수 프로그래밍, 오픈 객체 모델(open object model)에 대해 알고 있을 것이다. 만일 여러분이 중요한 JavaScript 개발을 해본 적이 없다면, 이러한 기능들이 JavaScript 같은 "장난감" 언어가 아닌, Python, Lisp, Smalltalk, Haskell 같은 중요한 언어에 속한 기능이라고 생각할 것이다. 이제부터 이러한 개념들을 실제 코드 예제를 통해서 설명하도록 하겠다.

시작

JavaScript를 설치하기 위해 특별히 해야 할 일은 없다. 여러분의 브라우저에서 이 글을 읽는 것으로 충분하다. 이 글의 모든 프로그래밍 예제들은 대부분의 브라우저에서 실행된다. 나는 Firefox를 사용할 것이다.

나는 <script type='text/javascript'></script>로 래핑된 임베디드 JavaScript가 있는 간단한 웹 페이지를 로딩하겠다. Listing 1은 "Hello, World" 텍스트를 디스플레이 한다.


Listing 1. Hello, world
				
<script type='text/javascript'>
alert('Hello, World.')
</script>

코드를 실행하려면, example1.html이라는 파일을 생성하고, Listing 1을 이 파일에 복사하고, 브라우저에 파일을 로딩하면 된다. (HTML 파일 예제는 다운로드 섹션을 참조하라.) 이 코드는 페이지를 재 로딩 할 때마다 즉시 실행된다.

alert은 매개변수로서 하나의 스트링을 갖고 있는 함수 호출이다. 그림 1은 Listing 1의 코드가 "Hello, World"라는 박스를 띄우는 모습이다. 이 코드가 HTML 바디로 되어 있다면(여러분은 어떤 바디도 설정하지 않았지만, 브라우저는 엉성한 HTML라도 감수하고, 기본적으로 이 모든 페이지들을 바디로서 취급한다.) 페이지가 로딩되면 JavaScript가 실행된다.


그림 1. Hello, world
Hello, World.

실행을 지연해야 한다면, Listing 2와 같이 HTML <head> 엘리먼트에 JavaScript 함수를 선언할 수 있다.


Listing 2. 실행 지연
				
<head>
    
    <script type='text/javascript'>
        function hello() {
            alert('Hello, World.')
        }
    </script>
</head>
<body>
    <button onclick="hello();">Say Hello</button>
</body>

Listing 2의 코드를 HTML 파일에 입력하고, 브라우저에 파일을 로딩하고, Say Hello 버튼을 클릭하면, 그림 2와 같은 결과가 나온다.


그림 2. 실행 지연
Delaying execution



위로


Higher-order functions

Listing 2에서, 함수들을 조작하는 JavaScript이 기능을 보았다. 그 함수의 이름을 HTML button 태그로 전달하고, HTML의 빌트인 이벤트 모델을 활용한다. 나는 가끔씩 JavaScript를 사용하여, 변수 또는 어레이에 함수들을 저장한다. (아래 객체 모델(Object models) 섹션에서, JavaScript 객체 모델 전략이 이 기술을 사용하고 있는 것을 확인할 수 있다.) Listing 3을 보자.


Listing 3. 변수를 가진 함수 다루기
				
<head>
    
    <script type='text/javascript'>
        hot = function hot() {
            alert('Sweat.')
        }
        cold  = function cold() {
            alert('Shiver.')
        }
        
        function swap() {
            temp = hot
            hot = cold
            cold = temp    
            alert('Swapped.')
        }
    </script>
</head>
<body>
    <button onclick="hot();">Hot</button>
    <button onclick="cold();">Cold</button>
    <button onclick="swap();">Swap</button>
</body>

함수들은 JavaScript의 퍼스트 클래스(first-class) 객체들이고, 이들을 자유롭게 조작할 수 있다. 우선, 나는 두 개의 함수를 선언한다. hotcold이다. 각각을 하나의 변수에 저장한다. Hot과 Cold 버튼을 클릭하면 해당 기능이 호출되며 경고를 발생한다. 그런 다음, 나는 Hot과 Cold 버튼의 값을 바꾸는 함수를 선언하면서, 이 함수를 제 3의 버튼에 붙이면 그림 3과 같은 경고가 디스플레이 된다.


그림 3. 함수 다루기

이 예제는, 다른 변수들을 다루듯이 함수를 취급할 수 있다는 것을 보여준다. C 개발자들은 이 개념을 함수 포인터(function pointer)로 생각하겠지만, JavaScript의 higher-order function의 개념은 훨씬 더 강력한 것이다. 이 기능을 사용하면 JavaScript 프로그래머는 액션 또는 함수들을 다른 변수 유형을 다루는 것만큼 쉽게 다룰 수 있다.

함수를 함수 인자로서 사용하거나, 함수를 값으로서 리턴하면, 추상화를 Higher-order function의 경지로 끌어올릴 수 있다. Listing 4는 Listing 3을 약간 수정한 것으로, 함수를 리턴하는 higher-order function을 보여준다.


Listing 4. Higher-order functions
				
<head>

    <script type='text/javascript'>

        function temperature() {
            return current
        }

        hot = function hot() {
            alert('Hot.')
        }

        cold  = function cold() {
            alert('Cold.')
        }

        current = hot

        function swap() {
            if(current == hot) {
              current = cold
            } else {
              current = hot
            }
        }
    </script>
</head>
<body>
    <button onclick="funct = temperature()();">Temperature</button>
    <button onclick="swap();">Swap</button>
</body>

이 예제는 일반적인 문제를 해결한다. 변하는 작동을 사용자 인터페이스 이벤트에 어떻게 붙일 것인가? Higher-order function을 사용하면 쉽게 해결할 수 있다. temperature higher-order function은 current 값을 리턴하는데, 여기에는 hot 또는 cold 함수가 있다. 이상하게 보이는 함수 호출을 살펴보도록 하자. 바로 temperature()()이다. 첫 번째 괄호는 temperature 함수를 호출한다. 두 번째 괄호는 temperature에 의해 리턴 되는 함수를 호출한다. 그림 4는 결과이다.


그림 4. Higher-order function
higher-order functions

Higher-order function은 함수 프로그래밍의 기초가 되고, 거의 모든 사람들은 순수한 객체 지향 프로그래밍보다 고급 추상화를 나타낸다고 믿고 있다. 하지만, JavaScript의 장점은 Higher-order function이 전부가 아니다. JavaScript의 동적 타이핑(Dynamic Typing)도 UI 개발에 알맞다.




위로


동적 타이핑(Dynamic typing)

정적 타이핑(static typing)의 경우, 컴파일러는 인자, 변수 또는 주어진 연산에 사용된 값에 대한 리턴 값들을 검사할 수 있다. 장점은 컴파일러가 추가 에러 체크도 할 수 있다는 것이다. 또한 정적 타이핑은 IDE 같은 툴에 대한 추가 정보도 제공하고, 더욱 나은 코드 완성 같은 특징을 갖고 있다. 하지만 정적 타이핑은 여러 가지 단점들도 있다.

  • 의도(intention)를 일찍 선언해야 하기 때문에, 유연성이 떨어진다. 예를 들어, 자바 클래스를 변경하면 클래스의 유형을 변경해야 하고, 재 컴파일이 필요하다. 반대로, Ruby는 오픈 클래스를 허용하지만, 클래스를 변경하면 그 클래스의 유형도 변경해야 한다.

  • 같은 생각을 표현하는 데에도 더 많은 코드를 입력해야 할 경우가 종종 있다. 예를 들어, 인자들을 가진 유형 정보를 포함시키고, 함수를 가진 값들을 리턴해야 하고, 모든 변수들을 타이핑 해야 한다. 또한, 모든 변수들을 선언해야 하고, 유형들 간 변환도 필요하다.

  • 컴파일-전개 사이클은 비슷한 동적 언어의 개발 사이클 보다 길다. 가끔은 툴을 사용하여 이러한 문제들을 완화시킬 수 있지만 말이다.

정정적 타이핑은 미들웨어나 OS를 구현하는 언어에 알맞다. UI 개발은 더 나은 생산성과 유연성을 요하기 때문에 동적 타이핑이 선호된다. 물론, 위험 부담도 있다. JavaScript로 작업하는 웹 개발자들은 잘못된(mistyped) 변수 이름 때문에 골머리를 앓을 때가 있다. 하지만 장점도 만만치 않다. 두 가지 예제를 설명하겠다.

먼저, 하나의 객체를 생각해 보자. Listing 5에서, 나는 새로운 객체를 만들고, color라고 하는 존재하지 않는 애트리뷰트에 액세스 한다.


Listing 5. 애트리뷰트 가져오기
				
<script type='text/javascript'>
    blank_object = new Object();
    blank_object.color = 'blue'
    alert('The color is ' + blank_object.color)
</script>

애플리케이션을 로딩하고 실행하면 그림 5와 같은 결과가 생긴다.


그림 5. 애트리뷰트 가져오기
Introducing attributes

JavaScript는 blue 애트리뷰트가 존재하지 않는다고 해서 불평하지 않는다. 정적 언어 옹호론자들이라면 무수한 에러 잠재력을 가진 이 예제를 보고 놀랄 것이다. 위험해 보일지라도, 그 매력을 거부할 수 없다. 우리는 애트리뷰트를 가져올 수 있다. 이 예제를 이 글의 이전 예제들과 결합하여 작동을 가져올 수도 있다. 변수에는 함수가 포함될 수 있다는 것을 기억하라. Dynamic Typing과 Higher-order function에 기반하여 임의의 작동을 언제라도 클래스로 가져올 수 있다.

Listing 5를 Listing 6과 같이 쉽게 다시 작성할 수 있다.


Listing 6. 작동 가져오기
				
<script type='text/javascript'>
    blank_object = new Object();
    blank_object.color = function() { return 'blue'}
    alert('The color is ' + blank_object.color())
</script>

얼마나 빨리 JavaScript로 개념들을 변경할 수 있는지를 보고 있다. 데이터에 대한 작동을 가져오는 것과 마찬가지로, 의미를 변경하고 신택스를 아주 조금 변경하면 된다. 이것은 강점도 되고 가장 큰 약점도 된다. 사실, 이 언어 자체의 객체 모델은 JavaScript의 강점을 보여주는 하나의 예에 불과하다.




위로


객체 모델(Object model)

지금쯤이면, 여러분은 JavaScript가 장난감 그 이상이라는 것을 깨달아가고 있어야 한다. 사실 많은 사람들이 이 객체 모델을 사용하여 복잡하고, 잘 디자인 된, 객체 지향 소프트웨어를 만들고 있다. 하지만, 이러한 객체 모델은(특히 상속의 경우) 익숙한 것이 아니다.

자바 언어는 클래스 기반이다. 애플리케이션들을 구현할 때, 모든 객체들을 위한 템플릿으로서 새로운 클래스를 구현한다. 그런 다음, new를 호출하여 새로운 템플릿을 인스턴스로 만들면서 새로운 객체를 만든다. JavaScript에서, 여러분은 프로토타입을 만드는데, 이것은 모든 미래의 객체들을 만드는 인스턴스이다.

추상적인 설명은 집어치우고, 실제 코드를 보여주도록 하겠다. Listing 7은 name이라는 애트리뷰트와 speak 액션을 가진 Animal을 만든다. 그리고 나서 다른 동물들은 이 베이스(base)에서 상속을 받을 것이다.


Listing 7. 컨스트럭터 만들기
				
<script type='text/javascript'>        
function Animal() {
    this.name = "nobody"
    this.speak = function () {
        return "Who am I?"
    }
}

myAnimal = new Animal();
alert('The animal named ' + myAnimal.name + 
      ' says ' + myAnimal.speak());

</script>

Listing 7은 그림 6과 같은 모습으로 나타난다.


그림 6. 컨스트럭터 구현하기
constructor

자바 개발자에게 Listing 7의 코드는 예측이 불가능하고 이상해 보인다. 고유의 객체들을 구현하지 않는 대부분의 JavaScript 개발자들에게도 이 코드는 예측 불가능하고 이상해 보인다. 나는 이 그림에 어느 정도의 정상성을 부여해야 할 것이다.

세 조각의 정보가 필요하다. 첫 번째로, JavaScript는 객체들을 중첩된 함수들로서 나타낸다. Listing 7의 Animal의 정의가 유효한 신택스라는 것을 의미한다. 두 번째, JavaScript는 객체 구조를 프로토타입 또는 기존의 객체 인스턴스에 의존한다. 클래스 템플릿이 아닌. funct()는 호출이지만, new Animal()Animal의 프로토타입에 기반하여 객체를 구현한다. 마지막으로, JavaScript에서 객체들은 단순히 함수와 변수들의 컬렉션이다. 어떤 유형도 객체와 제휴되지 않으므로 이 구조를 자유롭게 수정할 수 있다.

Listing 7로 다시 돌아가보자. JavaScript가 Animal에서 지정한 프로토타입에 기반하여 새로운 객체인 myAnimal을 정의하는 것을 볼 수 있다. 여러분의 프로토타입에서 애트리뷰트와 함수들을 사용하거나, 함수나 애트리뷰트를 재정의 할 수 있다. 이러한 작동에 익숙하지 않은 자바 개발자들에게 이러한 유연성은 해가 될 수 있지만, 매우 강력한 모델이다.

prototype이라는 인스턴스 변수를 사용하여 당신이 사용한 객체의 껍데기(basis)를 선언 할 수 있다. prototype 인스턴스 변수를 설정하여 상속 체인에서 부모를 가리키도록 할 것이다. prototype을 설정하면, 여러분이 생성한 객체들은 애트리뷰트와 함수들을 상속할 것이다. 이러한 방식으로, 상속의 객체 지향 개념을 시뮬레이트 할 수 있다. Listing 8을 보자.


Listing 8. 상속
				
<script type='text/javascript'>        

Animal = function() {
    this.name = "nobody"
    this.speak = function () {
        return "Who am I?"
    }
}
Dog = function() {
  this.speak = function() {
    return "Woof!"
  }
}
Dog.prototype = new Animal();

myAnimal = new Dog();
alert('The animal named ' + myAnimal.name + 
      ' says ' + myAnimal.speak());
      </script>

Listing 8에서, Dog 프로토타입을 만든다. 그 프로토타입은 Animal에 기반하고 있다. Dogspeak() 메소드를 재 정의하지만, name() 메소드에 대해서는 어떤 것도 수행하지 않는다. 그런 다음, Dog의 프로토타입을 Animal로 설정한다. 그림 7은 결과 모습이다.


그림 7. 프로토타입과 상속
inheritance

다음은 JavaScript가 애트리뷰트나 메소드에 대한 레퍼런스를 해결하는 방법이다.

  • JavaScript는 생성자(Constructor)에 정의된, 원래 프로토타입에 기반하여 인스턴스를 만든다. 여러분이 참조하는 메소드나 애트리뷰트는 여러분이 생성한 원래 카피를 사용할 것이다.

  • 객체에서 변수들을 다른 변수들처럼 재정의 할 수 있다. 이렇게 해서, 객체를 변경할 수 있다. 따라서, 여러분이 분명하게 정의한 애트리뷰트나 함수들은 원래 프로토타입에서 정의된 것들 보다 우위를 차지한다.

  • prototype이라고 하는 인스턴스 변수를 설정하면, JavaScript는 정의되지 않은 인스턴스 변수나 애트리뷰트에 대한 인스턴스를 보게 될 것이다. 검색은 반복적이다.prototype에서 정의된 인스턴스가 애트리뷰트나 함수를 찾을 수 없다면 이것의 프로토타입을 볼 것이다.

그렇다면 JavaScript의 상속 모델은 무엇인가? 이 모든 것은 여러분이 정의하는 방식에 의존한다. 여러분은 상속 작동을 정의하여 이를 오버라이드 할 수 있다. JavaScript는 객체 지향 언어보다는 함수적이고, 똑똑한 신택스와 의미를 사용하여 매우 복잡한 작동들을 시뮬레이트 한다. 객체 모델은 매우 유연하고 개방적이며 매우 강력하다. 누군가는 이것이 너무 유연하다고 말한다. 각자의 작업에 알맞은 올바른 툴을 사용해야 한다.




위로


Wrap up

JavaScript 객체 모델은 Dojo 같은 거대한 라이브러리를 지원하는 언어 기능들을 기반으로 구현된다. (참고자료) 이러한 유연성 덕택에 각 프레임웍이 섬세한 방식으로 객체 모델을 변경할 수 있다. 어떤 면에서는 이러한 유형의 유연성이 큰 약점이다. 상호운용성 문제를 떠올리면 쉽게 이해된다. (언어의 유연성으로 이러한 문제가 완화되기도 하지만 말이다.)

또 다른 관점에서 볼 때, 유연성은 대단한 축복이 될 수도 있다. 자바 언어는 복잡함이 문제였다. 기본 객체 모델은 확장될 수 있을 정도로 유연하지 않다. Aspect 지향 프로그래밍, Spring 프로그래밍 프레임웍, 바이트코드 강화 라이브러리 같은 대단한 오픈 소스 프로젝트는 엔터프라이즈 개발자들이 자바 언어를 성공적으로 다루기 위해서 배워야 할 것들이다.

JavaScript의 유연성 덕택에 higher-order 언어의 힘을 맛볼 수 있었다. 모든 프로젝트에서 이를 선택할 수 없다. 정확한 정보에 기반하여 언어의 강점과 단점을 파악하면 더욱 잘 핸들할 수 있다. JavaScript 웹 위젯을 다룰 수 있을 정도라면 언어의 힘을 충분히 활용하는 것이다. 다음 시간을 기대해주기 바란다.

기사의 원문보기





위로


다운로드 하십시오

설명 이름 크기 다운로드 방식
Sample HTML files for this article j-cb12196.zip 3KB HTTP
다운로드 방식에 대한 정보


참고자료

교육

토론


필자소개

Bruce Tate

Bruce Tate는 베스트 셀러인 Jolt winner Better, Faster, Lighter Java의 저자이다. 최근에는 From Java to RubyRails: Up and Running를 출간했다. IBM에서 13년 동안 근무했으며, 자바와 Ruby on Rails에 기반한 경량 개발 전략과 아키텍트를 전문적으로 다루는 RapidRed를 창립했다. 현재 그는 WellGood LLC의 CTO이다.


출처 : IBM developerWorks

'그거 > Tech' 카테고리의 다른 글

DOM(Document Object Model)  (0) 2007.03.20
패턴과 프레임워크  (0) 2007.03.14
JSON vs. XML  (0) 2007.03.13
JSON (JavaScript Object Notation) 개요  (0) 2007.03.13
소프트웨어 개발 방법론 충격진화「MDA」  (0) 2007.03.05
:
Posted by 뽀기
2007. 3. 13. 15:22

JSON vs. XML 그거/Tech2007. 3. 13. 15:22

Ajax를 이용한 웹 애플리케이션이 늘어나면서부터 서버와의 통신에 있어 어떠한 데이터 교환 형식을 이용할지에 대한 관심이 부쩍 늘어난 것 같다. 이러한 관심의 예로 JSON(Javascript Object Notation)을 기존 XML을 대체할 데이터 교환 규약으로 보고 있는 사람들이 많으며 26일 InfoQ에서도 이러한 JSON과 XML에 대한 논쟁?을 기사로 올렸다. XML은 지난 몇년에 걸쳐 업계의 노력으로 이제는 완전히 시장이 포화상태에 있다. 반면 JSON은 그동안 사람들에게 많이는 알려지지 않았지만, 그 고유의 단순함 내지는 경량모델로 최근에 개발자들 사이에서 인기를 얻고있는 데이터 교환이다. 뭐 사실 구글에서 조금만 검색해도 JSON에 대한 이런 이야기는 많이 찾아볼 수 있다. -_-;

JSON은 Head Rush Ajax라는 책에서 처음 접했는데, 처음보는 것이고 또 아직은 XML이 더 눈에 익숙하고 더 연마해야 하는지라 자세히 살펴보지는 않았는데, JSON에 관한 ppt를 보니 사람들이 왜 JSON에 열광하는지 조금 이해가 갔다. 사실 XML은 그 규약 자체도 상당히 엄격한(XML의 well-formedness를 준수하는 데만도 10가지 규칙을 내세운다.)데다 네임스페이스나 그런것도 복잡하고...

아무튼 JSON을 지지하는 측에서 JSON이 데이터 교환에 있어서의 장점은 이렇단다. (대충 직역)
1. 사람과 동시에 기계도 읽을 수 있는 형식이다.
2. 유니코드를 지원하는데, 따라서 거의 모든 인간 언어가 소통 가능하다.
3. 자기문서화적이다(? 원문 - self-documenting). 즉, 특정 값 뿐만 아니라 구조와 필드명까지 서술한다.
4. 엄격한 문법과 필수적인 알고리즘을 허용하는 파싱 요구조건이 단순하며, 효율적이고, 일관성있다.
5. 대부분의 일반 컴퓨터 과학에서 제시하는 자료구조인 레코드, 리스트, 트리를 표현할 수 있는 능력을 지녔다.

반면에 JSON 사용에 대해 반박하는 일반적인 논쟁거리는 다음과 같다.
1. JSON은 네임스페이스를 갖지 않는다. 따라서 모든 객체 자체가 네임스페이스이며 키 집합은 다른 객체에 독립적이며 심지어 배타적으로 중첩된다. 또한 JSON은 애매모호함을 피하기 위해 다른 언어에서 하는 것과 같이 컨텍스트를 이용한다.
2. JSON은 검증기가 없다. 궁극적으로 모든 애플리케이션이 입력에 대한 검증을 책임져야 한다. 이는 위임될 수 없으나 YAML 검증기는 사용할 수 있다.
3. JSON은 확장될 수 없다. 사실 그럴필요가 없다. JSON은 유연하며 어떠한 비순환 데이터 구조를 표현할 수 있다. 새로운 필드가 기존 구조를 폐기시키지 않고도 추가될 수 있다.
4. JSON은 XML이 아니다. Douglas는 JSON이 XML에 비해 훨씬 더 심플하다고 주장한다.

읽고나서 보니 Douglas 이 사람 JSON을 발명한 아키텍트네.. -_-;;
아무튼 JSON이 XML에 비해 데이터 교환에 있어서는 상당히 간단한 것임에는 틀림없고, 어디에 어떻게 사용되는 지는 그 상황이 어떠한 상황이냐에 달린 것 같다.(어중간한 으로 마무리.. -_-v)

그나저나 JSON은 뭐라고 발음한다냐? '제이손'? '제이에스-온'? '제이에스오엔'?, '자바스크립트 오브젝트 노테이션~ 헉헉'?

출처 : decoder.egloos.com

:
Posted by 뽀기
2007. 3. 13. 15:19

JSON (JavaScript Object Notation) 개요 그거/Tech2007. 3. 13. 15:19


JSON
(JavaScript Object Notation)은 경량의 DATA-교환 형식이다. 이 형식은 사람이 읽고 쓰기에 용이하며, 기계가 분석하고 생성함에도 용이하다. JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999의 일부에 토대를 두고 있다. JSON은 완벽하게 언어로 부터 독립적이지만 C-family 언어 - C, C++, C#, Java, JavaScript, Perl, Python 그외 다수 - 의 프로그래머들에게 친숙한 관습을 사용하는 텍스트 형식이다. 이러한 속성들이 JSON을 이상적인 DATA-교환 언어로 만들고 있다.

JSON은 두개의 구조를 기본으로 두고 있다:

  • name/value 형태의 쌍으로 collection 타입. 다양한 언어들에서, 이는 object, record, struct(구조체), dictionary, hash table, 키가 있는 list, 또는 연상배열로서 실현 되었다.
  • 값들의 순서화된 리스트. 대부분의 언어들에서, 이는 array, vector, list, 또는 sequence로서 실현 되었다.

이러한 것들은 보편적인 DATA 구조이다. 사실상 모든 현대의 프로그래밍 언어들은 어떠한 형태로든 이것들을 지원한다. 프로그래밍 언어들을 이용하여 호환성 있는 DATA 형식이 이러한 구조들을 근간에 두고 있는 것은 당연하다.

JSON 에서, 이러한 형식들을 가져간다:

object는 name/value 쌍들의 비순서화된 SET이다. object는 { (좌 중괄호)로 시작하고 } (우 중괄호)로 끝내어 표현한다. 각 name 뒤에 : (colon)을 붙이고 , (comma)로 name/value 쌍들 간을 구분한다.

array은 값들의 순서화된 collection 이다. array는 [ (left bracket)로 시작해서 ] (right bracket)로 끝내어 표현한다. , (comma)로 array의 값들을 구분한다.

value는 큰따옴표안에 string, number ,true ,false , null, object ,array이 올수 있다. 이러한 구조들을 포함한다.

string은 큰따옴표안에 둘러 싸인 zero 이상 Unicode 문자들의 조합이며, 쌍다옴표안에 감싸지며,backslash escape가 적용된다. 하나의 문자(character)도 하나의 문자열(character string)로서 표현된다. string은 C 또는 Java 문자열 처럼 매우 많이 비슷하다.

number는 8진수와 16진수 형식을 사용하지 않는것을 제외하면 C와 Java number 처럼 매우 많이 비슷하다.

토근들의 어떤 쌍 사이에 공백을 삽입할수 있다. 드물게 encode된 세부 항목을 제외하면, 이렇게 설명된 JSON의 형식은 완벽하게 그 언어를 설명한다.






Why JSON isn't just for JavaScriptI can't believe it's not XML!The JSON vs XML debate begins in earnestJSON and XMLWhy JSON vs XML is a yawnJSON vs. XML as a data interchange formatExamining JSON

json@JSON.org


출처 : www.json.org
:
Posted by 뽀기