4 minute read

전자정부 표준 프레임워크

  • 위키피디아
  • 사이트 : 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
  • Annotation-based Controller (@MVC) 스프링 어노테이션 기반 컨트롤러

  • 스프링 프레임워크
  • 버전 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 메소드를 호출할 때 자동으로 생성되어 호출된다. (아마 스프링쪽에서 해주는 것 같음(상세 조사 필요)


🔗original-link

Updated: