[[TableOfContents]] == 소개 == * --ìž‘ì€ ìžë°”를 건드리면 어떻게 ë 까?-- * 2012년형 중장기 Java 스터디! === 누가? === * 튜터: [변형진] * 튜티: [김태진], [김준ì„], [권순ì˜], [서민관], [서ì˜ì£¼], [ê¶Œì˜ê¸°] * 누구나 참여 가능합니다. ê°ìž ì´ë¦„ì„ ì¨ì£¼ì„¸ìš”. * 최소 Java 기초 문법 ì´í•´ ë° í•™ë¶€ 2학년 1학기 커리í˜ëŸ¼ ìˆ˜ì¤€ì˜ ì „ì‚°ì§€ì‹ í•„ìš” * ì´ë¡ ê³¼ 실무 ì§€ì‹ì„ ëª¨ë‘ ë‹¤ë£° ì˜ˆì •ì´ë¯€ë¡œ Java ê²½í—˜ì´ ë§Žì„ ìˆ˜ë¡ ì¢‹ìŠµë‹ˆë‹¤. * ìš°ì•™ ìž¬ë°Œê² ë‹¤ - [서지혜] * í¥ë¯¸ë¡œì›Œì„œ ì°¸ì—¬í•˜ê³ ì‹¶ì§€ë§Œ ì•„ì§ ì„œìš¸ì— ê°ˆë§Œí•œ í˜•íŽ¸ì´ ì•ˆë˜ë„¤ìš”.. í¥ë¯¸ë¡œìš´ ì£¼ì œë¥¼ 다루시는것 ê°™ë˜ë°. - [안í˜ì¤€] === ì–¸ì œ? === * í† ìš”ì¼ ì˜¤í›„ 1시부터 === 어디서? === * ì œ2공학과 6층 ZeroPage학회실 ë˜ëŠ” 컴퓨터공학부실습실 === 무엇ì„? === * í•™êµì—서 배울 수 없는 Javaì— ëŒ€í•œ ì¢€ë” ê¹Šê³ ë‹¤ì–‘í•œ ì´ì•¼ê¸° * 다룰 법한 ì£¼ì œ * Java Technology와 ìƒíƒœê³„ * Java 개발 환경 ë° ë¹Œë“œ 프로세스 * Java í”„ë¡œê·¸ëž˜ë° ì–¸ì–´ * Java 코딩 컨벤션 * í´ëž˜ìŠ¤ì™€ ê°ì²´ * [:Java/Annotations Annotations] ë° [:Java/Generics Generics] * 예외 처리 * Java API와 주요 ê¸°ìˆ * [:Java/Collections ì»¬ë ‰ì…˜ í”„ë ˆìž„ì›Œí¬]와 ë™ì‹œì„± ì œì–´ * Servletê³¼ Servlet 컨테ì´ë„ˆ * Java 런타임과 [:Java/Reflection ë¦¬í”Œë ‰ì…˜] * ìž…ì¶œë ¥ê³¼ ë„¤íŠ¸ì›Œí¬ * í”„ë ˆìž„ì›Œí¬ì™€ 아키í…처 * MVC와 ì˜ì†í™” 계층(DB) * [:Java/OpenSourceLibraries 주요 오픈 소스 ë¼ì´ë¸ŒëŸ¬ë¦¬] * Java 개발 ë°©ë²•ë¡ * ê°ì²´ì§€í–¥ í”„ë¡œê·¸ëž˜ë° * ë¦¬íŒ©í„°ë§ * ë””ìžì¸ 패턴 * 테스트 ì£¼ë„ ê°œë°œ * ìœ ë‹› 테스트 * Mock í”„ë ˆìž„ì›Œí¬ * Android í”Œëž«í¼ * 등등… === 어떻게? === * 세미나 * ë¼ì´ë¸Œ 코딩 * 실습 * ì°¸ê³ ë„서 1. '''[Effective Java] Second Edition''' by [Josh Bloch] === 왜? === * --ìž‘ì€ ìžë°”ì˜ ìž‘ì€ ë°°ë•Œì§€ì— ì¹¼ë¹µì„ ë†”ì£¼ê¸° 위해…?-- ==== [변형진] ==== * 현업 Java 개발ìžë„ 놓치기 쉬운 ë¬¸ì œë“¤ì„ ì§šì–´ë³´ê³ , 올바른 Java í”„ë¡œê·¸ëž¨ì„ ë¹ ë¥´ê³ ê¹”ë”하게 êµ¬í˜„í•˜ëŠ”ë° í•„ìš”í•œ 중급 ìˆ˜ì¤€ì˜ ì§€ì‹ì„ ì „ë‹¬í•˜ê¸° 위해 * Java를 중ì ì 으로 다루지만, Javaì— í•œì •ë˜ì§€ ì•Šì€ íë„“ì€ ì»´í“¨í„°ê³µí•™ì ì´í•´ë¥¼ 바탕으로 ì‚¬ê³ í•˜ë„ë¡ í•˜ê¸° 위해 * ê·¸ë™ì•ˆ 설계와 êµ¬í˜„ì— ê´€í•œ ì¼ë°˜ë¡ ì„ ìœ„ì£¼ë¡œ 세미나를 진행해왔기ì—, ì´ë²ˆì—는 ì¢€ë” practicalí•˜ê³ pragmatic한 ì§€ì‹ì„ ì „ë‹¬í•˜ëŠ”ë° ë¹„ì¤‘ì„ ë‘ê³ ìž í•¨. * 나 ìŠ¤ìŠ¤ë¡œë„ ì•Œì§€ë§Œ ë¶ˆì¶©ë¶„í–ˆë˜ ì§€ì‹ì´ë‚˜ ì•„ì§ ì–´ë ´í’‹í•œ ì§€ì‹ì„ 설명하면서 함께 ê³µë¶€í•˜ê³ ë°°ìš°ê¸° 위해 ==== [김태진] ==== * í•™êµì—서 배우기 íž˜ë“ ë‹¤ì–‘í•œ ì§€ì‹(ìžë°”ë¿ë§Œ ì•„ë‹ˆê³ )ë“¤ì„ ì ‘í•´ë³´ê³ , í™œìš©í• ìˆ˜ 있기위해 * ì•„ì§ ë‚´ê°€ 구현하는게 불가능한 ê²ƒì„ ê°€ëŠ¥í•˜ê²Œ 하는 것부터, 좀 ë” '잘' 구현하는게 가능한 ì˜ì—까지 ê·¸ íì„ ë„“ížˆê¸° 위해 * 어디가서 ìžë°”로 개발 좀 ì œëŒ€ë¡œ í•´ë´¤ëƒë¼ê³ 물어볼때, 확실히 '네'ë¼ê³ ëŒ€ë‹µí• ìˆ˜ 있기 위해 * ë³‘íŠ¹ì„ ìœ„í•œ 중장기 프로ì 트(?) * "ë‚´ê°€ ì•„ë¬´ê²ƒë„ ëª¨ë¥¸ ìƒíƒœì—서 1학년 1ë…„ê°„ 배울때처럼 그때 ê·¸ 마ìŒìœ¼ë¡œ ë§Žì€ ê²ƒì„ ë°°ìš°ê¸° 위해" - ë°°ì›€ì— ì´ìœ ê°€ 있는가. ==== [서ì˜ì£¼] ==== * ìžë°”를 좀 대충 ë°°ìš´ ê°ì´ 있어서 ìžë°”ì— ëŒ€í•´ì„œ 조금 ë” í™•ì‹¤ížˆ ì•Œê³ í•™êµì—서 가르ì³ì£¼ëŠ” 것 ì™¸ì˜ ìžë°”ì— ê´€í•œ ì§€ì‹ì„ 조금 ë” ë°°ìš°ê³ ì‹¶ì–´ì„œ. * ì–¸ì–´ì— ê´€í•œ 것 ë¿ë§Œ ì•„ë‹ˆë¼ ìœ ìš©í•œ ë¼ì´ë¸ŒëŸ¬ë¦¬, ìžë°” 개발 환경 등 ê°œë°œì„ ë” ë¹ ë¥´ê³ íŽ¸ë¦¬í•˜ê²Œ í• ìˆ˜ 있는 ë°©ë²•ì„ ë°°ìš°ê¸° 위해서. * ìœ ë‹›í…ŒìŠ¤íŠ¸, mock í”„ë ˆìž„ì›Œí¬ ì‚¬ìš© ë“±ì˜ ë¶€ë¶„ì— ëŒ€í•œ ì‹¤ì œ 사용 예를 잘 알기 위해 ==== [권순ì˜] ==== * í•™êµì—서 ë°°ìš´ ìžë°”보다 ë” ì‹¬ë„있는 걸 í•˜ê³ ì‹¶ì—ˆëŠ”ë° ëŠ¥ë ¥ì´ ì•ˆ ë˜ì„œ 못했기 ë•Œë¬¸ì— * 보다 ë” ì‚¬ê³ ë¥¼ 넓히기 위해 * 공부란 ê²ƒì€ í•˜ë©´ í• ìˆ˜ë¡ í• ê²Œ 많기 때문.. ==== [서민관] ==== * 단순히 ìžë°” ì–¸ì–´ì— ëŒ€í•´ì„œê°€ ì•„ë‹ˆë¼ ë” ë‹¤ì–‘í•œ ì£¼ì œë¥¼ 다루는 스터디ì´ê¸° ë•Œë¬¸ì— í¥ë¯¸ê°€ 있어서. * í† ìš”ì¼ì— í• ìˆ˜ 있는 활ë™ë“¤ 중ì—서 시간 대 성능 비가 월등하니까 듣지 ì•Šì„ ì´ìœ ê°€ 없다. * TDD로 코드를 ì§œ ë³´ë ¤ë‹¤ 실패해서 -_-;;; 어떻게 TDD로 ì½”ë”©ì„ í•´ì•¼ 하는지, 어떻게 ë¦¬íŒ©í† ë§ì„ 해야 하는지 ë“£ê³ ì‹¶ì–´ì„œ. ==== [ê¶Œì˜ê¸°] ==== * ìžë°” ì–¸ì–´ì— ëŒ€í•´ì„œ 심ë„있게 ê³µë¶€í•´ë³´ê³ ì‹¶ì–´ì„œ. * ë‚˜ì˜ ì‹œì•¼ë¥¼ ë„“ížˆê³ ì‹¶ì–´ì„œ. * í† ìš”ì¼ì„ 알차게 보내기 위해서. --ì¢‹ì€ ì„ í–‰í•™ìŠµì´ë‹¤..-- == 규칙 == == ì§„í–‰ == === 2012ë…„ 5ì›” 5ì¼ === * 오리엔테ì´ì…˜ * 튜터가 ìƒê°í•œ ì´ ìŠ¤í„°ë””ì˜ "무엇ì„?", "어떻게?", "왜?"를 ìžì„¸ížˆ ì†Œê°œí•˜ê³ , íŠœí‹°ë“¤ì´ ì›í•˜ëŠ” "무엇ì„?", "어떻게?"ì— ëŒ€í•œ ì´ì•¼ê¸°ë¥¼ 나눴습니다. * 스터디 ì‹œê°„ì´ ì°¸ì—¬ìžë“¤ ê°ê°ì—게 ì›í•˜ì§€ 않는 시간 ë‚비가 ë˜ì§€ 않ë„ë¡, ì–¸ì œë¼ë„ ë˜ë‹¤ë¥¸ ì˜ê²¬ê³¼ ì§ˆë¬¸ì„ í™˜ì˜í•©ë‹ˆë‹¤. * "왜?"ì— ê°ìž ì„œë¸Œì„¹ì…˜ì„ ë‚˜ëˆ„ì–´ ìžì‹ ì´ ì´ ìŠ¤í„°ë””ë¥¼ 통해 ì›í•˜ëŠ” ê²ƒì„ ì ê³ , 스스로ì—게 ë™ê¸°ë¶€ì—¬ë¥¼ 해봅시다. ==== 후기 ==== === 2012ë…„ 5ì›” 12ì¼ === * SpringSource Tool Suite(Eclipse IDE)ì˜ ê¸°ë³¸ ì„¤ì •ê³¼ 프로ì 트 ì„¤ì •ì— í•„ìš”í•œ 기본ì ì¸ ì •ë³´ë¥¼ 설명했습니다. * http://springsource.org/ * http://springsource.com/ * Eclipse JDTì˜ ë¹Œë“œ ê³¼ì •ì„ ì•Œì•„ë³´ê³ Mavenì—서 ë¼ì´ë¸ŒëŸ¬ë¦¬ ì˜ì¡´ì„±ì„ 추가해보았습니다. * http://search.maven.com/ * http://mvnrepository.com/ * 오픈소스 ë¼ì´ë¸ŒëŸ¬ë¦¬ì˜ ë¼ì´ì„ 스 확ì¸ì€ 중요합니다. * í´ëž˜ìŠ¤ì™€ ê·¸ ë©¤ë²„ì— ì 용하는 기본 modifierë“¤ì˜ ê°œë… ë° ìš©ë²•ì„ ë‹¤ë¤˜ìŠµë‹ˆë‹¤. * public, protected, private, (none) * abstract, final, static ==== 후기 ==== * static modifierì— ëŒ€í•´ ì• ë§¤í•˜ê²Œ ì•Œê³ ìžˆì—ˆëŠ”ë° ìžì„¸í•˜ê²Œ 설명해주셔서 좋았습니다. staticì€ íƒ€ìž…ì„ í†µí•´ì„œ 부르는거ë¼ê±°ë‚˜ ì›ëž˜ ëª¨ë“ í•¨ìˆ˜ê°€ staticì¸ë° ê°ì²´ì§€í–¥ì˜ ë‹¤í˜•ì„±ì„ ìœ„í•´ staticì´ ì•„ë‹Œ 함수가 ìƒê¸´ê±°ë¼ëŠ” ì„¤ëª…ì€ ì‹ ê¸°í–ˆì—ˆìŠµë‹ˆë‹¤. object.method(message) -> MyType::method(object, method) ë¶€ë¶„ì´ oop ì‹¤ì œ êµ¬í˜„ì˜ ê¸°ë³¸ì´ë¼ëŠ” ë¶€ë¶„ì€ ìžŠì–´ë²„ë¦¬ì§€ ì•Šê³ ìž˜ ê¸°ì–µí•´ë‘¬ì•¼ê² ìŠµë‹ˆë‹¤. ê·¼ë° íŒŒì´ì¬ì—서 메소드 작성시 (self)ê°€ 들어가는 ê²ƒë„ ì´ê²ƒê³¼ ê´€ë ¨ì´ ìžˆëŠ”ê±´ê°€ìš”? -[서ì˜ì£¼] * Python ì€ PEPì— ì ˆëŒ€ ê¶Œí•œì„ ê°€ì§„ ê·€ë„ê°€ 그냥 ì˜ê²¬ì„ 모아서 ì •í•œê²ë‹ˆë‹¤. ì›ìˆ™í•œ 언어ì¼ìˆ˜ë¡ 스펙 ìžì²´ê°€ 'ì›ëž˜ 그런 것'ì€ ì—†ê³ , 'ì‚¬ëžŒê°„ì˜ ì•½ì†'입니다. ì´í•˜ ì°¸ê³ ìžë£Œ. --NeoCoin * http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html * http://stackoverflow.com/questions/68282/why-do-you-need-explicitly-have-the-self-argument-into-a-python-method * ì œê°€ "ì›ëž˜ ëª¨ë“ í•¨ìˆ˜ê°€ static"ì´ë¼ëŠ” ì˜ë¯¸ë¡œ ë§í•œê±´ ì•„ë‹Œë° ì˜¤í•´ì˜ ì†Œì§€ê°€ 있었나보군요. 사실 ì œê°€ 설명한 가장 중요한 ì‚¬ì‹¤ì€ ë§ì”€í•˜ì‹ 예ì—서 objectì˜ ì»´íŒŒì¼ íƒ€ìž…ì˜ method() 메서드가 ê°€ìƒ ë©”ì„œë“œë¼ë©´(staticì´ ì•„ë‹Œ ëª¨ë“ Java 메서드), ì‹¤ì œ ì–´ë–¤ method() 메서드를 ì„ íƒí• 것ì´ëƒì— 관한 ë¶€ë¶„ì„ objectì˜ ëŸ°íƒ€ìž„ íƒ€ìž…ì— ì˜í•œë‹¤ëŠ” 부분ì´ì—ˆì§€ìš”. 그러니까 object는 ì»´íŒŒì¼ íƒ€ìž…ê³¼ ë™ì¼í•˜ì§€ ì•Šì€ ëŸ°íƒ€ìž„ íƒ€ìž…ì„ ê°€ì§ˆ 수 있으며, ë‹¤í˜•ì„±ì˜ êµ¬í˜„ì„ ìœ„í•´ implicit argumentì¸ object(=this)ì˜ ëŸ°íƒ€ìž„ íƒ€ìž…ì— ë”°ë¼ overrideëœ ë©”ì„œë“œë¥¼ ì„ íƒí•œë‹¤ëŠ” ì‚¬ì‹¤ì„ ê¸°ì–µí•˜ì„¸ìš”. (Pythonì—ì„ ì‹¤ì œ 메서드 ë‚´ì—서 ì‚¬ìš©í• formal parameterì¸ self를 explicit하게 ì„ ì–¸í• ìˆ˜ ìžˆë‹¤ê³ ë³´ë©´ ë˜ê² 지요.) - [변형진] === 2012ë…„ 5ì›” 19ì¼ === * Singleton 패턴과 lazy initializationì˜ í•„ìš”ì„±ì— ëŒ€í•´ ì´ì•¼ê¸°í–ˆìŠµë‹ˆë‹¤. * ë©€í‹°ìŠ¤ë ˆë“œ 환경ì—서 synchronized modifier를 사용한 ë™ê¸°í™”ì— ëŒ€í•´ 공부했습니다. * ë™ê¸°í™” 부하를 피하기 위한 DCL íŒ¨í„´ì˜ ë¬¸ì œì ì„ ì‚´íŽ´ë³´ê³ Java 5 ì´í›„ì—서 volatile modifier로 í•´ê²°í• ìˆ˜ 있ìŒì„ ë°°ì› ìŠµë‹ˆë‹¤. * Serializable ì¸í„°íŽ˜ì´ìŠ¤ì™€ ObjectOutput, ObjectInputì„ ì‚¬ìš©í•œ ì§ë ¬í™”, ì—ì§ë ¬í™”ì— ëŒ€í•´ 공부했습니다. * transient modifier는 VMì˜ ìžë™ ì§ë ¬í™” ê³¼ì •ì—서 íŠ¹ì • ì†ì„±ì„ ì œì™¸í• ìˆ˜ ìžˆê³ , Externalizable ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 구현하면 ì§ë ¬í™”, ì—ì§ë ¬í™” ë°©ì‹ì„ ì§ì ‘ ì •ì˜í• 수 있ìŒì„ 보았습니다. * JNIë¼ëŠ” ê¸°ë²•ì„ ì‚¬ìš©í•´ 네ì´í‹°ë¸Œ ë¼ì´ë¸ŒëŸ¬ë¦¬ë¥¼ 연결하여 함수를 í˜¸ì¶œí• ìˆ˜ 있ìŒì„ ë°°ì› ìŠµë‹ˆë‹¤. * native modifier로 í•¨ìˆ˜ì˜ ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ ì„ ì–¸í• ìˆ˜ ìžˆê³ , 마샬ë§, ì–¸ë§ˆìƒ¬ë§ ê³¼ì •ì—서 성능 ì†ì‹¤ì´ ìžˆì„ ìˆ˜ 있ìŒì„ ì´ì•¼ê¸°í–ˆìŠµë‹ˆë‹¤. * 불변ê°ì²´ì˜ 필요성과 ì¡°ê±´ì— ëŒ€í•´ 알아보았습니다. * 대표ì ì¸ ë¶ˆë³€ê°ì²´ì¸ String í´ëž˜ìŠ¤ê°€ ë‚´ë¶€ì 으로 어떻게 구현ë˜ê³ , 어떻게 ë¶ˆë³€ì„±ì„ ìœ ì§€í•˜ëŠ” 지를 살펴보았습니다. * 다양한 String ê°ì²´ì˜ 활용 ê³¼ì •ì—서 ê°ì²´ë“¤ì˜ ë™ì¼ì„±ê³¼ ë™ë“±ì„±ì„ 알아보았습니다. ==== 후기 ==== * Stringê°ì²´ë¼ë‹ˆ..! ìžë°” 스트ë§ì€ íŽ¸í•˜ë©´ì„œë„ ë¶ˆíŽ¸í–ˆëŠ”ë° ë”ê°€ ê·¸ ì´ìœ 를 ë“¤ì„ ìˆ˜ ìžˆì—ˆì„ ë²•í•œ ì£¼ì œë„¤ìš”..-[김태진] * c++ì—서 ìƒí˜¸ë°°ì œ ê´€ë ¨ìœ¼ë¡œ mutex나 critical sectionê°™ì€ê±° ì—„ì² ë°°ì› ì—ˆëŠ”ë° ìžë°”ì—서는 synchronized를 ì´ìš©í•´ì„œ 쉽게 ì²˜ë¦¬í• ìˆ˜ 있다는게 ì‹ ê¸°í–ˆìŠµë‹ˆë‹¤. os 수업 들ì€ì§€ 오래 ëëŠ”ë° ë©€í‹°í”„ë¡œì„¸ìŠ¤ì™€ ë©€í‹°ìŠ¤ë ˆë“œ ìˆ˜ì—…ì„ ë‹¤ì‹œ 들으니까 ì„¤ëª…ì„ ì°¸ 잘 해주셔서 좋았습니다. 함수ì—ë§Œ ë¶™ì¼ ìˆ˜ 있는게 ì•„ë‹ˆê³ ë³´í˜¸ìžì›ì„ 가진 ê°ì²´ë¥¼ ì´ìš©í•œ synchronized(this){ ... } ê°™ì€ ë¶€ë¶„ì€ ë‚˜ì¤‘ì— ìŠ¤ë ˆë“œë¥¼ 쓸 ê²½ìš°ì— ì°¸ê³ ê°€ ë 것 같습니다. ê·¸ë¦¬ê³ ì¸í„°íŽ˜ì´ìŠ¤ì™€ ë¦¬í”Œë ‰ì…˜ì„ ì´ìš©í•œ 초기화를 보니 ìƒê°ì„ 잘 하면 구체í´ëž˜ìŠ¤ê°€ ì½”ë“œì— ì•ˆë“œëŸ¬ë‚˜ê²Œ í• ìˆ˜ 있다는 ì ë„ ë³¼ë§Œí–ˆìŠµë‹ˆë‹¤. -[서ì˜ì£¼] * ê°œì¸ì 으로 synchronized는 잘 몰ë¼ì„œ 그냥 ë¶™ì´ë©´ ì¼ë‹¨ ëœë‹¤ëŠ” ì´ë¯¸ì§€ë§Œ 막연하게 ê°€ì§€ê³ ìžˆì—ˆëŠ”ë° ê·¸ëŸ° 부분까지 세밀하게 다뤄 주셔서 ë“£ê¸°ì— ìƒë‹¹ížˆ 좋았습니다. 그래서 깊ì´ê°€ ìƒë‹¹ížˆ 깊어졌다는 ì ì€ ìž¥ì ë„ ìžˆê³ ë‹¨ì ë„ ìžˆì—ˆì§€ë§Œ ì œ 입장ì—서는 ê·¸ëž˜ë„ ì–´ëŠ ì •ë„ ë“¤ì„ ìˆ˜ ìžˆì—ˆë˜ ë§Œí¼ ë‹¤ë£° 범위를 괜찮게 ì„¤ì •í•˜ì‹œì§€ 않았나 싶습니다. - [서민관] === 2012ë…„ 5ì›” 26ì¼ === * interface * nested class * static nested class * inner class * annonymous inner class * ì‘ì§‘ë„up와 ê²°í•©ë„dw (cohesion&coupling) * SOLID [http://en.wikipedia.org/wiki/SOLID_(object-oriented_design) SOLID Wiki] * '''S'''RP (Single responsibility principle) * '''O'''CP (Open/closed principle) * '''L'''SP (Liskov substitution principle) * '''I'''SP (Interface segregation principle) * '''D'''IP (Dependency inversion principle) * DRY [http://en.wikipedia.org/wiki/Don't_repeat_yourself DRY Wiki] * [http://en.wikipedia.org/wiki/Don%27t_repeat_yourself dont repeat yourself] ì´ê±¸ ê±¸ë ¤ê³ í–ˆë‚˜? - [서지혜] * ì´ìƒí•˜ë„¤ìš”; 그냥 주소 복사해서 ì£¼ì†Œì°½ì— ë„£ìœ¼ë©´ 잘 ëœ¨ëŠ”ë° -_-a - [권순ì˜] * urlì¤‘ì— 'ê°€ 들어있어서 그런듯... - [서지혜] ==== 후기 ==== * ë”± 6시간 ì§€ë‚˜ê³ ìƒê°í•´ë³´ë‹ˆ 오늘 ë ë°°ì› ë”ë¼.. 하는 ëŠë‚Œì´ 왔네요--; ì¤‘ê°„ì— ìž ê¹ ì¡¸ì•„ì„œì¸ì§€ ì €ë²ˆì‹œê°„ì— ë°˜ë°–ì— ëª»ë“¤ì–´ì„œì˜€ì„ì§€.. ì €ìž‘ê¶Œ ì´ì•¼ê¸°ëŠ” 좀 ìƒê°ë‚˜ì§€ë§Œ 나머지는 ë”ê°€ í‰ì†Œë³´ë‹¤ ë” ì—¬ê¸°ê°”ë‹¤ ì €ê¸°ê°”ë‹¤ 하는 ë°”ëžŒì— ë¨¸ë¦¬ê°€ í˜¼ëž€ìŠ¤ëŸ¬ì› ë‚˜ë´ìš”;; -[김태진] * ì „ì²´ì 으로 다른 언어ì—서는 ë³¼ 수 없는 ìžë°”ì˜ ë¬¸ë²• + ê°ì²´ì§€í–¥ ì›ì¹™ì„ 중ì ì 으로 다룬 시간ì´ì—ˆìŠµë‹ˆë‹¤. 중간중간 다른 ì´ì•¼ê¸°ë“¤(builder 패턴, ì €ìž‘ê¶Œ)ì´ ë“¤ì–´ê°”ì§€ë§Œ ê·¸ëž˜ë„ ë‹¤ë£¬ ì£¼ì œëŠ” ëª…í™•í•˜ë‹¤ê³ ìƒê°í•©ë‹ˆë‹¤. 다만 그걸 어떻게 ì“°ëŠëƒëŠ” í릿한 ëŠë‚Œìž…니다. 그건 ì•„ë§ˆë„ ê° ì›ì¹™ë“¤ì´ë‚˜ interface, ê°ì²´ ë“±ì— ëŒ€í•œ ëŠë‚Œì„ 잡기 위해서는 ê²½í—˜ì´ ì¢€ 필요하기 ë•Œë¬¸ì´ ì•„ë‹Œê°€ 싶습니다 ;;; 수경ì´ê°€ ë§í•œ 대로 한 번ì´ë¼ë„ í•´ 본 ì‚¬ëžŒì€ ì•Œê¸° 쉽다는 ë§ì´ ë§žì§€ 않ì„까 싶네요. ê·¸ë¦¬ê³ ì „ì²´ì 으로 ì´ì•¼ê¸°ë¥¼ 들으면서 현재 프로ì 트 ì¤‘ì¸ ì½”ë“œê°€ ìžê¾¸ ìƒê°ë‚˜ì„œ ì˜ ëŠë‚Œì´ ì°ì°í–ˆìŠµë‹ˆë‹¤. 세미나를 들으면서 코드를 ìƒê°í•˜ë‹ˆê¹Œ ê³ ì³ì•¼ ë ë¶€ë¶„ì´ ê³„ì† ë³´ì´ëŠ”êµ°ìš”. ê·¸ëž˜ë„ ë‚˜ë¦„ëŒ€ë¡œ 코드를 ê¹”ë”하게 í•´ ë³´ë ¤ê³ í´ëž˜ìФ êµ¬ì¡°ë„ ì •ë¦¬ë¥¼ 좀 í•˜ê³ í–ˆëŠ”ë° ë” í•´ì•¼ í• ê²Œ ë§Žì€ ëŠë‚Œìž…니다. ã… ã… ê·¸ 외ì—ë„ ì´ë²ˆ ì‹œê°„ì— ë“¤ì—ˆë˜ ë©”ì†Œë“œì˜ ì±…ìž„ì´ ì–´ë””ì— ë‚˜íƒ€ë‚˜ì•¼ 하는가(ê°ì²´ or 메소드) ë¼ê±°ë‚˜ ìƒì†ì„ 너무 ê²ë‚´ì§€ ë§ë¼ëŠ” ì´ì•¼ê¸°ëŠ” ìƒë‹¹ížˆ ëšœë ·í•˜ê²Œ 와 닿아서 좋았습니다. ì•„. DIPì—서 Logicê³¼ native API 사ì´ì— ì¶”ìƒí™” ë ˆì´ì–´ë¥¼ ë‘는 ê²ƒë„ ìƒë‹¹ížˆ ì¢‹ì•˜ëŠ”ë° ê¸°íšŒê°€ ë˜ë©´ ê¼ ì½”ë“œë¡œ ë³´ê³ ì‹¶ìŠµë‹ˆë‹¤. 아마 다ìŒì— 보게 ë˜ê² 지만. - [서민관] === 2012ë…„ 6ì›” 2ì¼ === * Serialize * Abstraction layer * Inner Class, Nested Class(ë³´ê°•), Local Class, Static Inner Class * Iterator (java.util) * 우리가 아는 interface 사용 * generics 사용 * Collection ì¼ë°˜í™”, 순차ì 순회, ëŒ€ë¶€ë¶„ì˜ ìžë£Œêµ¬ì¡°ì—서 O(1), 변경하지 않는 한 thread safe * but ì¤‘ê°„ì— ë³€í™”ì— ìžˆì–´ì„ ê·¸ë‹¥ * Iterable (java.lang) * Iteratorì˜ íŠ¹ì§•ê³¼ Iterableì„ ì‚¬ìš©í–ˆì„ ë•Œì˜ íŠ¹ì§•ë“¤ì„ ê³µë¶€í•˜ëŠ” 시간 * Comparable * for Sorting.. stable, unstable ==== 후기 ==== * ì§€ë‚œì‹œê°„ì— ì´ì€ Inner Class와 Nested Classì˜ ê°ê° 특징들 Encapsulationì´ë¼ë˜ê°€ 확장성, 임시성, í´ëž˜ìФ íŒŒì¼ ìƒì„±ì˜ 귀찮ìŒì„ ì œê±°í•œê²ƒì´ ìƒˆë¡œì› ìŠµë‹ˆë‹¤. 사실 쓸ì¼ì´ 없어 안쓰긴 하지만 Event핸들러ë¼ë˜ê°€ 넘길때 ìžì£¼ ì‚¬ìš©í•˜ê±°ë“ ìš”. {{{ Inner Classì—ì„œì˜ this는 Inner Class를 뜻합니다. ê·¸ë ‡ê¸° ë•Œë¬¸ì— Inner Class를 í¬í•¨í•˜ëŠ” Classì˜ this(현재 ê°ì²´ë¥¼ 뜻함)ì„ ë¶ˆëŸ¬ì˜¤ë ¤ë©´ ìƒìœ„í´ëž˜ìФ.this를 ë¶™ì´ë©´ ë©ë‹ˆë‹¤. }}} Iterator는 Utilì´ì§€ë§Œ Iterableì€ java.lang 패키지(íŠ¹ì • 패키지를 추가하지 ì•Šê³ ìžë°”ì˜ ê¸°ë³¸ì ì¸ type처럼 쓸수있는 패키지 êµ¬ì„±ì´ java.lang입니다)ì— í¬í•¨ë˜ì–´ ìžˆëŠ”ë° interface를 통한 확장과 재구성으로 ì¸ë±ìФ(index)를 통한 순차ì ì¸ ìžë£Œ ì ‘ê·¼ 과는 다른 Iterator를 Javaì—서 범용으로 쓰게 만들게 ëœê²ƒìž…니다. ì˜ˆì œë¡œ DBì—서 List를 í•œêº¼ë²ˆì— ë„˜ê²¨ 받아 ë¡œë”©í•˜ëŠ”ê²ƒì€ 100ë§Œê°œì˜ ì•„ì´í…œì´ 있다면 ì—„ì²ë‚œ 과부하를 겪게ë˜ê³ Loadingë˜í•œ ëŠë¦½ë‹ˆë‹¤. 하지만 지금 ê°™ì€ ì„¸ëŒ€ì—는 실시간으로 보여주면서 Loadingë˜í•œ ê°™ì´ í•˜ê²Œ ë˜ì£ . Iterator는 통해서는 ì´ëŸ° 실시간 Loadingì„ ì¢€ë” íŽ¸í•˜ê²Œ 해줄 수 있게 í•´ì¤ë‹ˆë‹¤. ë¼ì´ë¸ŒëŸ¬ë¦¬ ì—†ì´ êµ¬í˜„í•˜ê²Œ ë˜ë©´ ìƒë‹¹ížˆ 빡셀 것 ê°™ì€ ê°œë…ì„ iterator를 í•˜ë‚˜ì˜ itrableì´ëž€ ì¸í„°íŽ˜ì´ìŠ¤ë¡œ Javaì—서는 기본 패키지로 Iterableì„ í†µí•´ Custom하게 구현하는 ê²ƒì„ ë„와주니 얼마나 ê³ ë§ˆìš´ê°€ìš” :) 여튼 ìžë°”는 대단합니다=ã…‚= Genericê³¼ Sortingì€ ë‹¤ë¥¸ ë¶„ì´ ì„¤ëª…ì¢€. - [김준ì„] === 2012ë…„ 7ì›” 20ì¼ === * Java Generics * run-timeì˜ type erasure * í”„ë¡œê·¸ëž˜ë¨¸ì˜ íƒ€ìž… 보장 * Reflection API * parameter 얻어오는 방법 세 가지. * public field * getter, setterê°€ 존재하는 field * @property annotation 사용 * Generics와 Reflectionì„ ì´ìš©í•œ ObjectMapper 만들기 * Map <-> Object 변환 ==== 후기 ==== * ë¦¬í”Œë ‰ì…˜ê³¼ ì œë„¤ë¦ìŠ¤ë¥¼ ì¨ì„œ map -> object와 object -> mapì„ í•˜ëŠ” ë¶€ë¶„ì„ í•´ë´¤ìŠµë‹ˆë‹¤. ìžë°”ì˜ ì¼ë°˜ì ì¸ ì„¸ 가지 ë°©ì‹ì˜ í´ëž˜ìФ ë‚´ ë³€ìˆ˜ì— ëŒ€í•´ getClass, getFields, getMethods를 사용해 private, 나 ì ‘ê·¼ìžê°€ 있는 ê²½ìš°ì˜ ê°’ì„ ë°›ì•„ì™”ìŠµë‹ˆë‹¤. getter를 사용해서 변수 ê°’ì„ ë°›ì•„ì˜¬ 때 ì´ë¦„ì´ get으로 시작하는 다른 함수를 ì œì™¸í•˜ê¸° 위해 method.getParameterTypes().length == 0 ê°™ì€ ë¶€ë¶„ì€ ì´ë ‡ê²Œ ì²´í¬í•´ì•¼ ëœë‹¤ëŠ” ë¶€ë¶„ì€ ë‚˜ì¤‘ì— ì œë„¤ë¦ìФ ê´€ë ¨ìœ¼ë¡œ ì¨ë¨¹ì„ë§Œ í• ê²ƒ 같습니다. ê·¸ë¦¬ê³ mapToObjectì—서는 ë¬¸ì œê°€ 없었지만 objectToMapì˜ ê²½ìš°ì—는 ì œë„¤ë¦ìŠ¤ì˜ type eraseë•Œë¬¸ì— Class<T> expectedType = T.class; ê°™ì€ ì½”ë“œë¥¼ ì‚¬ìš©í• ìˆ˜ 없어서 map.put(field.getName(), (T)field.get(obj));ì—서 í˜•ë³€í™˜ì˜ íƒ€ìž… ì•ˆì „ì„±ì„ ìœ„í•´ ì¸ìžë¡œ Class<T> valueTypeì„ ë°›ì•„ì˜¤ê³ valueType.isAssignableFrom(field.getType())로 ì²´í¬ë¥¼ 하는 ë¶€ë¶„ë„ ê³µë¶€ê°€ ë§Žì´ ë습니다. - [서ì˜ì£¼] === 2012ë…„ 7ì›” 27ì¼ === * Annotation * Annotationì˜ ìƒì„± ë° ì‚¬ìš© * 다른 Annotationì„ ë¶™ì´ëŠ”ê±¸ë¡œ 확장 가능. * @Target : ë§Œë“¤ê³ ìž í•˜ëŠ” Annotationì˜ ëŒ€ìƒ ì§€ì •. (ElementType.TYPE, ElementType.METHOD)등 * @Retention Annotationì—서 나오는 ì •ë³´ê°€ ì–¸ì œ í•„ìš”í•œê°€ì˜ ì—¬ë¶€. (RetentionPolicy.RUNTIME) 등 * 외부 ë¼ì´ë¸ŒëŸ¬ë¦¬ 사용 * java.beans * Introspector : í´ëž˜ìŠ¤ë¥¼ BeanInfo로 만들 수 있ìŒ. * BeanInfo, PropertyDescriptor를 ì´ìš©í•´ getter, setterì— ì ‘ê·¼ 가능 * apache.commons.lang * utilí•¨ìˆ˜ë“¤ì„ ë§Žì´ ì œê³µí•¨. 한 ë²ˆì— ê²°ê³¼ê°€ 나옴. * googleì˜ guava는 í•¨ìˆ˜ì˜ ì²´ì´ë‹ì„ ë§Žì´ ì‚¬ìš©í•¨. * í•¨ìˆ˜ì˜ ì²´ì´ë‹ì„ 위해서는 genericsê°€ 필요함. static method로는 ì²´ì´ë‹ì„ í• ìˆ˜ ì—†ìŒ. ==== 후기 ==== * 웹 수업ì—서 prototype 설명 ë•Œë„ ê·¸ëž¬ì§€ë§Œ ë¨¼ì € ê°œë…ì ì¸ ë¶€ë¶„ì— ëŒ€í•´ì„œ 기본ì ì¸ êµ¬í˜„ì´ ì–´ë–»ê²Œ ë˜ì–´ìžˆëŠ”ì§€ë¥¼ ë¨¼ì € ë°°ìš°ê³ ì´ëŸ¬í•œ ê¸°ëŠ¥ë“¤ì„ ì‹¤ì œë¡œ ë” íŽ¸í•˜ê²Œ 쓸 수 있는 ë¼ì´ë¸ŒëŸ¬ë¦¬ëŠ” ì–´ë–¤ ê²ƒë“¤ì´ ìžˆëŠ”ì§€ 배우니까 그냥 ë¼ì´ë¸ŒëŸ¬ë¦¬ë§Œ 아는 것보다 조금 ë” ì•Œê¸° 쉬운 것 같습니다. ìœ ìš©í•œ ë¼ì´ë¸ŒëŸ¬ë¦¬ë“¤ì´ 어떤게 있는지 ë” ë§Žì´ ê°€ë¥´ì³ì£¼ì…¨ìœ¼ë©´ ì¢‹ê² ìŠµë‹ˆë‹¤. Annotationì€ ë§¤ë²ˆ 쓰기만 í–ˆì—ˆëŠ”ë° ì´ë ‡ê²Œ 한 번 만들어보니까 ìƒê°ë³´ë‹¤ ì–´ë µì§€ëŠ” ì•Šì€ ê²ƒ 같습니다. - [서ì˜ì£¼] === 2012ë…„ 8ì›” 3ì¼ === * ObjectMapper (cont.) * Class mapping by annotation * Annotation on concrete class * Annotation on superclass * Initilize ObjectMapper at runtime * Scan annotated classes in package * Pros and cons to use annotations * Concurrency * java.util.concurrent(.atomic) * LRU cache using LinkedHashMap === 2012ë…„ 8ì›” 17ì¼ === * ObjectMapper (cont.) * Data ë¶€ë¶„ì„ ì¸í„°íŽ˜ì´ìŠ¤ë¡œ 분리 - ë‚´ë¶€ì—서 FactoryMethod íŒ¨í„´ì„ ì‚¬ìš©. factory를 통해서 ê°ì²´ë¥¼ ìƒì„±í•œë‹¤. new를 사용하지 않기 ë•Œë¬¸ì— êµ¬ì²´ í´ëž˜ìŠ¤ë¥¼ 숨길 수 있다. * CsvData - dataì˜ êµ¬ì²´ í´ëž˜ìФ. ë‚´ë¶€ì—서 ì†ë„ì˜ í–¥ìƒì„ 위해서 ì—ìƒ‰ì¸ ë°©ì‹ì„ 사용. * Maven - ì˜ì¡´ì„±(dependency)ì„ ê´€ë¦¬í•´ 주는 툴. pom.xmlì— í”„ë¡œì íŠ¸ì˜ ì˜ì¡´ì„± ê´€ë ¨ ì •ë³´ë¥¼ ì 으면 ì €ìž¥ì†Œ(repository)ì—서 ê´€ë ¨ ë¼ì´ë¸ŒëŸ¬ë¦¬ 파ì¼ë“¤ì„ 받아서 ë¹Œë“œì— í¬í•¨ì‹œì¼œ 준다. * m2e plugin - mavenê³¼ eclipse는 빌드를 다른 ë°©ì‹ìœ¼ë¡œ 하기 ë•Œë¬¸ì— mavenì˜ ì˜ì¡´ì„±ì„ eclipseì˜ ì˜ì¡´ì„±ê³¼ 연결해주기 위해서 사용하는 plugin. * ë¼ì´ë¸ŒëŸ¬ë¦¬ 파ì¼(jar) 만들기(Run as -> Maven Install) - ObjectMapper를 ë¼ì´ë¸ŒëŸ¬ë¦¬ì™€ í´ë¼ì´ì–¸íЏ 프로ì 트로 분리. * Windows7 기준으로 [사용ìžì´ë¦„]\.m2\[groupid]\[artifactid] í´ë”ì— jar 파ì¼ì„ 만들어 준다. * í´ë¼ì´ì–¸íЏ 프로ì 트ì—서 ì‚¬ìš©í•˜ê³ ìž í•˜ëŠ” ë¼ì´ë¸ŒëŸ¬ë¦¬ì˜ ì •ë³´ë¥¼ pom.xmlì— ì¶”ê°€ 후 maven build를 실행. * Maven Build ê³¼ì • * resources - src/main/resources ì„¤ì •íŒŒì¼ ë“±ì„ target/classes로 ì „ë‹¬. javac를 사용하지 않는다. * mvn compile - src/main/javaì— ìžˆëŠ” 소스파ì¼ì„ 컴파ì¼í•´ì„œ .class를 만들어 target/classes로 보낸다. * test-resourecs - src/test/resourcesì˜ ì„¤ì •íŒŒì¼ ë“±ì„ target/test-classes로 ì „ë‹¬. * mvn test - 컴파ì¼ì„ í•˜ê³ ë‚˜ì„œ src/test/java를 컴파ì¼í•´ì„œ target/test-classes로. @Test 실행 <scope>ê°€ ì–¸ì œ 사용ë˜ëŠ”ì§€ ê²°ì • * mvn package - 패키징. pom.xmlì˜ <packaging>ì— ë”°ë¥¸ íŒŒì¼ ìƒì„±. ê¸°ë³¸ì€ jaríŒŒì¼ ìƒì„±. * mvn install - íŒ¨í‚¤ì§•ëœ íŒŒì¼, pomì„ .m2/repositoryì— ì§‘ì–´ë„£ëŠ”ë‹¤. * mvn deploy - 리모트 리í¬ì§€í„°ë¦¬ì— ë¼ì´ë¸ŒëŸ¬ë¦¬ 파ì¼ì„ ë°°í¬. * mvn release * resolve dependencies from workspace projects * ë¼ì´ë¸ŒëŸ¬ë¦¬ ì½”ë“œì— ë³€ê²½ì´ ìžˆì„ ì‹œ maven installì„ ë‹¤ì‹œ 하지 않으면 í´ë¼ì´ì–¸íЏ 프로ì 트ì—서 ë¬¸ì œê°€ ìƒê¸¸ 수 있다. * ì²´í¬ê°€ ë˜ì–´ìžˆì„ 경우 maven ì˜ì¡´ì„±ê³¼ 별개로 워í¬ìŠ¤íŽ˜ì´ìФ ì•ˆì— ìžˆëŠ” 프로ì 트를 ì°¸ì¡°í• ìˆ˜ 있게 해준다. * maven ì˜ì¡´ì„±ê³¼ ì´í´ë¦½ìФ ì˜ì¡´ì„±ê°„ì˜ ì°¨ì´ê°€ ë°œìƒí• 수 있다. === 2012ë…„ 9ì›” 22ì¼ === * Properties * mapê³¼ 비슷한 구조. * ê°’ì„ ê°€ì ¸ì˜¤ëŠ” 함수를 getProperty와 getì˜ ë‘ ê°€ì§€ë¥¼ ì œê³µí•œë‹¤. * getProperty는 Stringì„ ë°˜í™˜, getì€ Object를 반환 - ì œë„¤ë¦ì´ ì—†ì—ˆì„ ë•Œì—는 Object를 받아올 ìˆ˜ë°–ì— ì—†ì—ˆëŠ”ë° ì¼ë°˜ì 으로 받아서 쓰는 ê°’ì´ Stringì´ì—ˆê¸° ë•Œë¬¸ì— ì‚¬ìš©ìžì˜ í˜•ë³€í™˜ì„ í”¼í•˜ê¸° 위해 getProperty를 따로 ì œê³µí–ˆìŒ. * Reader와 InputStreamì˜ ì°¨ì´ * ì¸ì½”딩 ë¬¸ì œì˜ ì°¨ì´. ì¸ì½”딩 ë¬¸ì œë¥¼ 해결하기 위해서 Reader, Writer를 만들었다. Reader는 ì¸ì½”딩 ì •ë³´ë¥¼ ë“¤ê³ ìžˆì–´ì•¼ 한다. * JDBC - ê° ë°ì´í„°ë“¤ì— 대한 ì ‘ê·¼ 표준 ì¸í„°íŽ˜ì´ìФ * java.sql.driver ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ com.mysql.jdbc.driver í´ëž˜ìŠ¤ë¡œ 구현, java.sql.connection ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ com.mysql.jdbc.connection í´ëž˜ìŠ¤ë¡œ 구현 * driverì—서 connectionì„ ì–»ì–´ì˜¤ëŠ” ë¶€ë¶„ì— ëŒ€í•´ì„œëŠ” abstract factoryê°€ ì‚¬ìš©ë¨ - ì¶”ìƒíƒ€ìž…으로부터 ì¶”ìƒíƒ€ìž…ì„ ë§Œë“ ë‹¤. {{{ java.sql.Driver driver = new com.mysql.jdbc.Driver(); java.sql.Connection conn = driver.connect("", null); // 구현체 중 com.mysql.jdbc.connectionì„ ë°˜í™˜. //ì¶”ìƒíƒ€ìž… ê°ì²´ì¸ driver로부터 ì¶”ìƒíƒ€ìž… ê°ì²´ì¸ conn ìƒì„± }}} * abstract factory를 잘 쓰기 위해서는 ì¸í„°íŽ˜ì´ìŠ¤ì— apiê°€ 잘 설계ë˜ì–´ 있어야 한다. * Statement, ResultSetì— ëŒ€í•´ì„œë„ ë§ˆì°¬ê°€ì§€ë¡œ ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ ì´ìš©í•œ abstract factoryê°€ 사용ë¨. * driverì˜ ì„¤ì •ì—서 new com.mysql.jdbc.Driver(); ëŒ€ì‹ ë³¼ 수 있는 Class.forName("com.mysql.jdbc.Driver"); ì´ëŸ¬í•œ 코드는 ì»´íŒŒì¼ íƒ€ìž„ 종ì†ì„±ì„ 런타임 종ì†ì„±ìœ¼ë¡œ 바꾼 것ì´ë‹¤. {{{ Driver driver = new com.mysql.jdbc.Driver(); // 처럼 ì§ì ‘ 구체í´ëž˜ìŠ¤ë¡œ new를 하는 ëŒ€ì‹ Class<Driver> clazz = (Class<Driver>) Class.forName("com.mysql.jdbc.Driver"); Driver driver = clazz.newInstance(); // ê°™ì€ ë°©ë²•ìœ¼ë¡œ 런타임 종ì†ì„±ìœ¼ë¡œ 바꿀 수 있ìŒ. }}} * 예외ìƒí™©ì„ 런타임으로 밀어낸 것ì´ê¸° ë•Œë¬¸ì— ì—ëŸ¬ì— ëŒ€í•´ì„œëŠ” ë” ìœ„í—˜í•´ì§ˆ ìˆ˜ë„ ìžˆë‹¤. * factory method 패턴 사용 - factory를 숨겨주는 메소드. ë˜ ë§Œë“¤ì§€ë¥¼ ì¸ìžë§Œ ê°€ì§€ê³ ê²°ì •í•˜ëŠ” 함수. 위ì—서는 ì¸ìžë¡œ 주는 문ìžì—´ì— ë”°ë¼("com.mysql.jdbc.Driver") ë¬´ì—‡ì„ ë§Œë“¤ì–´ì¤„ì§€ê°€ ê²°ì •ëœë‹¤. * DriverManager í´ëž˜ìŠ¤ë¥¼ 사용하면 ì§ì ‘ driver를 ê°€ì ¸ì™€ì„œ connectionì„ ì–»ì–´ì˜¤ì§€ ì•Šì•„ë„ ë°”ë¡œ connectionì„ ì–»ì–´ì˜¬ 수 있다. ì´ë ‡ê²Œ ì¶”ìƒí™”를 해준 ê²ƒì´ DataSource í´ëž˜ìФ. * sqlite * ê¸°ì¡´ì˜ dbms와 다르게 dbmsê°€ ê° ì–´í”Œë¦¬ì¼€ì´ì…˜ ë‚´ë¶€ì— ë“¤ì–´ê°€ì„œ ë™ìž‘하는 것. * ë¶„ì‚°í™˜ê²½ì˜ ê²½ìš° os단ì—서 ìƒí˜¸ë°°ì œë¥¼ 해주지 못하기 ë•Œë¬¸ì— ë™ì‹œì„± ì œì–´ì— ë¬¸ì œê°€ ìžˆì„ ìˆ˜ 있다. ë”°ë¼ì„œ 분산환경ì—ì„œì˜ ì‚¬ìš©ì€ ì¢‹ì§€ 못하다. === 2012ë…„ 10ì›” 6ì¼ === * DataSource와 DriverManagerì˜ ì°¨ì´ * DataSourceê°€ DriverManager보다 ë§Žì€ ì„¤ì •ì„ í•´ì¤„ 수 있ìŒ(ë§Žì€ set함수 ì œê³µ) * DataSourceê°€ ë” í™•ìž¥ 가능한 형태 * DriverManagerì˜ êµ¬í˜„ì€ í•˜ë‚˜ì— ì •í•´ì§„ 것들만 ì„¤ì •í•´ì¤„ 수 있ìŒ. * Persistence Layer * persistance layer는 외부 ë ˆì´ì–´ë¥¼ ë§Žì´ ì“°ê¸° ë•Œë¬¸ì— ì˜ˆì™¸ê°€ ë§Žì´ ìƒê¹€. * ì´ëŸ¬í•œ 예외가 비즈니스 로ì§ê¹Œì§€ 올ë¼ê°€ê²Œ 하면 안ë¨. * 예외가 올ë¼ê°€ê²Œ ë 경우는 ì˜ˆì™¸ë¥¼ì„ í•œ 단계 ì¶”ìƒí™”해서 ì˜¬ë ¤ì£¼ëŠ” ê²ƒì´ ì¢‹ë‹¤. * DataBase ì •ê·œí™”(Normalize) * ë°ì´í„°ë¥¼ í…Œì´ë¸”로 ì €ìž¥í• ë•Œ ì¤‘ë³µëœ ê°’ì´ ìžˆëŠ” 경우ì—는 í…Œì´ë¸”ì´ ë‚˜ëˆ ì ¸ìžˆëŠ” 경우와 비êµí•´ì„œ 다른 í…Œì´ë¸”ì„ ì°¾ì§€ ì•Šì•„ë„ ë˜ê¸° ë•Œë¬¸ì— ê²€ìƒ‰ ë¹„ìš©ì´ ì 다. * 하지만 ì¤‘ë³µëœ ê°’ì´ ìžˆëŠ” 경우ì—는 ì—…ë°ì´íŠ¸ì‹œ ê°’ì´ ìžˆëŠ” ë¶€ë¶„ì„ ì „ë¶€ 찾아서 ìˆ˜ì •í•´ì•¼ 하므로 ì—…ë°ì´íЏ ë¹„ìš©ì´ ë¹„ì‹¸ë‹¤. * 반대로 ë°ì´í„°ì˜ ì¤‘ë³µì„ ì—†ì• ê³ í…Œì´ë¸”ì„ ë‚˜ëˆ´ì„ ê²½ìš°ëŠ” ì—…ë°ì´íЏ ë¹„ìš©ì´ ì¤„ì–´ë“¤ê³ ê²€ìƒ‰ì˜ ë¹„ìš©ì´ ëŠ˜ì–´ë‚œë‹¤. * ì—…ë°ì´íŠ¸ì™€ ê²€ìƒ‰ì€ íŠ¸ë ˆì´ë“œ 오프. * ì •ê·œí™”ë¥¼ í• ê²½ìš° í…Œì´ë¸”ê°„ì˜ ì¤‘ë³µëœ ê°’ì„ ì—†ì•¤ë‹¤. * Builder 패턴 * 빌ë”ë¼ëŠ” 가변ê°ì²´ë¥¼ 만들어서 ìƒíƒœë¥¼ ê³„ì† ë³€ê²½ì‹œí‚¤ê³ ë§ˆì§€ë§‰ì— ë§Œë“ ë‹¤. 그래서 ì¤‘ê°„ì— ì²´ì¸ì„ 하나씩 ëŠì–´ë„ ëœë‹¤. 가변체ì´ë‹ ë°©ì‹. * {{{ Resource resource = new JdbcResource.Builder() .setUrl("jdbc:mysql://zeropage.org:3306/test") .setUser("test") .setPassword("test") .setTable("people") .create(); }}} * 위와 ê°™ì€ ì²´ì¸ì‹ì˜ 문법으로 ì„¤ì •ì„ ì¶”ê°€í•´ê°€ë©° ë§ˆì§€ë§‰ì— ê°ì²´ë¥¼ ìƒì„±í•˜ëŠ” ë°©ì‹ì„ 사용한다. * ì„¤ì •ì„ ë”°ë¡œ 빼내기 ì¢‹ê³ , setì„ private함수로 바꿔서 불변ê°ì²´ë¥¼ 만들 ìˆ˜ë„ ìžˆë‹¤. ì´ë ‡ê²Œ í• ê²½ìš° ìŠ¤ë ˆë“œ 환경ì—ë„ ì¡°ê¸ˆ ë” ì•ˆì „í•´ì§„ë‹¤. * ì²´ì¸ë¬¸ë²•ì˜ ìž¥ì - ì²´ì¸ì„ 쓸지 ë§ì§€ë¥¼ ì„ íƒí• 수 있다. === 2012ë…„ 10ì›” 20ì¼ === * uri와 urlì˜ ë¹„êµ * uniform resource identifier와 locatordì˜ ì•½ìž. uriê°€ url보다 ë” í° ê°œë…ì´ë‹¤. * mapì—서 ìžë£Œë¥¼ ê°€ì ¸ì™€ì„œ equals로 비êµë¥¼ í• ë•Œ urlì€ ì‹¤ì œë¡œ ê°€ì ¸ì˜¨ ë‚´ìš©ì´ ê°™ì€ì§€ 비êµí•˜ê³ uri는 ì‹ë³„ìžê°€ ê°™ì€ì§€ë§Œ 비êµí•œë‹¤. * urlì˜ equals는 비êµë¥¼ í•˜ë ¤ë©´ ìžë£Œë¥¼ ê°€ì ¸ì™€ì•¼ 하기 ë•Œë¬¸ì— ì„±ëŠ¥ì˜ ë‚비가 심하다. ë”°ë¼ì„œ ì‹¤ì œë¡œ ìžë£Œê°€ ê°™ì€ì§€ 비êµí•´ì•¼ í• ë•Œì—ë§Œ urlì„ ì‚¬ìš©í•˜ëŠ” ê²ƒì´ ì¢‹ë‹¤. * urlê³¼ uri는 서로 toURI, toURLì„ ì§€ì›í•œë‹¤. * uriì˜ ê¸°ì¤€ì´ urlì˜ ê¸°ì¤€ë³´ë‹¤ ë” ì—„ê²©í•˜ë‹¤. * abstract factory패턴과 factory method íŒ¨í„´ì˜ êµ¬ë¶„ * ìƒì„± 메소드를 호출하는 ì¸ìŠ¤í„´ìŠ¤ì˜ íƒ€ìž…, ë©”ì†Œë“œì— ë“¤ì–´ê°€ëŠ” ì¸ìžì˜ ë‘ ê°€ì§€ê°€ 새로 ìƒì„±ë˜ëŠ” ì¸ìŠ¤í„´ìŠ¤ì— ì˜í–¥ì„ 주는 경우 abstract factory * ìƒì„± ë©”ì†Œë“œì˜ ì¸ìžë§Œìœ¼ë¡œ ìƒì„±ë˜ëŠ” ì¸ìŠ¤í„´ìŠ¤ì˜ íƒ€ìž…ì´ ê²°ì •ë 경우 factory method * abstract factory는 확장 ìœ„ì£¼ì˜ íŒ¨í„´ì´ë‹¤. ìžë°” í”„ë ˆìž„ 워í¬ì—서는 apiì˜ í™•ìž¥ì´ ì¤‘ìš”í•˜ê¸° ë•Œë¬¸ì— ìžì£¼ ë³´ì´ì§€ë§Œ ì¼ë°˜ì ì¸ ì–´í”Œë¦¬ì¼€ì´ì…˜ì—서는 í™•ìž¥ì„±ì„ ì œê³µí• í•„ìš”ì„±ì´ ì 기 ë•Œë¬¸ì— ë§Žì´ ë‚˜íƒ€ë‚˜ì§€ 않는다. * PushbackInputStream í´ëž˜ìФ * lookahead inputstream. ê¸°ì¡´ì˜ input streamì€ í•œ 번 read하면 ë나지만 lookahead 버í¼ë¥¼ ê°€ì§€ê³ ìžˆì–´ì„œ 한 번 read한 í›„ì— ë‹¤ì‹œ read하기 ì „ì˜ ìƒíƒœë¡œ ëŒì•„ê°ˆ 수 있다. * ìžë°”ì—서는 inputstreamì— ëŒ€í•œ ì§€ì›ì´ 많기 ë•Œë¬¸ì— ë°˜í™˜ 결과를 inputstream으로 만들 수 있으면 처리가 쉬워진다. * strategy 패턴, command 패턴, template method 패턴 * í–‰ë™ì„ 확장하기 위한 패턴ì´ë‹¤. * strategy 패턴 - command 패턴 * strategy íŒ¨í„´ì€ ì „ì²´ì ì¸ í‹€(logic)ì´ ì§œì—¬ì ¸ ìžˆê³ ê·¸ ì•ˆì— íŠ¹ì • í–‰ë™ì„ 확장하기 위해 ì „ëžµ ê°ì²´ë¥¼ 사용한다. ë°˜ë©´ì— command íŒ¨í„´ì€ ë”°ë¡œ í‹€ì´ ì—†ê³ ë³´ë‹¤ 범용ì 으로 사용ëœë‹¤. * strategy 패턴 - template method 패턴 * strategy íŒ¨í„´ì€ ì¸í„°íŽ˜ì´ìŠ¤ë¡œ 만들어 ë‘” ì „ëžµ ê°ì²´ í´ëž˜ìŠ¤ë¥¼ 구현(implementation)하는 ë°©ì‹ìœ¼ë¡œ í–‰ë™ì„ 확장한다. ë°˜ë©´ì— template method íŒ¨í„´ì€ ë¶€ëª¨ í´ëž˜ìФì—서 ì „ì²´ì ì¸ í‹€ì„ ë§Œë“¤ì–´ ë‘ê³ í–‰ë™ì— 해당하는 메소드를 ìƒì† + 오버ë¼ì´ë“œ 해서 확장한다. === 2012ë…„ 11ì›” 3ì¼ === * ~let : ì™¸ë¶€ì˜ ì»¨í…Œì´ë„ˆì—서 ë¼ì´í”„사ì´í´ì„ 관리해주는 프로그램. 안드로ì´ë“œì˜ activityê°™ì€ ê²½ìš° 외부ì—서 실행시켜서 ë™ìž‘하게 ë¨. 그것과 비슷한 것. * applet : 어플리케ì´ì…˜(브ë¼ìš°ì €)ìƒì—서 ëŒì•„가는 ìž‘ì€ í”„ë¡œê·¸ëž¨. * servlet : 서버ìƒì—서 ëŒì•„가는 ìž‘ì€ í”„ë¡œê·¸ëž¨. 아파치 ì›¹ì„œë²„ì˜ ëª¨ë“ˆ ë°©ì‹(외부ì—서 http requestê°€ ë‚ ì•„ì˜¤ë©´ 서버가 받아서 ì•Œë§žì€ ëª¨ë“ˆì— ì „ë‹¬í•´ì¤Œ.)처럼 만들어 ë†“ì€ ê²ƒ. * portlet : í¬íƒˆ(관리프로그램 등)ìƒì—서 ëŒì•„가는 ìž‘ì€ í”„ë¡œê·¸ëž¨. * javaSE, javaEE : javaìŠ¤íŽ™ì˜ ì§‘í•©. * javaSE : JLS(java language specification) + java api를 가리킴. ìžë°”ì˜ ì‹¤ì œ 문법과 ì–¸ì–´ì— í•„ìš”í•œ 기본ì ì¸ ê¸°ëŠ¥ë“¤. 참조 구현체로는 hotspot JVMì´ ìžˆë‹¤. * javaEE : SE ì´ì™¸ì˜ 표준 ìŠ¤íŽ™ë“¤ì„ ë‹¤ 모아서 javaEEë¼ê³ 함. javaSE ì™¸ì˜ ì¶”ê°€ì ì¸ ê¸°ëŠ¥ë“¤ì´ ë“¤ì–´ê°. javaEEì—서 ì œì¼ ìž˜ ì•Œë ¤ì§„ ìŠ¤íŽ™ì´ servletì´ë‹¤. 참조 구현체로는 tomcatê³¼ glassfishê°€ 있다. tomcatì€ servletì˜ ìŠ¤íŽ™ë§Œ ë§Œì¡±ì‹œí‚¤ê³ javaEEì˜ ì „ì²´ ìŠ¤íŽ™ì„ ë§Œì¡±ì‹œí‚¤ì§€ëŠ” 않지만 glassfish는 javaEEì˜ ëª¨ë“ ìŠ¤íŽ™ì„ ë§Œì¡±ì‹œí‚¨ë‹¤. * tomcatì€ servlet container지만 glassfish는 WAS(web application server)ì— í•´ë‹¹í•œë‹¤. * DIP (depencency inversion principle) : 구체í´ëž˜ìŠ¤ë¥¼ ì‚¬ìš©í• ë•Œ 구체í´ëž˜ìŠ¤ë¥¼ ì§ì ‘ 사용하지 ì•Šê³ ì¶”ìƒí™” ëœ ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 통해서 사용하게 하는 ë””ìžì¸ 패턴. * JPAì˜ êµ¬ì²´ í´ëž˜ìŠ¤ë¡œ eclipse link와 hibernateê°€ 있는ë°, ê°ê°ì„ ì‚¬ìš©í• ë•Œ 구체 í´ëž˜ìŠ¤ë¥¼ 통해서 사용하지 ì•Šê³ JPA ì¸í„°íŽ˜ì´ìŠ¤ë¥¼ 통해서 사용하ë„ë¡ í•˜ë©´ ë‚˜ì¤‘ì— êµ¬ì²´ í´ëž˜ìŠ¤ë¥¼ 바꾸기 쉽다. * tomcatì— servletì„ ë°°í¬ ì‹œ ë‚´ë¶€ì˜ ë™ìž‘ * tomcatì— servletì„ ë°°í¬í•˜ëŠ” ê²ƒì€ servletì„ êµ¬ì„±í•˜ê³ ìžˆëŠ” í´ëž˜ìŠ¤ë¥¼ tomcatì˜ í´ëž˜ìŠ¤íŒ¨ìŠ¤ì— ì§‘ì–´ë„£ëŠ” ê²ƒì„ ë§í•œë‹¤. javaì˜ íŠ¹ì„± ìƒ tomcatì´ ì‹¤í–‰ëœ ì´í›„ì— í´ëž˜ìŠ¤íŒ¨ìŠ¤ì— ë‚˜ì¤‘ì— ì¶”ê°€ëœ í´ëž˜ìŠ¤ë¥¼ 집어넣어서 ë™ì ë¡œë”©ì„ í• ìˆ˜ 있다. * servletì˜ war(web archive)파ì¼ì„ 넣어주면 tomcatë‚´ë¶€ì˜ watcherê°€ war파ì¼ì˜ ì •ë³´ë¥¼ ì½ì–´ì„œ ì¶”ê°€ëœ í´ëž˜ìŠ¤ë¥¼ ë™ì 으로 로딩해 준다. * servlet í´ëž˜ìŠ¤ì˜ ë¡œë”© 순서 : jvmì—서 tomcatì˜ mainí´ëž˜ìŠ¤ë¥¼ ì§„ìž…ì ì— ë¡œë”©í•œë‹¤ -> deployment descriptionì— ì–¸ê¸‰ë˜ì–´ìžˆëŠ” servletí´ëž˜ìŠ¤ë¥¼ tomcatì˜ ì§„ìž…ì ì— ë¡œë”©í•œë‹¤. * servlet 실행 * template method íŒ¨í„´ì´ ì‚¬ìš©ë다. protected로 ì„ ì–¸ëœ service methodê°€ template methodì— í•´ë‹¹ë˜ëŠ”ë° abstractê°€ 아닌 ì´ìœ 는 기본 êµ¬í˜„ì„ ì£¼ê³ ì›í•˜ëŠ” í˜¸ì¶œì— ëŒ€í•´ 오버ë¼ì´ë“œë¥¼ 해서 사용하기 위함ì´ë‹¤. * init : servletì´ ë¶ˆëŸ¬ì™€ì§€ë©´ ë¨¼ì € 실행ë˜ëŠ” method. initì´ ì‹¤í–‰ë˜ì§€ 않으면 servletì´ ë¡œë”©ë˜ì§€ 않는다. * destoy : servletì´ ì¢…ë£Œë 시 실행ë˜ëŠ” method. * service : 외부ì—서 서버로 requestê°€ 들어올 시 서버ì—서 servletì˜ service method를 실행시킴. service(req, res) ë‚´ë¶€ì—서 req를 통해 requestì˜ ê°’ì„ ë°›ì•„ì„œ resì˜ ê°’ì„ ë³€ê²½ì‹œì¼œ 외부로 내보내준다. 해당 결과를 do*ì˜ ì´ë¦„ì´ ë¶™ì€ method(doGet, doPost 등)로 ì „ë‹¬í•´ì¤€ë‹¤. * do* : 해당 httpMethodì— ëŒ€í•œ 처리를 해주는 method. === 2012ë…„ 11ì›” 10ì¼ === * jar와 warì˜ ì°¨ì´ * war : src/mainì— ìžˆëŠ” webapp í´ë” ë‚´ë¶€ì— ìžˆëŠ” 파ì¼ì´ root로 오게 ëœë‹¤. * src/main/java, src/main/resources ê°€ warì˜ WEB-INF í´ë” ë‚´ë¶€ì˜ classes ë‚´ë¶€ì— ìœ„ì¹˜í•˜ê²Œ ëœë‹¤. * jar : src/main/java, src/main/resources í´ë”ê°€ root로 오게 ëœë‹¤. * http ìš”ì²ì´ servletì— ì „ë‹¬ë˜ê¸°ê¹Œì§€ ê³¼ì • * httpìš”ì²(http://hostname/contextPath/path?params) -> contextPath를 ë³´ê³ í•´ë‹¹í•˜ëŠ” war를 ì°¾ìŒ -> war ë‚´ë¶€ì˜ web.xmlì„ ë³´ê³ <servlet-mapping>ì˜ ì •ë³´ë¥¼ ë³´ê³ í•´ë‹¹ ì£¼ì†Œì— ë§¤í•‘ëœ servletì„ ì°¾ëŠ”ë‹¤. -> 해당하는 servletì´ ì—†ì„ ê²½ìš° defalut servletì´ ì²˜ë¦¬ * servlet filter chain * requestê°€ servlet으로 ì „ë‹¬ë˜ê¸° ì „ì— filter chainì„ ê±¸ì–´ì„œ 여러 servletì— ì¼ê´„ì ì¸ ë™ìž‘ì„ í•´ì¤„ 수 있ìŒ. * request -> Servlet Container -> Filter -> Servlet * response <- Servlet Container <- Filter <- Servlet * servletì˜ thread safety * servletì€ thread per request 구조로 í•˜ë‚˜ì˜ servlet ê°ì²´ê°€ ì—¬ëŸ¬ê°œì˜ ìŠ¤ë ˆë“œì—서 호출ë˜ëŠ” 구조. * filter, servletì€ í•˜ë‚˜ì˜ ê°ì²´ë¥¼ urlì— ë§¤í•‘í•´ì„œ 여러 ìŠ¤ë ˆë“œì—서 ì“°ì´ëŠ” 것임. ë”°ë¼ì„œ thread-safe 해야 한다. * thread-safe하기 위해서는 stateful해서는 안 ëœë‹¤. Servletì´ stateless하ë”ë¼ë„ ë‚´ë¶€ì— stateful한 ê°ì²´ë¥¼ ë“¤ê³ ìžˆìœ¼ë©´ ê²°êµì€ stateful하게 ëœë‹¤. ìžì£¼ 하는 실수ì´ë¯€ë¡œ 조심하ë„ë¡ í•˜ìž. * 처리 방법 : ê³µìœ ë˜ëŠ” 변수를 ì“°ì§€ ë§ê³ 함수 ë‚´ì—서만 사용하는 ì§€ì— ë³€ìˆ˜ë¥¼ 사용하ë„ë¡ í•˜ìž, ThreadLocalì„ ì‚¬ìš©í•œë‹¤. ThreadLocalì€ ê° ìŠ¤ë ˆë“œë§ˆë‹¤ 서로 다른 ê°ì²´ë¥¼ ë“¤ê³ ìžˆëŠ” 컨테ì´ë„ˆì´ë‹¤. === 2012ë…„ 12ì›” 23ì¼ === * JNI(Java Native Interface) ---- [2012년활ë™ì§€ë„], [스터디분류]