E D R , A S I H C RSS

작��바�야기

1. 소개

  • ìž‘ì�€ ìž�바를 건드리면 어떻게 ë� ê¹Œ?
  • 2012년형 중장기 Java 스터디!

1.1. 누가?

  • 튜터: 변형진
  • 튜티: 김태진, 김준ì„�, 권순ì�˜, 서민관, 서ì˜�주, ê¶Œì˜�기
    • 누구나 참여 가능합니다. ê°�ìž� ì�´ë¦„ì�„ ì�¨ì£¼ì„¸ìš”.
    • 최소 Java 기초 문법 ì�´í•´ ë°� 학부 2학년 1학기 커리í�˜ëŸ¼ 수준ì�˜ ì „ì‚°ì§€ì‹� í•„ìš”
      • ì�´ë¡ ê³¼ 실무 ì§€ì‹�ì�„ 모ë‘� 다룰 예정ì�´ë¯€ë¡œ Java 경험ì�´ ë§Žì�„ 수ë¡� 좋습니다.
    • ìš°ì•™ 재밌겠다 - 서지혜
    • í�¥ë¯¸ë¡œì›Œì„œ 참여하고 ì‹ì§€ë§Œ ì•„ì§� 서울ì—� 갈만한 형편ì�´ 안ë�˜ë„¤ìš”.. í�¥ë¯¸ë¡œìš´ 주제를 다루시는것 ê°™ë�˜ë�°. - 안í˜�준

1.2. 언제?

  • 토요ì�¼ 오후 1시부터

1.3. 어디서?

  • ì œ2공학과 6층 ZeroPage학회실 ë˜�는 컴퓨터공학부실습실

1.4. 무엇�?

  • í•™êµ�ì—�서 배울 수 없는 Javaì—� 대한 좀ë�” 깊고 다양한 ì�´ì•¼ê¸°
  • 다룰 법한 주제
    • Java Technology와 ìƒ�태계
    • Java 개발 환경 ë°� 빌드 프로세스
    • Java 프로그래ë°� 언어
      • Java 코딩 컨벤션
      • í�´ëž˜ìŠ¤ì™€ ê°�ì²´
      • Annotations ë°� Generics
      • 예외 처리
    • Java API와 주요 기술
      • 컬렉션 프레임워í�¬ì™€ ë�™ì‹œì„± 제어
      • Servletê³¼ Servlet 컨테ì�´ë„ˆ
      • Java 런타임과 리플렉션
      • ìž…ìœë ¥ê³¼ 네트워í�¬
      • 프레임워í�¬ì™€ 아키í…�처
        • MVC와 ì˜�ì†�í™” 계층(DB)
      • 주요 오픈 소스 ë�¼ì�´ë¸ŒëŸ¬ë¦¬
    • Java 개발 방법론
      • ê°�체지향 프로그래ë°�
        • 리팩터ë§�
        • ë””ìž�ì�¸ 패턴
      • 테스트 주ë�„ 개발
        • 유닛 테스트
        • Mock 프레임워í�¬
    • Android 플랫í�¼
    • 등등…

1.5. 어떻게?

  • 세미나
  • ë�¼ì�´ë¸Œ 코딩
  • 실습
  • 참고ë�„서
    1. Effective Java Second Edition by Josh Bloch

1.6. 왜?

  • ìž‘ì�€ ìž�ë°”ì�˜ ìž‘ì�€ 배때지ì—� 칼빵ì�„ 놔주기 위해…?

1.6.1. 변형진

  • 현업 Java 개발ìž�ë�„ 놓치기 쉬운 문제들ì�„ ì§šì–´ë³´ê³ , 올바른 Java 프로그램ì�„ 빠르고 ê¹”ë�”하게 구현하는ë�° 필요한 중급 수준ì�˜ ì§€ì‹�ì�„ 전달하기 위해
  • Java를 중ì �ì �으로 다루지만, Javaì—� 한정ë�˜ì§€ 않ì�€ í�­ë„“ì�€ 컴퓨터공학ì � ì�´í•´ë¥¼ 바탕으로 사고하ë�„ë¡� 하기 위해
  • ê·¸ë�™ì•ˆ 설계와 구현ì—� 관한 ì�¼ë°˜ë¡ ì�„ 위주로 세미나를 진행해왔기ì—�, ì�´ë²ˆì—�는 좀ë�” practical하고 pragmatic한 ì§€ì‹�ì�„ 전달하는ë�° 비중ì�„ ë‘�ê³ ìž� 함.
  • 나 스스로ë�„ 알지만 불충분했ë�˜ ì§€ì‹�ì�´ë‚˜ ì•„ì§� 어렴풋한 ì§€ì‹�ì�„ 설명하면서 함께 공부하고 배우기 위해

1.6.2. 김태진

  • í•™êµ�ì—�서 배우기 힘든 다양한 ì§€ì‹�(ìž�ë°”ë¿�ë§Œ 아니고)들ì�„ ì ‘í•´ë³´ê³ , 활용할 수 있기위해
  • ì•„ì§� ë‚´ê°€ 구현하는게 불가능한 것ì�„ 가능하게 하는 것부터, 좀 ë�” '잘' 구현하는게 가능한 ì˜�역까지 ê·¸ í�­ì�„ 넓히기 위해
  • 어디가서 ìž�바로 개발 좀 제대로 í•´ë´¤ëƒ�ë�¼ê³  물어볼때, 확실히 '네'ë�¼ê³  대답할 수 있기 위해
  • 병특ì�„ 위한 중장기 프로ì �트(?)
  • "ë‚´ê°€ 아무것ë�„ 모른 ìƒ�태ì—�서 1학년 1ë…„ê°„ 배울때처럼 그때 ê·¸ 마ì�Œìœ¼ë¡œ ë§Žì�€ 것ì�„ 배우기 위해" - 배움ì—� ì�´ìœ ê°€ 있는가.

1.6.3. 서�주

  • ìž�바를 좀 대충 ë°°ìš´ ê°�ì�´ 있어서 ìž�ë°”ì—� 대해서 조금 ë�” 확실히 알고 í•™êµ�ì—�서 가르ì³�주는 것 외ì�˜ ìž�ë°”ì—� 관한 ì§€ì‹�ì�„ 조금 ë�” ë°°ìš°ê³  ì‹ì–´ì„œ.
  • 언어ì—� 관한 것 ë¿�ë§Œ 아니ë�¼ 유용한 ë�¼ì�´ë¸ŒëŸ¬ë¦¬, ìž�ë°” 개발 환경 등 개발ì�„ ë�” 빠르고 편리하게 í•  수 있는 방법ì�„ 배우기 위해서.
  • 유닛테스트, mock 프레임워í�¬ 사용 등ì�˜ 부분ì—� 대한 실제 사용 예를 잘 알기 위해

1.6.4. 권순�

  • í•™êµ�ì—�서 ë°°ìš´ ìž�바보다 ë�” 심ë�„있는 걸 하고 ì‹ì—ˆëŠ”ë�° 능력ì�´ 안 ë�˜ì„œ 못했기 때문ì—�
  • 보다 ë�” 사고를 넓히기 위해
  • 공부란 것ì�€ 하면 í•  수ë¡� 할게 많기 때문..

1.6.5. 서민관

  • 단순히 ìž�ë°” 언어ì—� 대해서가 아니ë�¼ ë�” 다양한 주제를 다루는 스터디ì�´ê¸° 때문ì—� í�¥ë¯¸ê°€ 있어서.
  • 토요ì�¼ì—� í•  수 있는 활ë�™ë“¤ 중ì—�서 시간 대 성능 비가 월등하니까 듣지 않ì�„ ì�´ìœ ê°€ 없다.
  • TDD로 코드를 ì§œ 보려다 실패해서 -_-;;; 어떻게 TDD로 코딩ì�„ 해야 하는지, 어떻게 리팩토ë§�ì�„ 해야 하는지 듣고 ì‹ì–´ì„œ.

1.6.6. 권�기

  • ìž�ë°” 언어ì—� 대해서 심ë�„있게 공부해보고 ì‹ì–´ì„œ.
  • 나ì�˜ 시야를 넓히고 ì‹ì–´ì„œ.
  • 토요ì�¼ì�„ 알차게 보내기 위해서.
    좋� 선행학습�다..

2. 규칙


3. ì§„í–‰


3.1. 2012년 5월 5�

  • 오리엔테ì�´ì…˜
    • 튜터가 ìƒ�ê°�한 ì�´ 스터디ì�˜ "무엇ì�„?", "어떻게?", "왜?"를 ìž�세히 소개하고, 튜티들ì�´ ì›�하는 "무엇ì�„?", "어떻게?"ì—� 대한 ì�´ì•¼ê¸°ë¥¼ 나눴습니다.
    • 스터디 시간ì�´ 참여ìž�들 ê°�ê°�ì—�게 ì›�하지 않는 시간 낭비가 ë�˜ì§€ 않ë�„ë¡�, 언제ë�¼ë�„ ë˜�다른 ì�˜ê²¬ê³¼ 질문ì�„ 환ì˜�합니다.
  • "왜?"ì—� ê°�ìž� 서브섹션ì�„ 나누어 ìž�ì‹ ì�´ ì�´ 스터디를 통해 ì›�하는 것ì�„ ì �ê³ , 스스로ì—�게 ë�™ê¸°ë¶€ì—¬ë¥¼ 해봅시다.

3.1.1. 후기


3.2. 2012년 5월 12�

  • SpringSource Tool Suite(Eclipse IDE)ì�˜ 기본 설정과 프로ì �트 설정ì—� 필요한 기본ì �ì�¸ 정보를 설명했습니다.
  • Eclipse JDTì�˜ 빌드 과정ì�„ 알아보고 Mavenì—�서 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ ì�˜ì¡´ì„±ì�„ 추가해보았습니다.
  • í�´ëž˜ìŠ¤ì™€ ê·¸ 멤버ì—� ì �용하는 기본 modifier들ì�˜ ê°œë…� ë°� 용법ì�„ 다뤘습니다.
    • public, protected, private, (none)
    • abstract, final, static

3.2.1. 후기


  • static modifierì—� 대해 애매하게 알고 있었는ë�° ìž�세하게 설명해주셔서 좋았습니다. staticì�€ 타입ì�„ 통해서 부르는거ë�¼ê±°ë‚˜ ì›�래 모든 함수가 staticì�¸ë�° ê°�체지향ì�˜ 다형성ì�„ 위해 staticì�´ 아닌 함수가 ìƒ�긴거ë�¼ëŠ” 설명ì�€ 신기했었습니다. object.method(message) -> MyType::method(object, method) 부분ì�´ oop 실제 구현ì�˜ 기본ì�´ë�¼ëŠ” 부분ì�€ 잊어버리지 않고 잘 기억해둬야겠습니다. ê·¼ë�° 파ì�´ì�¬ì—�서 메소드 작성시 (self)ê°€ 들어가는 것ë�„ ì�´ê²ƒê³¼ 관련ì�´ 있는건가요? -서ì˜�주
    • Python ì�€ PEPì—� 절대 권한ì�„ 가진 ê·€ë�„ê°€ 그냥 ì�˜ê²¬ì�„ 모아서 정한ê²�니다. ì›�숙한 언어ì�¼ìˆ˜ë¡� 스펙 ìž�ì²´ê°€ 'ì›�래 그런 것'ì�€ 없고, '사람간ì�˜ 약ì†�'입니다. ì�´í•˜ 참고ìž�료. --NeoCoin
    • 제가 "ì›�래 모든 함수가 static"ì�´ë�¼ëŠ” ì�˜ë¯¸ë¡œ ë§�한건 아닌ë�° 오해ì�˜ 소지가 있었나보군요. 사실 제가 설명한 가장 중요한 사실ì�€ ë§�씀하신 예ì—�서 objectì�˜ 컴파ì�¼ 타입ì�˜ method() 메서드가 ê°€ìƒ� 메서드ë�¼ë©´(staticì�´ 아닌 모든 Java 메서드), 실제 ì–´ë–¤ method() 메서드를 ì„ íƒ�í•  것ì�´ëƒ�ì—� 관한 부분ì�„ objectì�˜ 런타임 타입ì—� ì�˜í•œë‹¤ëŠ” 부분ì�´ì—ˆì§€ìš”. 그러니까 object는 컴파ì�¼ 타입과 ë�™ì�¼í•˜ì§€ 않ì�€ 런타임 타입ì�„ 가질 수 있으며, 다형성ì�˜ 구현ì�„ 위해 implicit argumentì�¸ object(=this)ì�˜ 런타임 타입ì—� ë”°ë�¼ overrideë�œ 메서드를 ì„ íƒ�한다는 사실ì�„ 기억하세요. (Pythonì—�ì„  실제 메서드 ë‚´ì—�서 사용할 formal parameterì�¸ self를 explicit하게 선언할 수 있다고 ë³´ë©´ ë�˜ê² ì§€ìš”.) - 변형진
  • staticì—�는 ì�´ëŸ° 용법ë�„ 있습니다. StaticInitializer - 안í˜�준

3.3. 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 ê°�ì²´ì�˜ 활용 과정ì—�서 ê°�체들ì�˜ ë�™ì�¼ì„±ê³¼ ë�™ë“±ì„±ì�„ 알아보았습니다.

3.3.1. 후기

  • Stringê°�ì²´ë�¼ë‹ˆ..! ìž�ë°” 스트ë§�ì�€ 편하면서ë�„ 불편했는ë�° 뭔가 ê·¸ ì�´ìœ ë¥¼ 들ì�„ 수 있었ì�„ 법한 주제네요..-김태진
  • c++ì—�서 ìƒ�호배제 관련으로 mutex나 critical sectionê°™ì�€ê±° ì—„ì²­ 배웠었는ë�° ìž�ë°”ì—�서는 synchronized를 ì�´ìš©í•´ì„œ 쉽게 처리할 수 있다는게 신기했습니다. os 수업 들ì�€ì§€ 오래 ë��는ë�° 멀티프로세스와 멀티스레드 수업ì�„ 다시 들으니까 설명ì�„ ì°¸ 잘 해주셔서 좋았습니다. 함수ì—�ë§Œ ë¶™ì�¼ 수 있는게 아니고 보호ìž�ì›�ì�„ 가진 ê°�체를 ì�´ìš©í•œ synchronized(this){ ... } ê°™ì�€ 부분ì�€ 나중ì—� 스레드를 쓸 경우ì—� 참고가 ë�  것 같습니다. 그리고 ì�¸í„°íŽ˜ì�´ìŠ¤ì™€ 리플렉션ì�„ ì�´ìš©í•œ 초기화를 보니 ìƒ�ê°�ì�„ 잘 하면 구체í�´ëž˜ìŠ¤ê°€ 코드ì—� 안드러나게 í•  수 있다는 ì �ë�„ 볼만했습니다. -서ì˜�주
  • ê°œì�¸ì �으로 synchronized는 잘 몰ë�¼ì„œ 그냥 ë¶™ì�´ë©´ ì�¼ë‹¨ ë�œë‹¤ëŠ” ì�´ë¯¸ì§€ë§Œ 막연하게 가지고 있었는ë�° 그런 부분까지 세밀하게 다뤄 주셔서 듣기ì—� ìƒ�당히 좋았습니다. 그래서 깊ì�´ê°€ ìƒ�당히 깊어졌다는 ì �ì�€ 장ì �ë�„ 있고 단ì �ë�„ 있었지만 ì œ 입장ì—�서는 그래ë�„ ì–´ëŠ� ì •ë�„ 들ì�„ 수 있었ë�˜ ë§Œí�¼ 다룰 범위를 괜찮게 설정하시지 않았나 ì‹ìŠµë‹ˆë‹¤. - 서민관

3.4. 2012년 5월 26�

  • interface
  • nested class
    • static nested class
    • inner class
    • annonymous inner class
  • ì�‘ì§‘ë�„up와 ê²°í•©ë�„dw (cohesion&coupling)
  • SOLID SOLID Wiki
    • SRP (Single responsibility principle)
    • OCP (Open/closed principle)
    • LSP (Liskov substitution principle)
    • ISP (Interface segregation principle)
    • DIP (Dependency inversion principle)
  • DRY DRY Wiki
    • dont repeat yourself ì�´ê±¸ 걸려고 했나? - 서지혜
      • ì�´ìƒ�하네요; 그냥 주소 복사해서 주소창ì—� 넣으면 잘 뜨는ë�° -_-a - 권순ì�˜
        • url중ì—� 'ê°€ 들어있어서 그런듯... - 서지혜

3.4.1. 후기

  • ë”± 6시간 지나고 ìƒ�ê°�해보니 오늘 ë­� ë°°ì› ë�”ë�¼.. 하는 ëŠ�낌ì�´ 왔네요--; 중간ì—� ìž ê¹� 졸아서ì�¸ì§€ 저번시간ì—� 반밖ì—� 못들어서였ì�„ì§€.. 저작권 ì�´ì•¼ê¸°ëŠ” 좀 ìƒ�ê°�나지만 나머지는 뭔가 í�‰ì†Œë³´ë‹¤ ë�” 여기갔다 저기갔다 하는 바람ì—� 머리가 혼란스러웠나ë´�ìš”;; -김태진
  • ì „ì²´ì �으로 다른 언어ì—�서는 ë³¼ 수 없는 ìž�ë°”ì�˜ 문법 + ê°�체지향 ì›�ì¹™ì�„ 중ì �ì �으로 다룬 시간ì�´ì—ˆìŠµë‹ˆë‹¤. 중간중간 다른 ì�´ì•¼ê¸°ë“¤(builder 패턴, 저작권)ì�´ 들어갔지만 그래ë�„ 다룬 주제는 명확하다고 ìƒ�ê°�합니다. 다만 그걸 어떻게 ì“°ëŠ�ëƒ�는 í��릿한 ëŠ�낌입니다. 그건 아마ë�„ ê°� ì›�칙들ì�´ë‚˜ interface, ê°�ì²´ 등ì—� 대한 ëŠ�낌ì�„ 잡기 위해서는 경험ì�´ 좀 필요하기 때문ì�´ 아닌가 ì‹ìŠµë‹ˆë‹¤ ;;; 수경ì�´ê°€ ë§�한 대로 한 번ì�´ë�¼ë�„ í•´ 본 사람ì�€ 알기 쉽다는 ë§�ì�´ ë§žì§€ 않ì�„까 싶네요. 그리고 ì „ì²´ì �으로 ì�´ì•¼ê¸°ë¥¼ 들으면서 현재 프로ì �트 중ì�¸ 코드가 ìž�꾸 ìƒ�ê°�나서 ì˜� ëŠ�낌ì�´ ì°�ì°�했습니다. 세미나를 들으면서 코드를 ìƒ�ê°�하니까 ê³ ì³�야 ë�  부분ì�´ 계ì†� ë³´ì�´ëŠ”êµ°ìš”. 그래ë�„ 나름대로 코드를 ê¹”ë�”하게 í•´ 보려고 í�´ëž˜ìФ 구조ë�„ 정리를 좀 하고 했는ë�° ë�” 해야 í•  게 ë§Žì�€ ëŠ�낌입니다. ã… ã…  ê·¸ 외ì—�ë�„ ì�´ë²ˆ 시간ì—� 들었ë�˜ 메소드ì�˜ ì±…ìž„ì�´ ì–´ë””ì—� 나타나야 하는가(ê°�ì²´ or 메소드) ë�¼ê±°ë‚˜ ìƒ�ì†�ì�„ 너무 ê²�ë‚´ì§€ ë§�ë�¼ëŠ” ì�´ì•¼ê¸°ëŠ” ìƒ�당히 뚜렷하게 와 닿아서 좋았습니다. ì•„. DIPì—�서 Logicê³¼ native API 사ì�´ì—� ì¶”ìƒ�í™” ë ˆì�´ì–´ë¥¼ ë‘�는 것ë�„ ìƒ�당히 좋았는ë�° 기회가 ë�˜ë©´ ê¼­ 코드로 ë³´ê³  ì‹ìŠµë‹ˆë‹¤. 아마 다ì�Œì—� 보게 ë�˜ê² ì§€ë§Œ. - 서민관

3.5. 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

3.5.1. 후기


  • 지난시간ì—� ì�´ì�€ 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ì�€ 다른 ë¶„ì�´ 설명좀. - 김준ì„�

3.6. 2012년 7월 20�

  • Java Generics
    • run-timeì�˜ type erasure
      • 프로그래머ì�˜ 타입 보장
  • Reflection API
    • parameter 얻어오는 방법 세 가지.
      • public field
      • getter, setterê°€ 존재하는 field
      • @property annotation 사용
  • Generics와 Reflectionì�„ ì�´ìš©í•œ ObjectMapper 만들기
    • Map <-> Object 변환

3.6.1. 후기

  • 리플렉션과 제네릭스를 ì�¨ì„œ 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())로 ì²´í�¬ë¥¼ 하는 부분ë�„ 공부가 ë§Žì�´ ë��습니다. - 서ì˜�주

3.7. 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로는 ì²´ì�´ë‹�ì�„ í•  수 ì—†ì�Œ.

3.7.1. 후기

  • 웹 수업ì—�서 prototype 설명 때ë�„ 그랬지만 먼저 ê°œë…�ì �ì�¸ 부분ì—� 대해서 기본ì �ì�¸ 구현ì�´ 어떻게 ë�˜ì–´ìžˆëŠ”ì§€ë¥¼ 먼저 ë°°ìš°ê³  ì�´ëŸ¬í•œ 기능들ì�„ 실제로 ë�” 편하게 쓸 수 있는 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ëŠ” ì–´ë–¤ 것들ì�´ 있는지 배우니까 그냥 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë§Œ 아는 것보다 조금 ë�” 알기 쉬운 것 같습니다. 유용한 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë“¤ì�´ 어떤게 있는지 ë�” ë§Žì�´ 가르ì³�주셨으면 좋겠습니다. Annotationì�€ 매번 쓰기만 했었는ë�° ì�´ë ‡ê²Œ 한 번 만들어보니까 ìƒ�ê°�보다 어렵지는 않ì�€ 것 같습니다. - 서ì˜�주

3.8. 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

3.9. 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 ì�˜ì¡´ì„±ê³¼ ì�´í�´ë¦½ìФ ì�˜ì¡´ì„±ê°„ì�˜ ì°¨ì�´ê°€ ë°œìƒ�í•  수 있다.

3.10. 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단ì—�서 ìƒ�호배제를 해주지 못하기 때문ì—� ë�™ì‹œì„± 제어ì—� 문제가 있ì�„ 수 있다. ë”°ë�¼ì„œ 분산환경ì—�서ì�˜ 사용ì�€ 좋지 못하다.

3.11. 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함수로 바꿔서 불변ê°�체를 만들 수ë�„ 있다. ì�´ë ‡ê²Œ í•  경우 스레드 환경ì—�ë�„ 조금 ë�” 안전해진다.
  • ì²´ì�¸ë¬¸ë²•ì�˜ 장ì � - ì²´ì�¸ì�„ 쓸지 ë§�지를 ì„ íƒ�í•  수 있다.

3.12. 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 패턴� 부모 �래스�서 전체�� 틀� 만들어 �고 행�� 해당하는 메소드를 �� + 오버��드 해서 확장한다.

3.13. 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.

3.14. 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� � 스레드마다 서로 다른 �체를 들고 있는 컨테�너�다.

3.15. 2012년 12월 23�

  • IME(Input Method Editor) - OS 레벨ì—�서 실제 key code - 문ìž�ì�˜ mappingê³¼ 문ìž� ì¡°í•©('ã…�' + 'ã…�' ê°™ì�€ 경우)ì�˜ 처리를 í•´ 주는 소프트웨어. Sublimeì—�서는 제대로 처리를 안 í•´ 줬다...
  • JNI(Java Native Interface)
    • Javaì—�서 다른 언어(C언어)로 ë�œ ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¥¼ ë�™ì �으로 호ìœí•´ì„œ 사용할 수 있ë�„ë¡� í•´ 주는 방법.
    • 소스 코드ì�˜ 컴파ì�¼ 과정ì—�서 load 과정ì—� 해당하는 기술.
    • .java 파ì�¼ì—�는 í�´ëž˜ìФ ë‚´ì—� native modifier를 ë¶™ì�¸ 메소드를 작성하고, .c, .cpp 파ì�¼ì—�는 Javaì—�서 호ìœë�  함수ì�˜ 구현ì�„ 작성한다. ì�´í›„ System.loadLibrary(...) 함수를 ì�´ìš©í•´ì„œ .dll 파ì�¼(Windowsì�˜ 경우) ë˜�는 .so(shared object) 파ì�¼(Linuxì�˜ 경우)ì�„ ë�™ì �으로 로드한다.
      • ë�¼ì�´ë¸ŒëŸ¬ë¦¬ 파ì�¼ì�˜ 함수는 특정한 naming conventionì�„ 지켜서 작성해야 하고, ì�¸ìž�ë�„ 반드시 몇몇 ì •í•´ì§„ ì�¸ìž�들ì�„ 받아야 한다. ë˜�한 Java와 타입ì�„ 호환시키기 위해 C, C++ì—�서 특정한 구조체들ì�„ 사용해야 한다. 해당 구조체들ì�€ jni.hì—� ì •ì�˜ë�˜ì–´ 있다.
      • 실제 사용하기ì—�는 naming conventionì�„ 지켜서 함수를 작성하기는 귀찮기 때문ì—� native를 가진 .class 파ì�¼ì�„ javahì—� 넣으면 conventionì�„ 지킨 .h 파ì�¼ì�„ 만들어 준다.
      • .cpp 파ì�¼ë¡œ 작성했ì�„ 때 사용하는 extern "C"는 함수 í˜¸ìœ ê·œì•½(__cdecl, __stdcall)ê³¼ 관련ë�œ 부분ì�´ë‹¤. extern "C"를 ì �어주는 것으로 __cdecl로 함수를 호ìœí•˜ë�„ë¡� 한다.

3.16. 2013년 1월 6�

  • JVM & Java Byte Code
    • JVM - stack-based machine
      • register-based machineê³¼ì�˜ ì°¨ì�´ëŠ” ì—°ì‚°ì—� 사용ë�˜ëŠ” operandì�˜ ì°¨ì�´. register-basedì—�서는 registerì—�서 operand를 가져오고 stack-basedì—�서는 stackì—�서 pop해서 가져온다.
      • stack-based machineì�˜ 경우 register-based machineì—� 비해 push, popì�´ 많아서 ì†�ë�„ê°€ 조금 ëŠ�리지만 register를 사용하는 경우ì—� 비해 기기ì—� ë�œ 종ì†�ì �ì�´ë‹¤.
      • 명령어ì�˜ prefix로 타입ì�„ 구분한다. http://en.wikipedia.org/wiki/Java_bytecode#Instructions
      • invoke* 명령어
        • invokespecial - vtable lookupì�„ 하지 않고 메소드를 호ìœí•˜ëŠ” 경우. ì–´ë–¤ 메소드를 호ìœí•´ì•¼ 하는지 ì •í•´ì ¸ 있는 경우ì—� 사용ë�œë‹¤. new, private method, super 등.
        • invokevirtual - vtable lookupì�„ 한다. ì�¸ìŠ¤í„´ìŠ¤ì�˜ 실제 타입ì�„ 가지고 메소드를 찾는 경우. 대부분ì�˜ 메소드들ì�´ 여기ì—� 해당한다.
        • invokestatic - static 메소드 호ìœ. 첫 ì�¸ìž�로 this를 넣어주지 않는다.
        • invokeinterface - virtualê³¼ ê±°ì�˜ 같다. interfaceì�˜ 메소드를 호ìœí•˜ëŠ” 경우ì—� 사용한다.
      • if문 - if*ê³¼ if_*ì�˜ ë‘� 종류로 나뉜다.
        • if* 타입 - operand를 하나만 사용해서 0ê³¼ 비êµ�하는 경우가 대부분ì�´ë‹¤. ifeq(0ê³¼ ê°™ì�Œ), ifne(0ì�´ 아님) 등ì�˜ 명령어가 있다.
        • if_* 타입 - stackì—�서 ë‘� ê°œì�˜ operand를 꺼내서 서로 비êµ�하는 경우ì—� 주로 사용ë�œë‹¤. if_icmpeq(정수형 ê°’ ë‘� 개를 ê°™ì�€ì§€ 비êµ�) 등ì�˜ 명령어가 있다.

  • 11ì›” 10ì�¼ì�´ 둘? - 서지혜
    • 복사해서 가져왔ë�”니 ë‚ ì§œ 바꾸는 걸 까먹ì�€ë“¯ ;;; - 서민관

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:30:42
Processing time 0.0280 sec