본문으로 바로가기

Intellij + SpringBoot 에 전자정부 프레임워크를 적용하기 위한 세부 적용 규칙을 정리했다.

eGov3.9(최신) 버전에서도 스프링 부트 지원을 해주지 않기 때문에 커스터마이징 하여 사용해야 된다.

 

* eGov에서 제공하는 호환성 가이드.pptx 및 3.0 세부 적용 가이드.pdf 참고로 작성했으며,

   적용 기준에 맞게 위의 환경에서 동작까지 확인했지만, 따로 인증을 받은 것은 아니니 참고용으로 봤으면 한다.

 

 

[0. 추가 정보]

- 환경 : SpringBoot + Maven + IntelliJ Ultimate + eGov 3.9

 

- 전자정부 프레임워크에서 제공하는 Sample 은 eclipse + spring MVC + Web(jsp) 동작 테스트 이며,

Config 관련 ( AOP / DB / Common 등) 설정 파일들은 모두 xml 기반으로 작성되었다.

 

- 해당 포스트에서는 Config 관련 설정 파일은 xml 대신 Java Annotation Config 로 구현했다.

 

- 현재 사용한 eGov3.9 대신

         (아직 안나옴/ 올해 말 ~ 내년에 나온다고 함) eGov4.0 버전에서는 SpringBoot 를 지원해준다고 하니 그때 사용하는 것도 방법.

            

 

[1. 실행환경 변경 금지]

=> 전자정부 실행 환경 라이브러리를 변경할 수 없다.

   

    - 개별적 / maven을 통해서 다운로드 받은 전자정부 실행 환경 라이브러리에 인위적 변경을 가할 수 없다.   

    - egovframework.rte로 시작하는 파일을 대상으로 한다.   

    - 최소 아래의 라이브러리의 Maven Dependency를 추가한다.

              : egovframework.rte.ptl.mvc-x.x.x.jar

              : egovframework.rte.fdl.cmmn-x.x.x.jar

              : egovframework.rte.psl.dataaccess-x.x.x.jar

              : egovframework.rte.fdl.logging-x.x.x.jar

     

# 예시) POM.xml - Maven Dependency & Repository 추가

<properties>
    <egovframework.rte.version>3.9.0</egovframework.rte.version>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
        
        <!-- 1. 표준프레임워크 실행환경 라이브러리  -->
        <dependency>
            <groupId>egovframework.rte</groupId>
            <artifactId>egovframework.rte.fdl.security</artifactId>
            <version>${egovframework.rte.version}</version>
        </dependency>
        <dependency>
            <groupId>egovframework.rte</groupId>
            <artifactId>egovframework.rte.psl.dataaccess</artifactId>
            <version>${egovframework.rte.version}</version>
        </dependency>
        
        <!-- 2. 다운받기 위한 레포지토리  -->  
        <repository>
            <id>mvn2s</id>
            <url>https://repo1.maven.org/maven2/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>egovframe</id>
            <url>http://maven.egovframe.kr:8080/maven/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>egovframe2</id>
            <url>http://www.egovframe.go.kr/maven/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>

 

 

[2. 설정 파일 위치 규칙]

=> xml 파일 중 beans 혹은 sqlMap 엘리먼트를 가지고 있는 파일을 대상으로 특정 위치에 존재해야 된다.
 
    - 프로젝트 루트에 위치하면 안된다.
    - 공통적인 상위 디렉토리 가져야 한다.
    - WEB-INF 및 target 폴더 내의 xml 제외한다.

 

 

[3. 아키택처 관련 규칙]

=> 상속, 클래스 구현 등 아키텍처 정의 시 규칙을 준수해야 된다.

  

    - Controller   

        : 상단 @Controller 선언한다.

         

    - Service  

        : 상단 @Service 선언 ServiceImpl클래스는 EgovAbstractServiceImpl 상속/확장해 사용한다. (v3.0 이상)

        : 모든 Service 클래스는 특정 인터페이스를 구현하고 해당 인터페이스를 확장시켜 사용한다.

            * src/test 폴더 내에 있는 클래스들은 점검 대상에서 제외된다.

   

    - Mybatis (둘 중 하나 만족해야 한다.)

              1. EgovAbstractMapper 상속해 사용한다. (기존 DAO 형태로 사용하는 경우)

              2. 제공하는 MapperConfigurer @Mapper 사용한다. (Mapper Interface로 사용하는 경우)

              : XML 설정 파일  공통설정파일 <configuration> / SQL 매핑파일 <mapper> / SqlSessionFactoryBean 설정 /   MapperConfigurer 빈 설정

       # Mybatis / ibatis / JPA / Hibernate 모두 제시하는 적용 기준이 있으며,

          해당 자료에서는 Mybatis - Mapper Interface로 구현하는 방법으로 사용한다.

 

 

# 예시) Service, 인터페이스 구현 및 해당 인터페이스를 override 해서 사용한다.

// Service 클래스 적용 예시
public interface TestService {
    public void test(String id);
}

// ServiceImpl 클래스 적용 예시
public class TestServiceImpl extends EgovAbstractServiceImpl implements TestService {

@Override
public void test(String id) {
    //
}
}

 

# EgovAbstractServiceImpl 상속 시, 주의 사항.

- EgovAbstractServiceImpl : 프레임워크 공통 Exception 처리를 위한 기능을 제공하는 추상 클래스

 

해당 클래스 구현을 보면

비즈니스 서비스 구현 시, 디폴트로 Exception 처리를 위한 processException 메소드와 leaveaTrace 메소드 가진다.

       1. processException의 경우 ) EgovBizException 발생 시 Exception 메시지와 함께 presentation layer로 전달된다.

       2. leaveaTrace경우 ) Exceptonpresentation layer로 던지지 않고 수행 후 계속 비즈니스 로직으로 돌아오게 해준다.

 

        => EgovAbstractServiceImpl 클래스를 상속할 경우, LeaveaTrace를 작성해야 된다.

// 예시,
@Configuration
public class CommonConfiguration {
   
   /**
     * Exception 이거나 Exception 이 아닌 경우에 Trace 후처리 로직을 실행 시키고자 할 때 사용한다.
     * DefaultTraceHandleManager에 TraceHandler를 등록하는 형태로 설정된다.
     */
    @Bean
    public LeaveaTrace leaveaTrace(DefaultTraceHandleManager traceHandleManager) {
        LeaveaTrace leaveaTrace = new LeaveaTrace();
        leaveaTrace.setTraceHandlerServices(new TraceHandlerService[]{traceHandleManager});
        return leaveaTrace;
    }

    @Bean
    public DefaultTraceHandleManager traceHandleManager(AntPathMatcher antPathMatcher, DefaultTraceHandler defaultTraceHandler) {
        DefaultTraceHandleManager defaultTraceHandleManager = new DefaultTraceHandleManager();
        defaultTraceHandleManager.setReqExpMatcher(antPathMatcher);
        defaultTraceHandleManager.setPatterns(new String[]{"*"});
        defaultTraceHandleManager.setHandlers(new TraceHandler[]{defaultTraceHandler});
        return defaultTraceHandleManager;
    }

    @Bean
    public AntPathMatcher antPathMatcher() {
        AntPathMatcher antPathMatcher = new AntPathMatcher();
        return antPathMatcher;
    }

    @Bean
    public DefaultTraceHandler defaultTraceHandler() {
        DefaultTraceHandler defaultTraceHandler = new DefaultTraceHandler();
        return defaultTraceHandler;
    }
 }

 

# Mybatis 작성

SpringBoot라서 application.yml 자동 주입 시켜도 되지만, DataSource로 직접 넣어주어도 된다.

대신, exclude={DataSourceAutoConfiguration.class}) 자동 주입 제외 시켜야 한다.

 

MapperConfigurer + SqlSessionFactoryBean 사용

// 1. Mybatis Configuration 작성
@Configuration
@MapperScan(basePackages = "com.example.mapper")
@EnableTransactionManagement
public class DatabaseConfiguration {

    @Bean
    public DataSource dataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("");
        dataSource.setUrl("");
        dataSource.setUsername( "" );
        dataSource.setPassword( "" );
        return dataSource;
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sessionFactory.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));

        return sessionFactory.getObject();
    }

    @Bean
    MapperConfigurer mapperConfigurer(DataSource dataSource) {
        MapperConfigurer mapperConfigurer = new MapperConfigurer();
        mapperConfigurer.setBasePackage("impl 위치");
        return mapperConfigurer;
    }

}

 # Mapper import 시 확인 필수.

//
import egovframework.rte.psl.dataaccess.mapper.Mapper

// Mapper 빈 등록 & 인터페이스 생성
@Mapper
public interface TestMapper {
    List<String> getList();
}


// Mapper.xml 작성
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.TestMapper">

</mapper>

 

 

[4. 확장 및 활용 규칙]

    - 실행 환경은 규정에 맞게 확장되어야 한다.

             : 대상 : 프로젝트 내 자바 클래스 중 egovframework.rte 패키지에 속한 클래스를 상속받은 클래스 모두가 대상이다.

             : 해당 클래스는 egovframework.rte 패키지 내에 정의될 수 없으며, Egov라는 이름으로 시작할 수 없다.

   

    - 실행 환경은 적극적으로 활용되어야 한다.

             : 해당 프로젝트 내에 적어도 한 개 이상의 실행 환경 라이브러리 존재해야 한다.

             : 해당 프로젝트 내에 적어도 한 개 이상의 DAO 클래스가 있어야 한다.

             : 해당 프로젝트 내에 적어도 한 개 이상의 Service 클래스가 있어야 한다.

 

 

 

[5. 기타]

조건 : Intellij Ultimate + jsp 파일을 사용할 때

* Community 버전은 jsp 파일 지원 안한다.

 

- webapp/WEB-INF/ 폴더 추가한다.

- View Templatejsp로 사용하도록 지정한다.

* 경로는 view 이름에 접두어, 접미어 붙여 구성한다.

// 다른 방버 : application.yml 에서 사용해도 무방
@Bean
public InternalResourceViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/jsp/");
    resolver.setSuffix(".jsp");
    return resolver;
}

 

 

지금까지 SpringBoot + Intellij 에서 eGov 적용 방법에 대해 설명하였다.