전자정부 표준 프레임워크
전자정부 표준 프레임워크
- 위키피디아
- 사이트 : http://www.egovframe.go.kr/
- 메뉴얼
- http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/pdf/spring-framework-reference.pdf
- http://www.mkyong.com/spring-mvc/spring-mvc-hello-world-example/
- http://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rtea2.6
-
스프링 버전이 낮음에 주의(현재 3.0.5인데 문서는 2.5.6)
- Mysql 설정관련
- src/main/resources/globals.properties
#mysql
Globals.DriverClassName=net.sf.log4jdbc.DriverSpy
Globals.Url=jdbc:mysql://127.0.0.1:3306/egov?useUnicode=true&characterEncoding=UTF-8
#Globals.Url=jdbc:mysql://127.0.0.1:3306/egov -
QnA뒤져봐도 관련 내용 없다.
JDBC 연결 URI에서 인코딩 지정해주면 됨. - web.xml
- bean 설정 XML파일 설정 부분.
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:egovframework/spring/com/context-.xml</param-value>
</context-param> - classpath* : 모든 클래스 패스를 의미한다.
- context-*.xml : “context-“로 시작하고 “.xml”로 끝나는 파일의 의미한다.
- 클래스 패스속 egovframework/spring/com/ 안에 context- 로 시작하는 모든 xml파일을 넣어두면 된다.
그러면 알아서 bean 들이 설정될 것이다. - 이클립스에서는 /src/main/resources 속에 egovframework/spring/com/ 라는 폴더를 의미한다.
-
주의, 이클립스에서 해당 폴더를 Build Path에 넣어두어야 할 것이다.
- 설정 찾는법
- xml찾기
- web.xml 속에서 관련 태그를 뒤져봐라.
- <context-param>, <servlet> (이 두곳에서만 설정된다.)
-
*로 설정되어있을 수도 있다.
- 스프링 디스패처 관련 xml 위치 : /src/main/webapp/WEB-INF/config/egovframework/springmvc
-
그외 스프링 xml위치 : /src/main/resources/egovframework/spring/com
- server.xml
- 톰캣의 설정파일
- 이클립스에서 Run as -> Run on Server -> 서버 프로젝트 선택 -> 적용할 피로젝트를 add, remove -> 이렇게하면 자동으로 server.xml이 변경된다.
-
<Context docBase=”com_test” path=”/com_test” reloadable=”true” source=”org.eclipse.jst.j2ee.server:com_test”/>
이런 구문이 추가되어있을 것이다. -
이 파일의 Context로 추가되어있어야 톰캣 동작시 보인다.
- 어노테이션
- JAVA 5+ 지원, 스프링 프레임 워크 2.5 부터 지원
-
현재 2014-02-21 전자정부 표줌 프레임 쿼크는 스프링 F/W 버전이 3.0
- Spring Annotation - @Required, @Autowired, @Qualifier, @Resource
- 스프링 프레임워크
- 버전 2.5 이상이서는 xml로 서블릿 설정등이 필요 없다. 어노테이션으로 설정하면 됨.
- dispatcher-servlet.xml
<context:component-scan base-package=”egovframework,temp.example”>
<context:include-filter type=”annotation” expression=”org.springframework.stereotype.Controller”/>
<context:exclude-filter type=”annotation” expression=”org.springframework.stereotype.Service”/>
<context:exclude-filter type=”annotation” expression=”org.springframework.stereotype.Repository”/>
</context:component-scan>
/src/main/resources/egovframework/spring/context-common.xml
<context:component-scan base-package=”egovframework,temp.example”>
<context:exclude-filter type=”annotation” expression=”org.springframework.stereotype.Controller” />
</context:component-scan>
- base-package=”egovframework,temp.example”
,를 구분으로 기본으로 어노테이션으로 설정해서 읽어드릴 패키지를 설정한다.
안하면 새로만든 패키지가 동작 안할 것이다.
톰캣 재시작해야함. -
context-common.xml 에서 추가 안할 경우 @Service, @Repository 등이 처리 안되더라.
그렇게 따지면 dispatcher-servlet.xml 에서 exclunde 를 빼버리는게 더 좋지 않나?(서블릿 전용이라서 뺀건가?) -
관련에러
2014-02-25 14:40:05,014 WARN [org.springframework.web.servlet.PageNotFound] **No mapping found for HTTP request with URI **[/testP01/test/list.do] in DispatcherServlet with name ‘action’ - iBATIS
- 설정파일
- /testProject/src/main/resources/egovframework/egovProps/globals.properties
- context-datasource.xml , context-sqlMap.xml 에서 사용됨.
-
${Globals.DbType}와 같은 표현이 XML파일에서 가능하도록해서 사용함.
- /testProject/src/main/resources/egovframework/spring/com/context-datasource.xml
-
DB소스 Bean 설정
- /testProject/src/main/resources/egovframework/spring/com/context-sqlMap.xml
- SQL-Map 설정
-
<property name=”dataSource” ref=”egov.dataSource”/>로 DB소스 설정함.(context-datasource.xml 파일 참고)
- /src/main/resources/egovframework/sqlmap/config/mysql/sql-map-config-*.xml
-
SQL-MAP 설정. 필수는 아니다. 밑에 적힌 sql-map-*.xml 파일을 리소스로 지정한다. (egov 에서는 DB별 처리 때문에 따로 해놓은 것이다.)
- /testProject/src/main/resources/egovframework/sqlmap/com//sql-map-.xml
-
실제 사용 SQLMAP 설정 XML
- 쿼리 리턴값 (링크)
- select() : resultMap
- insert()
- 성공 : 자동증가 PK값, 또는 null
-
DB에 따라 XML부분 수정 필요
-
실패 : 에러발생
- delete(), update()
- 성공 : 적용된 ROW수
-
실패 : 0
- 약어
- VO : Value Object
-
Model, View 간의 데이터 전달용도, getter,setter 메소드 (설명링크)
- DAO : Data Access Object
- JSP와 DB사용의 중간 역활
-
저장, 검색 담당. view와 비지니스 분리
- 톰캣
- GET방식에서 한글이 깨질 때
- 사용 JSP에서는
<%@ page language=”java” contentType=”text/html; charset=utf-8” pageEncoding=”utf-8”%>
라고 적어주고. -
server.xml 에서
<Connector connectionTimeout=”20000” port=”8080” protocol=”HTTP/1.1” redirectPort=”8443” URIEncoding=”utf-8”/>
추가 부분 URIEncoding=”utf-8” (JSP의 pageEncoding에 맞춰 수정 필요)
모든 Connector 에 대해서 적어줘야할 듯 - 기본 클래스 동작 구조
- @Controller
TempController - @Service(“tempService”)
TempServiceImpl extends AbstractServiceImpl implements TempService //컨트롤에서 불러 사용, 내부적으로 TempDAO 를 호출 - @Repository
TempDAO extends EgovAbstractDAO //실제 DB동작 -
TempServiceImpl 와 TempDAO 를 합쳐도 되지 않을까?
-
TempVO implements Serializable //Value Object , DB 결과,검색 관련으로 사용
- 클래스 제작 순서
- DAO -> Service -> ServiceImpl -> Controller
- Controller 를 맨 처음에 껍데기로만 만들어도 상관은 없다.
하지만 DAO를 초반에 만들어 두는게 에러체크하기도 쉽고, JUnit 로 테스트하기에도 좋다.(나머지 클래스는 전부 그냥 가져다 쓰는 것 뿐이라서…) -
순서가 다르면 계속 수정할 때 실동작없이 만들어져서 에러잡기 힘들더라…
- log4j
- protected final Log logger = LogFactory.getLog(getClass()); //로그객채 선언
- #사용법
logger.debug(resultVO);
logger.warn(“테스트”); - log4j.xml
- #패키기 기준으로 설정.
<logger name=”temp.example” additivity=”false”>
<level value=”DEBUG” />
<appender-ref ref=”console” />
</logger> -
#기본 로그 설정
<root>
<level value=”OFF” />
<appender-ref ref=”console” />
</root> - JUnit4
- 명칭법 : 클래스명 뒤에 Test를 붙인다.
-
TempDAOTest 등으로
- //DAO를 테스트할 때 사용한 클래스 어노테이션
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {“classpath:egovframework/spring/context-.xml”}) //xml을 읽어서 BEAN 으로 처리해준다.
@TransactionConfiguration(transactionManager = “txManager”, defaultRollback = false) //뭔지 모르겠다.
@Transactional
//에러에서 XML위치를 못 잡는 경우가 있다. Ron Configurations 에서 Classpath부분을 손봐라. 에러에 맞춰서 보고, war등을 추가하니깐 되더라. - @Before
-
유닛테스트 전 초기화 처리
- @Test
- 테스트로 자동으로 호출한다.
-
문제는 @Test가 여러개일 경우 순서이 힘들다.
Junit 버전에 따라서 방법이 조금씩 다름.
그래서 그냥
@Test는 하나 지정 후 안에서 다시 순서대로 테스트 메소드 호출하도록 하였음. - DAO CLASS 정도에서만 사용하면 될것 같다.
- assertTrue() 메소드를 기본으로 assertNull, assertNotNull, assertEmpty 등을 사용하면 된다.
-
이 메소드에서 false처리가 되면 예외를 발생시키고 보여주게 된다.
- 에러 확인
-
Console 창에 동작 내용(DEBUG,INFO)과 함께 ERROR 등을 보여준다.
에러의 첫 문장에서 가장 끝 부분 부터 봐라.(JAVA의 에러는 가장 안쪽에서 위로 올라가면서 표현되기 때문에)
끝에있는 내용에 따라 조취를 취하면서 하나씩 제거해 나가면 된다. - error.jsp
-
<%@ page isErrorPage=”true” import=”java.io.*”%>
… - <c:set var=”exception” value=”${requestScope[‘javax.servlet.error.exception’]}”/>
- ${exception}
- <p>cause: ${exception.cause} </p>
- <p>Message: ${exception.message} </p>
- <!– Stack trace –>
- <jsp:scriptlet>
- exception.printStackTrace(new java.io.PrintWriter(out));
- </jsp:scriptlet>
전자전부 표준 프레임 워크
게시판 부분 분석 EgovBBSManagerController.java —-=—— @Autowired(required=false) <- 자동으로 객체 생성된다. (required=false 해당 클래스가 없거나, 두개가 있거나 해도 에러 발생시키지 않느다.) private EgovBBSCommentService bbsCommentService; //bbsCommentService라는 객체는 EgovBBSManagerController에서 객체 만들 때 소스상에 new 부분이 없어도 만들어진다. (커플링(연결도)을 줄이위 위한거라네… 요즘 추세라네)
—-=—— @RequestMapping(“/cop/bbs/selectBoardList.do”) <- 스프링의 어노테이션 표현, “/cop/bbs/selectBoardList.do”라는 URL요청에 대해서 아래 메소드를 실행한다. public String selectBoardArticles(@ModelAttribute(“searchVO”) BoardVO boardVO, ModelMap model) throws Exception {}
아규먼트로 넘어오는 BoardVO boardVO 나 ModelMap model 는 selectBoardArticles 메소드를 호출할 때 자동으로 생성되어 호출된다. (아마 스프링쪽에서 해주는 것 같음(상세 조사 필요)