'작업노트'에 해당되는 글 100건
- 2008.05.29 Context [] startup failed due to previous errors.... 등등;
- 2008.05.28 흠..
- 2008.05.11 미국 드라마 "하우스(HOUSE)" 열혈 관람하다가..
- 2008.04.23 진짜 개발자
- 2008.03.15 SQLinForm - SQL문 정리기
- 2008.02.28 자바 5 에서의 반복자와 컬렉션(for/in 반복문)
- 2008.02.19 The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory 6
- 2008.02.02 전체선택을 위한 자바스크립트 코드
- 2008.01.23 [Spring] BeanFactory와 ApplicationContext
- 2008.01.14 [Spring] AOP(Aspect Oriented Programming), 관점지향 프로그래밍의 이해
2008. 5. 29 오전 10:59:31 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
정보: The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\netville-project\java\jdk1.5.0_15\bin;.;C:\WINDOWS\system32;C:\WINDOWS;C:\netville-project\java\jdk1.5.0_15\jre\bin;C:\netville-project\java\jdk1.5.0_15\bin\..\jre\bin\client;C:\netville-project\java\jdk1.5.0_15\bin\..\jre\bin;C:\netville-project\java\jdk1.5.0_15\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\mysql\bin;D:\ant\bin;C:\Program Files\ESTsoft\ALZip;C:\Java\bin;C:\Program Files\ESTsoft\ALZip
2008. 5. 29 오전 10:59:31 org.apache.coyote.http11.Http11BaseProtocol init
정보: Initializing Coyote HTTP/1.1 on http-8080
2008. 5. 29 오전 10:59:31 org.apache.catalina.startup.Catalina load
정보: Initialization processed in 1953 ms
2008. 5. 29 오전 10:59:32 org.apache.catalina.core.StandardService start
정보: Starting service Catalina
2008. 5. 29 오전 10:59:32 org.apache.catalina.core.StandardEngine start
정보: Starting Servlet Engine: Apache Tomcat/5.5.26
2008. 5. 29 오전 10:59:32 org.apache.catalina.core.StandardHost start
정보: XML validation disabled
log4j:WARN No appenders could be found for logger (org.apache.catalina.startup.TldConfig).
log4j:WARN Please initialize the log4j system properly.
2008. 5. 29 오전 10:59:35 org.apache.catalina.core.StandardContext start
심각: Error listenerStart
2008. 5. 29 오전 10:59:35 org.apache.catalina.core.StandardContext start
심각: Context [/club2] startup failed due to previous errors
2008. 5. 29 오전 10:59:36 org.apache.catalina.startup.ContextConfig processDefaultWebConfig
심각: Parse error in default web.xml
java.lang.NullPointerException
at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1094)
at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562)
at org.apache.catalina.startup.ContextConfig.processDefaultWebConfig(ContextConfig.java:677)
at org.apache.catalina.startup.ContextConfig.defaultWebConfig(ContextConfig.java:614)
at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1043)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4148)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:448)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
2008. 5. 29 오전 10:59:36 org.apache.catalina.startup.ContextConfig applicationWebConfig
심각: Parse error in application web.xml file at jndi:/localhost/WEB-INF/web.xml
java.lang.NullPointerException
at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1094)
at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1562)
at org.apache.catalina.startup.ContextConfig.applicationWebConfig(ContextConfig.java:352)
at org.apache.catalina.startup.ContextConfig.start(ContextConfig.java:1044)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:261)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4148)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:448)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
2008. 5. 29 오전 10:59:36 org.apache.catalina.startup.ContextConfig start
심각: Marking this application unavailable due to previous error(s)
2008. 5. 29 오전 10:59:36 org.apache.catalina.core.StandardContext start
심각: Error getConfigured
2008. 5. 29 오전 10:59:36 org.apache.catalina.core.StandardContext start
심각: Context [] startup failed due to previous errors
2008. 5. 29 오전 10:59:36 org.apache.coyote.http11.Http11BaseProtocol start
정보: Starting Coyote HTTP/1.1 on http-8080
2008. 5. 29 오전 10:59:36 org.apache.jk.common.ChannelSocket init
정보: JK: ajp13 listening on /0.0.0.0:8009
2008. 5. 29 오전 10:59:37 org.apache.jk.server.JkMain start
정보: Jk running ID=0 time=0/156 config=null
2008. 5. 29 오전 10:59:37 org.apache.catalina.storeconfig.StoreLoader load
정보: Find registry server-registry.xml at classpath resource
2008. 5. 29 오전 10:59:37 org.apache.catalina.startup.Catalina start
정보: Server startup in 5891 ms
회사의 권장내용대로 이클립스를 다시 깔고 새롭게 프로젝트를 checkout 받았는데
위와같은 에러가 났고, 살짝 헤맨끝에 찾아낸 사실은
JRE가 unbounded되있었다....
그렇다.. 체크아웃 받은 프로젝트는 "jre1.5.0_15" 라는 이름으로 정의되있었는데
새로운 환경에는 같은 이름의 JRE가 정의 되지 않았기 unbounded된 것이다.
아래 그림처럼 JRE를 Add하여 Location을 잡아주어 해결하였다.
이 글은 스프링노트에서 작성되었습니다.
'작업노트 > Error Handling' 카테고리의 다른 글
[Oracle] ORA-01461: can bind a LONG value only for insert into a LONG column (0) | 2008.08.07 |
---|---|
[iBatis]UncategorizedSQLException (0) | 2008.07.07 |
The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory (6) | 2008.02.19 |
[Eclipse] JVM terminated. Exit code=-1 ....................................... (3) | 2007.12.23 |
[JNDI] NamingException (0) | 2007.12.22 |
회사에서 업무를 진행하다 예상치 못한 어려움이 발생했을경우,
짜증내며 입을 닫아버리게 되면,
그 짜증은 동료에게 전파되어 분위기를 하강시킨다.
갑작스런 짜증도 함께 즐길 수 있도록
포용력을 키워야 겠다.
적어도 나는,
그렇게 하겠다.
'작업노트 > Developer's Diary' 카테고리의 다른 글
OOAD가 끝나갈때 쯔음해서.. (0) | 2008.07.25 |
---|---|
아키텍처... (0) | 2008.07.16 |
미국 드라마 "하우스(HOUSE)" 열혈 관람하다가.. (0) | 2008.05.11 |
진짜 개발자 (0) | 2008.04.23 |
버전을 항상 주의합시다. (0) | 2008.01.07 |
주인공 그레고리 하우스는 진단의학이라는 걸 하는 천재 의사인데 성격이 까칠하기 그지없고, 후배에게 칭찬을 하는 법이 없다. 단지 자신이 맡은 환자에 대한 집착만이 대단한 그런.. 그 집착때문에 모든 환자들을 살려내기는 하지만ㅎ
진단의학이라는 건, 원인을 알기 힘든 증상을 보이는 환자들을 대상으로 병의 원인을 찾아내고 치료하는 의학이라고 한다.(우리나라에서는 찾아 보기 힘들다고..). 하우스는 평범한 환자들은 맡으려 하지 않지만, 일단 자신이 흥미를 갖게 되면 어떻게든 살리기 위해 애를 쓴다. 그에게 있어서 포기란 없는 듯하다. 아마도 과거의 어떤 큰 상처가 그를 그렇게 만든 듯한데, 어떤 상처인지 궁금하다.(절름발이 이고 아내와 이혼했다는게 힌트인 듯한데.. ㅎ)
하우스가 나에게 흥미를 주는 이유는... 질병의 원인을 찾아 내는 과정이 마치 디버깅을 하는 과정과 비슷하기 때문이다. 하우스와 동료들이 한 환자에 대해서 분석하는 과정을 지켜보다 보면, 배울점이 참 많다. 내가 잘 못하는 것이기 때문에...
그리고, 하우스는 질병만을 꽤뚫어 보는 것이 아니라 사람의 내면까지 꽤뚫어 본다. 사람이라는 것들에게 회의를 느끼지만 그 누구보다도 사람에 대해 관심이 많고 그만큼 많이 알고 사랑하는 것 같다. 무엇이 그를 그렇게 만들었는지는 모르지만.. 마음만은 정말 따뜻하다는게 느껴진다.(배우가 연기를 잘해서 그렇겠지 ㅎ)
명대사들 또한 일품이다.
드라마속 얼짱 캐머론양이 저렇게 표정이 삽시간에 변한 것은 역시나 그레고리 때문.
포어맨이
"결국 캐머론이 처음에 말한대로 였다"
라고 하자 하우스는
"그래 맞아. 정말 잘했어"
그러자 캐머론은 급 방긋~♡
하지만 하우스의 후속타
"하지만 자신의 진단에 확신을 가지고 주장하지 않았기 때문에 환자를 죽일뻔 했어. 포어맨에게 한 수 배워 자신의 신념을 끝까지 주장하라고"
프로그램 개발도 비슷하지 않을까? 옳은 것을 자신있게 주장하지 않고, 남의 뜻에 따르기만 한다면, 작업하는 내내 불만만 쌓일 것이다. 프로젝트가 엉망이 되가는 걸 보면서. 의사의 잘못된 진단은 환자를 죽인다. 그만큼 급박하진 않지만, 설계, 기획이 잘 못되면 프로젝트도 산으로 가게 되는 것 같다.
자신의 주장을 자신있게 펼칠려면 공부할때 하나하나 확실히 해두고 넘어가야할 것이다. 그동안 나는 조바심이 나서 그냥 훑고 지나가는 버릇이 있었는데, 앞으로는 뭐든 확실히 해야 하겠다. 프로그래머인데 프로그래밍에 자신을 가져야되지 않겠나 ㅎ
아무튼 많은걸 느끼게 해주는 드라마이다. 인간의 본성에 대해서 많이 알게 되는.. 근데 시즌 3까지 언제 다보지? -_-;;
'작업노트 > Developer's Diary' 카테고리의 다른 글
OOAD가 끝나갈때 쯔음해서.. (0) | 2008.07.25 |
---|---|
아키텍처... (0) | 2008.07.16 |
흠.. (0) | 2008.05.28 |
진짜 개발자 (0) | 2008.04.23 |
버전을 항상 주의합시다. (0) | 2008.01.07 |
학교에서 컴퓨터를 전공하고 온 사람도 있고, 다른 걸 전공하고 혹은 다른 일은 하다가
실무 교육을 수료하고 온 사람도 꽤 많다. 전자든 후자든, 하고 싶어서 하는 사람도 있고
억지로 하는 사람도 있다. 전공이냐 아니냐를 비교하기보다는.. 의외로,
정말 의외로 개발을 하고 싶어서 하는 사람들을 찾기가 힘들었다.
실력을 따지려는게 아니다. 적어도 개발자게 되겠다고 다짐을 한 사람이라면,
즐기려고 노력해야되지 않나? 나도 개발이 즐거워서 하는 게 아니다. 정말 즐거워서 한없이
웃음지으며 개발하는 사람이 있으려나? 그런 정신나간 사람이 개발자 가운데 몇 퍼센트나 될까?
오늘 회사 선배와 '왜 개발자가 되었는가'에 대해ㅎ 짧막한 대화를 나누었다. 그중 한토막..
선배왈, "진짜 개발자가 되고 싶었는데.."
나, "진짜 개발자란게 어떤 거죠?"
선배왈, "API따위를 다루는....."
아마도 선배는 어쩌다 보니 툭하고 나온 말일 것이다. 하지만, 아니땐 굴뚝에 연기 날리 없고
저런 생각을 가진 사람이 얼마든지 있을 가능성이 있다고 생각하니 약간 심기가 불편해졌다.
C++처럼 어렵고 시스템적인 깊숙한 부분을 건드려야 진짜 개발이고,
웹은 쉬우니까 가짜 개발인가?(웹이 쉽긴 머가 쉬워 썅;;)
진짜 개발자와 가짜 개발자를 구분짓는 것은..(만약 그렇게 나눠본다면 말이다..),
무엇을 만드느냐, 얼마나 대단한걸 만들어 내느냐에 따라 가늠되는 것이 아니라,
어떤 마인드로 개발을 하느냐, 얼마나 자신의 잡에 자부심을 갖고 일하느냐,
진짜 개발자가 되기 위해(만약 그런게 있다면) 스스로 얼마나 노력했느냐에
그 기준이 있어야 하는 것 아닌가?
MS에 들어가서 "아, 신발스럽네 언제까지 이짓거릴 해야되지?"라는 마인드로
개발하는 사람보다, 조그만 모바일업체에서라도 "나는 이 컨텐츠로 자라나는 어린이들에게 꿈과
희망을 주고 밝은 사회를 만드는데 힘쓸거야" 라고 생각하면서;; 개발하는 사람이 훨씬
'진짜 개발자'에 가깝다고 생각한다. 나는 졸업하기전 몇년간 혼자 스스로 수없이 되물었다.
"니가 진짜로 원하는게 뭐야?"
어느날 크래쉬의 노래를 듣다가 머리가 띵했고, 리플레이하면서 계속 생각했다.
당장 답이 안나왔다.. 노래 가사처럼 이나이를 처먹도록 그걸 하나 모르는게 부끄러웠다.
그후 몇년동안 계속 생각했고, 결국은 찾았다...
나는 웹이 즐겁다. 웹을 통해 사람들이 소통한다는게 너무나도 좋다.
그렇게 이 세상이 하나로 묶이는게 너무나도 아름답고, 나도 그것을 위해 평생 일하고 싶다.
"Beauty is our business." 다익스트라가 한 말이다.
이정도 자부심은 있어야 진짜 개발자라고 할 수 있지.
나는 정말 실력 쥐뿔도 없는 녀석이지만,
자부심 하나로 즐겁게 개발하며 진짜 개발자가 되기위해 살지어다.
'작업노트 > Developer's Diary' 카테고리의 다른 글
OOAD가 끝나갈때 쯔음해서.. (0) | 2008.07.25 |
---|---|
아키텍처... (0) | 2008.07.16 |
흠.. (0) | 2008.05.28 |
미국 드라마 "하우스(HOUSE)" 열혈 관람하다가.. (0) | 2008.05.11 |
버전을 항상 주의합시다. (0) | 2008.01.07 |
어떻게 써야 보기 좋을까 띄어쓰기 하랴 엔터키 치랴...
이런데 쓰는 시간만 합쳐도 꽤 될것 같다.
요즘 하드코딩된 sql문을 보기좋게 해서 xml로 빼내는
완전 단순 노가다;; 작업을 하고 있는데,
다행히도 sql 포맷터가 있었다.
포맷터에도 종류가 여러가지인데, 회사분이 추천해준 SQLinForm 이란 걸 쓰기로 했다.
온라인 버전과 데스크탑 버전이 있는데(데스크탑버전은 올해 새로나온듯)
데스크탑 버전이 좀더 편리 할 것 같다.
SQLinForm사이트 에 가서 좌측 상단에
'Desktop Version 2008' 을 클릭하면 다운 받을 수 있다.
jar파일로 되있는데 JRE(자바실행환경)가 깔려있어야 실행가능하다.
안그러면 압축파일이라서 알집등으로 열릴 수 있다.;
'작업노트 > etc.' 카테고리의 다른 글
[펌] 2년차 개발자가 알아야 할 기본 지식 (0) | 2009.01.15 |
---|---|
파이어폭스(firefox)에서의 새로고침 (1) | 2008.12.26 |
[퍼온 글] 서울특별시의회 전자회의시스템 프로젝트 프로그램 개발자 폭행사건 (0) | 2008.10.28 |
호오 쓸만한 녀석 일세 (0) | 2008.06.13 |
리틀 엔디안 (Little-Endian) / 빅 엔디안 (Big-Endian) (0) | 2007.11.19 |
디자인 패턴 책을 보던 중 새로운 사실을 알게 되었다.
for/in이라는 선언문이 자바 5 부터 추가되었다는 내용이다.
for/in 선언문은 collection 류의 객체들과 배열에 대해서
편리하게 순환문(반복문)을 돌릴 수 있게 해준다.
형식은 다음과 같다.
for(Object obj: collection) {
...
}
단, 컬렉션은 제네릭을 사용하여 어떤 객체를 담는 컬렉션인지 명시해야한다.
ArrayList<Movie> movieList = (ArrayList<Movie>)getMovieList();
for(Movie movie: movieList) {System.out.println("Movie Name is : " + movie.getName() );
}
이런 식으로 말이다.
예전 C#을 잠깐 공부할때 유사한 문법을 본적있는데 역시 자바에도 존재하였다.
좀 더 편리하게 코딩을 할 수 있을 듯.
'작업노트 > JAVA' 카테고리의 다른 글
Java TimeZone 관련 링크 (0) | 2009.07.17 |
---|---|
CSV파일 (0) | 2009.03.02 |
Java API Map (0) | 2008.01.05 |
JVM 메모리구조와 스택 - 참조 ^^ (0) | 2007.11.19 |
자바에서 swap 구현하기 (0) | 2007.11.19 |
The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
| 작업노트/Error Handling 2008. 2. 19. 15:53HTTP Status 500 -
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 22 in the generated java file The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory Stacktrace: org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:92) org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330) org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:423) org.apache.jasper.compiler.Compiler.compile(Compiler.java:308) org.apache.jasper.compiler.Compiler.compile(Compiler.java:286) org.apache.jasper.compiler.Compiler.compile(Compiler.java:273) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266) javax.servlet.http.HttpServlet.service(HttpServlet.java:803) netville.servlet.filter.EncodingFilter.doFilter(EncodingFilter.java:53)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.
servlet-api.jar의 버전이 안맞아 jsp파일을 컴파일 시키지 못해서
(또는 컴파일이 된곳을 찾지 못하여)
발생하는 에러인 듯하다.(정확히 아는 분이 계시면 말씀 바람.)
확인은 안해봤지만, Tomcat6이상에서만 나는 듯하다.
jdk 5.0을 C드라이브 루트 폴더에 다시 설치하고 컴퓨터 환경변수에서 JAVA_HOME을 변경된 경로로 수정하고, 이클립스의 Preferences ->java->installed JREs 에서 새로운 jdk의 경로로 location을 잡은 후 실행시키니 잘 돌아간다..
(필요없는 환경변수는 다 지웠다. 오로지 JAVA_HOME만 남겨둔채..
이클립스로 개발만 할 때에는 다른 환경변수는 필요치 않다.)
환경변수 설정할때 경로에 빈공간(Space)가 들어가면 문제가 발생할 수도 있다고 한다..
이전 JAVA_HOME의 경로는 'Program Files' 안에 있었는데,
그게 문제 인건지도 모르겠다.
* 잘못된 내용 태클 환영입니다.
이 글은 스프링노트에서 작성되었습니다.
'작업노트 > Error Handling' 카테고리의 다른 글
[iBatis]UncategorizedSQLException (0) | 2008.07.07 |
---|---|
Context [] startup failed due to previous errors.... 등등; (0) | 2008.05.29 |
[Eclipse] JVM terminated. Exit code=-1 ....................................... (3) | 2007.12.23 |
[JNDI] NamingException (0) | 2007.12.22 |
[Eclipse] Resource is out of sync with the file system : ... (1) | 2007.12.18 |
<script type="text/javascript">
function select_all() {
var all = document.getElementById("selectAll");
var list = document.getElementsByName("checkList[]");
if(!all.checked) {//전체선택 체크박스가 해제되었다면
for(var i = 0; i <= list .length - 1 ; i++) {//모든 체크박스를 체크해제
list[i].checked = false;
}
} else { //그게 아니라면
for(var i = 0; i <= list .length - 1 ; i++) {
list [i].checked = true;//모든 체크박스를 체크
}
}
}
</script>
.......................................
<tr>
<td>
<input type="checkbox" name="selectAll" onClick="select_all()">
</td>
</tr>
<tr>
<td>
<input type="checkbox" name="checkList[]" value="딸기">
<input type="checkbox" name="checkList[]" value="사과">
<input type="checkbox" name="checkList[]" value="배">
<input type="checkbox" name="checkList[]" value="귤">
<!-- 자바 struts 사용시 ActionForm에서 array로 받으려면 '[]' 이녀석을 꼭 붙여줘야 한다.-->
</td>
<tr>
....................................
원래 코드에서 수정하고 테스트는 안해보았음.
'작업노트 > HTML & Script' 카테고리의 다른 글
[Ajax] innerHTML 삽입시 (0) | 2008.10.30 |
---|---|
프레임구조에서 전체화면에 링크 반영하기 (0) | 2008.08.26 |
아이프레임 리사이즈 문제 해법 (0) | 2008.01.05 |
name과 id의 차이 (0) | 2007.09.15 |
GET방식으로 한글 보내는 방법 (0) | 2007.09.04 |
스프링 프레임워크는 IoC를 사용해 컴포넌트들을 관리한다. 컴포넌트간의 연관관계 등을 관리함으로써 객체를 명확하게 이해하고, 재사용이 가능하며, 단위테스트가 쉬워진다. 스프링은 이러한 컨테이너를 두가지 포함하고 있는데, 빈 팩토리와 애플리케이션 컨텍스트가 그것이다.
빈 팩토리는 기본적인 의존성 주입을 지원하는 가장 간단한 형태의 컨테이너이다.
애플리케이션 컨텍스트는 빈 팩토리의 개념 위에 프로퍼티 파일을 해석하고 이벤트를 발행하는 등의 능력이 구현된 것으로, 대부분의 경우 애플리케이션 컨텍스트를 많이 사용한다.
빈 팩토리는 org.springframework.beans.factory.BeanFactory 인터페이스로 정의 되고, 스프링 안에 많은 구현 클래스들이 존재한다. 그중 org.springframework.beans.factory.xml.XmlBeanFactory 가 가장 유용하다. 사용법은 아래와 같다.
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
이 코드는 빈에 대한 정의만 읽어올 뿐 인스턴스화 하지는 않는다. 빈 자체가 필요하게 되기 전까지 인스턴스화 하지 않는데, 이를 "늦게 로딩(lazy loading)"된다고 말한다.
빈을 얻어오기 위해서는 다음과 같이 코드를 작성한다.
MyBean myBean = (MyBean) factory.getBean("myBean");
getBean()에 의해 팩토리는 의존성 주입을 통해 빈을 인스턴스화 한다.
애플리케이션 컨텍스트는 org.springframework.context.ApplicationContext 인터페이스로 정의되고, 구현 클래스들 중 일반적으로 사용되는 세 개는 다음과 같다.
ClassPathXmlApplicatoinContext : 클래스 경로에 있는 xml파일로부터 로딩
예) ApplicationContext context = new ClassPathXmlApplicatoinContext("c:/config.xml");
FileSystemXmlApplicationContext : 파일 시스템에 있는 xml파일로부터 로딩
예) ApplicationContext context = new FileSystemXmlApplicationContext("config.xml");
XmlWebApplicationContext : 웹 애플리케이션에 포함되있는데 xml파일로부터 로딩
애플리케이션 컨텍스트는 싱글톤 방식으로 빈을 관리한다. 즉 컨텍스트를 시작시킬 때 모든 빈 들을 미리 로딩한다. 싱글톤 빈을 미리 로딩함으로써, 그 빈이 필요할 때 즉시 사용될 수 있도록 해준다.
이 글은 스프링노트에서 작성되었습니다.
'작업노트 > Framework' 카테고리의 다른 글
[Struts2] radio 태그에서 선택값 유지시키기 (0) | 2009.07.17 |
---|---|
[Spring] org.springframework.scheduling.quartz.CronTriggerBean (0) | 2008.11.05 |
[Spring] AOP(Aspect Oriented Programming), 관점지향 프로그래밍의 이해 (0) | 2008.01.14 |
[Struts] Action 에서 포워딩 시 parameter 넘기는 법 (0) | 2008.01.14 |
[Spring] IoC(Inversion of Controll), 역행 제어의 개념 (0) | 2008.01.12 |
관점지향 프로그래밍.
정말 지친다, 지쳐.
왜 이렇게 용어를 어렵게 만들어놨는지..;
각설하고
관점지향 프로그래밍 역시 별거 아니였다(라고 말할 수 있는 입장은 아니지만;)
나같은 초보 분들께 드리고 싶은 말은.. 용어의 압박감으로부터 벗어나라!(머 이런 뜻이였음.)
관점을 지향한다... 여기서 관점은.. 스프링에서의 관점은 글쎄... 시점이라는 표현이 더 적절치 않나 싶다.
어떤 '시점'에서 Aspect들이 실행되야 하는지가 중요한 관건인것 같아서이다.
(관점이라는 말은 보편적으로 '사물을 보는 시각' 따위로 쓰이는데 관점지향.. 이해만 어려워진것 같다.)
에스펙트는 '스프링인액션'의 번역본에 따르면 횡단 관심사의 기능이라고 되어있다...
(정말... 용어들이 갈수록 과관이다..횡단;; 관심사라;;;)
요점 부터 말하자면;;; AOP는 개발자가 비즈니스 로직에만 집중할 수 있도록
기타 시스템에 관한 서비스(로깅이나 트랜잭션 관리)들을 분리해 놓는 것이다.
즉, 여러 영역에서 '중복'될 수 있는 시스템 관련 코드들을 한곳에서 관리하여 중복도 줄이고
더이상 로직구현이 아닌 부분에 대해서는 개발자가 신경을 쓰지 않도록 하는 것이 취지이다.
(정말 필요하다. 웹 플밍으로 전향하고서 느낀 점인데.. 이 쪽은,
실제 프로그래밍 보다 '기타등등(계층간 설정, 버전 궁합 등)'들에 더 많이 신경써야하는 것 같다..)
다시 쉽게 말해서 로깅 같은 것들을 따로 로그 클래스로 만들어서,
메소드의 시작 전에 호출을 할지 메소드 후에 실행시킬지,
아니면 두번 다 실행시킬지 등등을 xml 설정으로 쉽게 관리 할 수 있게 해주는 것이다.. IoC 개념으로 말이다.
(그래서 시점지향이라고 하는게 맞지 않나..싶다. 왜 관점이어야 하는지 아시는 분은 답글 부탁드림.)
(다음은 AOP관련 용어 설명)
여기에서 로깅(로그를 하는 행위, 기능)이 aspect이고 로그 클래스(실제 구현물)가 advice(충고)이다.
그리고 '애스펙트'를 집어넣을 수 있는 지점들, 즉 메소드, 예외 등이 joinpoint(결합점)가 되고,
실제로 '결합점' 중에서 한 곳에 '충고'를 적용시키면, 그곳이 pointcut(교차점)이 된다.
target(대상)이란 '충고'를 받는 클래스, 즉 pointcut을 포함하는 클래스를 '충고'의 target이라고 말하고
proxy(프록시)는 '대상' 객체에 '충고'가 적용된 후 생성되는 객체를 말한다.
또한 기존의 클래스에 새로운 메소드나 속성을 추가할 수 도 있는데 이는 introduction(도입)이라 부른다.
weaving(엮기)는 애스펙트를 타겟에 적용하여 새로운 프록시 객체를 생성하는 과정이다.
이 '엮기'는 런타임시 어떤 시점에 '엮이게' 하는 것이 일반적이고,
컴파일시, 클래스 로딩시에 '엮을' 수도 있는데 이런 경우 각각 특수 컴파일러와 특수 ClassLoader가 필요하다.
(헥헥..)
그렇다면 cross-cutting concern(횡단 관심사)란 무엇이냐.. 다음 그림이 크로스 커팅 컨썬이다.-_-
(여기서 또 횡단 관심사의 '관심사'가 왜 '관심사'여야 하는지 모르겠다. 그냥 횡단 기능 등이라고 했으면 이해가 더 쉬웠을텐데..
초짜들에게 혼란만 가중시키는 잘못된 역이 아닌가 싶다. 너무 직역을 해야한다는 압박감을 가진 모양이다. 역자님께서..
혹시 '관심사' 여야 하는 이유를 아시는 분은-_- 댓글부탁.)
코스와 학생, Misc(??) 의 각각의 영역에서 모듈들이 서비스를 제공할때,
이 모듈들은 보안기능 또는 트랜잭션등을 포함하고 있다 치면,
이런 것들은 공통적으로 사용되는 기능들일 것이다.
이론 공통적인 부분을 재사용하기 위해 일반적인 객체 지향 기법으로는 상속이나 위임으로 해결할 수 있는데,
상속을 하게 되면, 객체의 계층도가 무너지고,
(생각해보라. 다이어그램을 그리는데 전혀 관계없는 객체들이 곳곳에서 한 클래스를 상속하면..;)
위임을 사용하면 번거로워 지며, 위임한 객체에 대한 중복 호출을 필요로 한다.
그래서 AOP를 사용하는 것이다.
AOP를 적용하면 공통 기능을 한 곳에서 정의할 수 있고 그런 기능을 어디에 어떻게 적용할 것인지를 선언적으로 정의할 수 있다.
이 글은 스프링노트에서 작성되었습니다.
'작업노트 > Framework' 카테고리의 다른 글
[Spring] org.springframework.scheduling.quartz.CronTriggerBean (0) | 2008.11.05 |
---|---|
[Spring] BeanFactory와 ApplicationContext (0) | 2008.01.23 |
[Struts] Action 에서 포워딩 시 parameter 넘기는 법 (0) | 2008.01.14 |
[Spring] IoC(Inversion of Controll), 역행 제어의 개념 (0) | 2008.01.12 |
Struts 파일 업로드 유틸 사용시 한글 파일명 깨짐 문제 (0) | 2007.09.04 |