Contents
- Spring/�험스터디
- Spring/�험스터디/2011
- Spring/�험스터디/2011-02-04
- Spring/�험스터디/wiki만들기
1. 스터디 소개 ¶
- Spring Framework 3를 �험해보�!
- 스터디 시간
- 2011ë…„ 1ì›” 7ì�¼~2ì›” 25ì�¼ : 매주 금요ì�¼ 7시. ê·¸ë¦¬ê³ í•„ìš”í•˜ë©´ ë�” 모임
- 2011ë…„ 3ì›” : 매주 í† ìš”ì�¼ 3시
- 2011ë…„ 1ì›” 7ì�¼~2ì›” 25ì�¼ : 매주 금요ì�¼ 7시. ê·¸ë¦¬ê³ í•„ìš”í•˜ë©´ ë�” 모임
4. 주êµ�재 ¶
- í† ë¹„ì�˜ìŠ¤í”„ë§�3
- 1부는 ì˜ˆì œë¥¼ ì �ì§„ì �으로 ê°œì„ í•´ 나가ë�„ë¡� 구성ë�˜ì–´ 있으므로 ê°�ê°�ì�˜ ê°œì„ ì�´ 무엇ì�„ ê°œì„ ì‹œì¼œë‚˜ê°€ëŠ” 것ì�¸ì§€ ì�´í•´í•˜ëŠ” 것ì�´ 중요
- Spring Framework 3 다루는 다른 �재 가능
- êµ�재가 ë¹„ì‹¸ê³ ë§¤ìš° 무거워 참여ìž�들ì�´ 스터디ì—� í™œìš©í• ìˆ˜ 있ë�„ë¡� ZeroPage 책장ì—� 둘 í† ë¹„ì�˜ 스프ë§� 3를 2ê¶Œ 주문함
5. ì§„í–‰ ë°©ì‹� ¶
- 세미나가 아니ë�¼ ê°�ìž�ê°€ 공부한 것ì�„ 바탕으로 ê³µìœ í•˜ê³ ì •ë‹µì�„ 찾아나가는 스터디
- 코치는 리ë�”ê°€ 아니ë�¼ 네비게ì�´í„°ì�˜ ì—í•
- 스터디 모임ì—�서는 ê°�ìž� 한 주간 í•™ìŠµí•˜ê³ ê³¼ì œë¥¼ 수행한 경험ì�„ ê³µìœ í•˜ê³ ê¶�금ì¦�ì�„ í•´ê²°
6. 규칙 ¶
- 코치 ì°¸ì„� 여부와 ìƒ�관없ì�´ 스터디를 ì •ì‹œì—� 시작한다.
- 스터디 대ìƒ�ì�´ 매우 방대하므로 충분한 ê°œì�¸ì �ì�¸ 학습과 ê³¼ì œ 수행, ê·¸ë¦¬ê³ ìŠ¤í„°ë”” 모임ì—�서 ë§Žì�€ 질문ì�„ í• ê²ƒ
- ì�¸ì›�ì�´ 충분하므로 ì œë•Œ ë”°ë�¼ì˜¤ì§€ 않는 사람ì�€ 부담없ì�´ 버릴수ë�„?!
7.1.2. 7ì�¼ ¶
- 7시 ~ 9시 30분 @ 6피
- 킥오프
- 리ë�” ì„ ì •
- �재 소개
- ì§„í–‰ ë°©ì‹� ê²°ì •
- 들어가며
- 리ë�” ì„ ì •
- 피드백
7.1.3.1.1. 서ì˜�주 ¶
21�� 한 것들
- 배운 것
1.1 ApplicationContext를 ìƒ�ì„±í• ì‹œ xmlì�„ 사용하는 방법ë�„ ìžˆê³ ì§�ì ‘ ì„¤ì •í•´ì£¼ëŠ” 방법ë�„ 있는ë�° xmlì�„ ì‚¬ìš©í• ì‹œ 좋ì�€ ì �ì�€ 코딩과 ì„¤ì • 담당ì�„ ë¶„ë¦¬í• ìˆ˜ 있다는 ì �ì�´ 있다.
1.2 pojo기반ì�˜ 프로그래ë°�ì�€ 모듈ì�„ 조립해서 쓰기 쉽기 떄문ì—� 재사용성ì�´ 높아진다. ì�´ 때 조립ì�„ 코드부분ì—� 맡기면 조립시 코드를 바꿔야 컴파ì�¼ì�´ 가능하지만 xmlì—� 조립ì�„ 맡기면 ì„¤ì •xmlì�„ 바꾸는 것만으로ë�„ 쉽게 ì„¤ì •ì�„ 바꿔서 조립ì�´ 가능하다.
1.3 테스트 가능한 프로그램 : 모듈화가 잘 ë�˜ì–´ìžˆì–´ì•¼ 함(관심사 분리) 모듈ì�„ ë¨¼ì € 만들어서 í…ŒìŠ¤íŠ¸í•˜ê³ í›„ì—� 조립ì�„ 한다. TDD 개발시 TDDì�´ì „ì—� 테스트 가능한 프로그램ì�„ 만들어야 한다.
1.4 TDD : 테스트 주ë�„ 개발. 지금 구현하는 것 하나만 테스트해ë�¼. ì‹¤íŒ¨í•˜ê³ ë°”ë¡œ 성공시켜ë�¼ ë�¼ëŠ” ì›�ì¹™ì�˜ 개발방법. 1. 무조건 성공시키는 코드 작성. 2. 임시 ë�°ì�´í„°ë¡œ 테스트 시 성공하는 코드를 작성. 3. 진짜로 ë�°ì�´í„°ë¥¼ 넣었ì�„ 시 성공하는 코드를 작성. 순으로 구현함.
- 배운 것
1.1 RESTful : ì�´ê¸°ì¢…ê°„ í†µì‹ . RESTful 웹서비스는 리소스 URI를 알면 웹서버와 웹í�´ë�¼ì�´ì–¸íЏì�˜ 종류ì—� ìƒ�관없ì�´ HTTP í”„ë¡œí† ì½œë§Œìœ¼ë¡œ ì ‘ê·¼ 가능한 서비스ë�¼ í• ìˆ˜ 있다. 리소스 하나ì—� 하나ì�˜ URLì�„ í• ë‹¹í•´ë†“ì•˜ë‹¤.
1.2 http� 4가지 method : POST, GET, PUT, DELETE
리소스 함수ì�˜ 4가지 method : CRUD(Create, Read, Update, Delete)1.3 Resttemplate : springì—�서 RESTfulì—� ì ‘ê·¼í•˜ê¸° 위한 template. springì—�서 ë�°ì�´í„°ë¥¼ 받아오는 방법.
DB� 4가지 method : Insert, Select, Update, Delete
7.1.3.1.2. 서민관 ¶
- 14�� 한 것들
- 배운 것
1.1. ì „ëžµ 패턴 : ì „ëžµ(ì•Œê³ ë¦¬ì¦˜)ì�˜ 분리를 한다는 ì�˜ë¯¸. 언어ì—� ë”°ë�¼ 패턴ì�„ ì �용하는 방법ì�´ 조금씩 다를 수ë�„ 있다. ì±…ì—�서는 interface를 사용해서 ì „ëžµì�„ 분리하였는ë�°, ì�´ê²ƒì�€ ìž�ë°”ì—� 어울리는 ì „ëžµì�˜ 분리ë�¼ê³ 한다.
1.2. Runtime Injection : 다형성ì�„ 만들기 위해서 사용한 방법. ê°œì�¸ì �으로 ì½”ë”©í• ë•Œ 다형성ì�˜ 사용ì�´ 좀 ë¶€ì¡±í•˜ë‹¤ê³ ëŠ�꼈는ë�°, Runtime시ì—� 오브ì �트간ì�˜ 관계를 맺게 하지 ì•Šê³ ê·¸ëƒ¥ í�´ëž˜ìФì—� 맞춘 코딩ì�„ 했기 때문ì�¸ 것 같다. 앞으로 코딩ì�„ 하는ë�° 머릿ì†�ì—� 넣어ë‘�ê³ ìž�주 ì�¨ 보는 것ì�´ 좋ì�„ 것ì�´ë�¼ ìƒ�ê°�ë�œë‹¤.
- ë¬¸ì œì �
2.1. Class.forName() ì—�러 : í•´ê²° 방법ì�€ 아래ì—� ì„œìˆ .
- MVC 프로ì �트
- HomeController.javaì�˜ home()ì—�서 Welcome home!ì�„ í•˜ê³ return "home";ì�„ 하는ë�° 프로ì �트를 실행해보면 Hello world!ê°€ 나온다. 어떻게 ë�œ 것ì�¸ê°€.
- HomeController는 MVC 모ë�¸ì�˜ 컨트롤러로 ë·°ì—� 모ë�¸ì�„ ë°”ì�¸ë”©í•˜ëŠ” ì—í• ì�„ 담당한다. home() 메소드 ë‚´ë¶€ì�˜ Welcome home!ì�€ loggerì—� ì°�히는 문ìž�ì—´ì�´ê¸° 때문ì—� ì‹¤ì œë¡œ 실행시ì—� ë³´ì�´ëŠ” 것ì�€ 아니다. HomeControllerê°€ 하는 주ë�œ ì—í• ì�€ return "home";ì�„ 함으로ì�¨ HomeController를 사용하는 쪽ì—�서 home.jsp(ë·°)를 ì°¾ì�„ 수 있게 하는 것ì�´ë‹¤.
- ê²°êµ í™”ë©´ì—� 나타나는 것ì�€ ë·°ì�¸ home.jspì�´ë¯€ë¡œ Hello world!는 ì�´ìª½ì—� 들어있다.
- 배운 것
- �후� 한 것
- Class.forName() ì—�러 í•´ê²°(p.59, 60ì�˜ ì˜ˆì œ 실행).
1.1. ìš°ì„ MySQLì�„ 받아서 설치한다.
1.2. MySQL 실행 후 test í…Œì�´ë¸” ì„ íƒ�. ì±…ì�˜ ì˜ˆì œëŒ€ë¡œ users를 ë§Œë“ ë‹¤.
1.3. 책� 소스를 그대로 쳤� 경우 Class.forName("com.mysql.jdbc.Driver"); 문장�서 �러가 나는� �터넷�서 mysql-connector-java-X.X.X.jar 를 받아서 참조 ��브러리� 추가한다.
1.4. Connection c = DriverManager.getConnection(...); 문장ì—�서 ì—�러가 나는ë�° 문ìž�ì—´ì�˜ localhost/springbook 부분ì�„ ìž�ì‹ ì�´ ì‚¬ìš©í• í…Œì�´ë¸”ì�˜ ì�´ë¦„으로 바꾸어 주어야 한다. localhost/test로 바꿔준다. ì�´í›„ì�˜ 문ìž�ì—´ ë‘� 개는 ê°�ê°� ìž�ì‹ ì�˜ MySQL ê³„ì • ì�´ë¦„(기본값 root), MySQL 비밀번호를 ì �어주면 ë�œë‹¤.
1.5. 실행 -> 완료.
- 스프ë§� í”„ë ˆìž„ì›Œí�¬ 사용하기(p.99ì�˜ ì˜ˆì œ)
2.1. ìš°ì„ ì±…ì—�서 외부 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¥¼ ì‚¬ìš©í•˜ê³ ìžˆëŠ”ë�°, STSì—�는 필요한 ë�¼ì�´ë¸ŒëŸ¬ë¦¬ê°€ 들어있지 않ì�€ 것 같다. ì�´ìª½ 페ì�´ì§€(http://www.tutorials4u.net/spring-tutorial/spring_install.html)를 ë³´ê³ ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¥¼ 받아야 한다. 받아서 ì••ì¶•ì�„ í’€ê³ spring-framework-3.0.5.RELEASE/dist í�´ë�”ì—� 있는 jar 파ì�¼ë“¤ì�„ 프로ì �트ì—� í�¬í•¨ì‹œì¼œì£¼ë©´ AnnotationContext, AnnotationConfigApplicationContext, @Configuration, @Bean 등ì�„ ì‚¬ìš©í• ìˆ˜ 있게 ë�œë‹¤.
- Class.forName() ì—�러 í•´ê²°(p.59, 60ì�˜ ì˜ˆì œ 실행).
- 21�� 한 것들
- 배운 것
1.1. DIP : 멤버 변수를 외부ì—�서 주입 ë°›ì�„ 때는 구체 í�´ëž˜ìŠ¤ê°€ 아닌 ì�¸í„°íŽ˜ì�´ìŠ¤ë¥¼ ì�´ìš©í•œë‹¤. 최대한 í�´ëž˜ìФ ë‚´ë¶€ì—�서 변수를 í• ë‹¹í•˜ì§€ ë§�ê³ (new를 사용하지 ë§�ê³ ) 주입ì�„ ë°›ë�„ë¡� 한다.
1.1.1. Context : 스프ë§�ì�€ DI ê¸°ìˆ ì�„ ë§Žì�´ ì‚¬ìš©í•˜ê³ ìžˆëŠ”ë�°, 스프ë§�ì—�서 ê°�ì²´ê°„ì�˜ ì�˜ì¡´ê´€ê³„ 주입ì�„ 코드로부터 분리하는 ì—í• ì�„ Contextê°€ ë‹´ë‹¹í•˜ê³ ìžˆë‹¤.
1.2. 불변ê°�체와 가변ê°�ì²´ : 불변ê°�체는 ìƒ�성ë�œ ì�´í›„ì—� ë‚´ë¶€ì�˜ 필드ì—� 대한 ìˆ˜ì •ìž�ê°€ 없는 ê°�체를 ë§�한다. ë‚´ë¶€ 필드ì—� ì ‘ê·¼ì�´ 불가능하기 때문ì—� ê°’ì�´ 변하지 않는다. ë”°ë�¼ì„œ 한 번 ìƒ�성한 ì�´í›„ì—�는 필요한 ê³³ì—� ê°™ì�€ ê°�체를 ìž¬ì‚¬ìš©í• ìˆ˜ 있다. 가변ê°�체는 ë‚´ë¶€ì�˜ ê°’ì—� ì ‘ê·¼í• ìˆ˜ 있는 메소드를 공하는 ê°�체를 ë§�한다. 가변ê°�체를 불변ê°�체처럼 한 번 ìƒ�성한 후ì—� 여러 ê³³ì—�서 ì‚¬ìš©í• ê²½ìš° 한 ê³³ì—�서만 ê°’ì�´ 바뀌어ë�„ ëª¨ë“ ê°’ì�´ 다 바뀌므로 가변ê°�체는 매번 ì‚¬ìš©í• ë•Œ 마다 새로 ìƒ�성(new)ì�„ í•´ 주어야 한다.
- 해결한 것
2.1. 스프ë§�ì�˜ ConfigurationContext ë‚´ë¶€ì�˜ Beanì—�서 Context를 ìƒ�성해서 DI를 í•˜ë ¤ê³ í–ˆì�„ 때 오류 ë°œìƒ� : Context ë‚´ë¶€ì—�서 Context를 ìƒ�성하는 코드를 사용했기 때문ì—� ìƒ�성ì�´ 재귀ì �으로 ì�´ë£¨ì–´ì ¸ì„œ 무한 반복ë�œë‹¤. ê·¸ë¦¬ê³ ë””ë²„ê·¸ 시 main ì�´ì „ì—� ì—�러가 ì�¼ì–´ë‚¬ëŠ”ë�°, 그것ì�€ 스프ë§�ì�˜ Context는 시작 ì „ì—� Bean들ì�„ ìƒ�성하기 때문ì�´ë‹¤. mainì—� 진입하기 ì�´ì „ì�˜ 스프ë§� 초기화 단계ì—�서 오류가 ì�¼ì–´ë‚¬ë‹¤ëŠ” 얘기.
- 배운 것
7.1.3.1.3. 김수경 ¶
- 지난주� 한 것
- Spring MVC Template Project ìƒ�성하여 ì‹¤í–‰í•´ë³´ë ¤ë‹¤ 실패.
- í† ë¹„ì�˜ 스프ë§� 1.2까지 ì�½ì�Œ.
- Spring MVC Template Project ìƒ�성하여 ì‹¤í–‰í•´ë³´ë ¤ë‹¤ 실패.
- 막혔� 것
- Spring Project를 ìƒ�ì„±í•˜ê³ ì‹¤í–‰í•˜ëŠ”ë�° Tomcat 설치가 필요하여 플러그ì�¸ 설치함.
- Spring Project를 ìƒ�ì„±í•˜ê³ ì‹¤í–‰í•˜ëŠ”ë�° í�¬íŠ¸ê°€ ì�´ë¯¸ 사용중ì�´ë�¼ ë�˜ì§€ 않ì�Œ.
- ì±… 1장ì—�서 Statement와 PreparedStatement를 봤는ë�° ë‘� ê°œì�˜ ì°¨ì�´ì �ì�„ 잘 ëª¨ë¥´ê² ë‹¤.
- Spring Project를 ìƒ�ì„±í•˜ê³ ì‹¤í–‰í•˜ëŠ”ë�° Tomcat 설치가 필요하여 플러그ì�¸ 설치함.
7.1.3.1.6. ì�´ì›�í�¬ ¶
95page framework� 대한 해설.
library와 frameworkì�˜ ì°¨ì�´ì �.
library와 frameworkì�˜ ì°¨ì�´ì �.
- Framework ì œì–´ì�˜ ì—ì „ ê°œë…�ì�´ ì �ìš©ë�œ 대표ì �ì�¸ 기ìˆ
- Framework 와 library가 같�것� 아님
- ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¥¼ 사용하는 ì• í”Œë¦¬ì¼€ì�´ì…˜ 코드는 ì• í”Œë¦¬ì¼€ì�´ì…˜ í��름ì�„ ì§�ì ‘ ì œì–´í•œë‹¤.
- í”„ë ˆìž„ì›Œí�¬ëŠ” 거꾸로 ì• í”Œë¦¬ì¼€ì�´ì…˜ 코드가 í”„ë ˆìž„ì›Œí�¬ì—� ì�˜í•´ 사용ë�œë‹¤.
- Framework 와 library가 같�것� 아님
- ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¥¼ 사용하는 ì• í”Œë¦¬ì¼€ì�´ì…˜ 코드는 ì• í”Œë¦¬ì¼€ì�´ì…˜ í��름ì�„ ì§�ì ‘ ì œì–´í•œë‹¤.
- í”„ë ˆìž„ì›Œí�¬ëŠ” 거꾸로 ì• í”Œë¦¬ì¼€ì�´ì…˜ 코드가 í”„ë ˆìž„ì›Œí�¬ì—� ì�˜í•´ 사용ë�œë‹¤.
7.1.3.1.7. 강소현 ¶
Ioc로 DaoFactory를 만드는 것까지 했습니다 ã… ã…
spring-framework-3.0.5.RELEASE/dist í�´ë�”ì—� 있는 jar 파ì�¼ë“¤ì�„ 프로ì �트ì—� í�¬í•¨ì‹œì¼°ëŠ”ë�°,
ì±…ì—� jar 파ì�¼ 목ë¡�ì—� 있ë�˜ 것 중 org.springframework.~~ ê°€ 아닌 것들ì�´ ë¹ ì ¸ìžˆì–´ì„œ 그런가 아래와 ê°™ì�€ 오류가 나는..
아니면 pom.xmlì—� í�¬í•¨ ì•ˆì‹œí‚¤ê³ , ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¡œ 추가해서 그런 걸지ë�„??
ì±…ì—� jar 파ì�¼ 목ë¡�ì—� 있ë�˜ 것 중 org.springframework.~~ ê°€ 아닌 것들ì�´ ë¹ ì ¸ìžˆì–´ì„œ 그런가 아래와 ê°™ì�€ 오류가 나는..
아니면 pom.xmlì—� í�¬í•¨ ì•ˆì‹œí‚¤ê³ , ë�¼ì�´ë¸ŒëŸ¬ë¦¬ë¡œ 추가해서 그런 걸지ë�„??
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:160)
at org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:213)
at org.springframework.context.support.GenericApplicationContext.<init>(GenericApplicationContext.java:101)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:63)
at springbook.user.dao.UserDaoTest.main(UserDaoTest.java:13)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactoryat org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:213)
at org.springframework.context.support.GenericApplicationContext.<init>(GenericApplicationContext.java:101)
at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:63)
at springbook.user.dao.UserDaoTest.main(UserDaoTest.java:13)
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 5 more
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 5 more










