본문 바로가기
Tools/eGov

[eGov] 내가 보려고 적는 IntelliJ 환경 Spring boot + jsp + Mybatis 등 완전 정복

by kwh_coding 2024. 9. 12.

이전 글은 eGov측에서 제공하는 샘플 게시판 리스트를 구동시켜 보는 것으로 마무리했다.

하지만 나의 프로젝트, 나의 코드로 작성하는 것이 누구나 모두 편할 것이기 때문에 내 방식대로 설정을 바꿔보기로 했다.

 


1. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>gkgk</artifactId>
    <version>1.0.0</version>
    <packaging>war</packaging>
    <name>gkgk</name>
    <description>gkgk</description>
    <url/>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>17</java.version>
    </properties>

    <repositories>
        <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>https://maven.egovframe.go.kr/maven/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>projectRepository</id>
            <name>Project Repository</name>
            <url>file://${project.basedir}/src/main/webapp/WEB-INF/lib</url>
        </repository>
    </repositories>

    <dependencies>
        <!-- 전자정부프레임워크 관련 의존성 -->
        <dependency>
            <groupId>org.egovframe.rte</groupId>
            <artifactId>org.egovframe.rte.ptl.mvc</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.egovframe.rte</groupId>
            <artifactId>org.egovframe.rte.fdl.cmmn</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.egovframe.rte</groupId>
            <artifactId>org.egovframe.rte.fdl.idgnr</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.egovframe.rte</groupId>
            <artifactId>org.egovframe.rte.fdl.property</artifactId>
            <version>4.2.0</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.egovframe.rte</groupId>-->
<!--            <artifactId>org.egovframe.rte.fdl.security</artifactId>-->
<!--            <version>4.2.0</version>-->
<!--        </dependency>-->

        <!-- 스프링부트 관련 의존성 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- slf4j multi binding 에러 해결을 위한 제외 코드 -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
            <!-- 여기까지 제외한다 -->
        </dependency>

        <!-- 스프링 부트 관련 의존성 버전에 맞게 세팅해야 함 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- orcale db사용을 위한 jdbc -->
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc11</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        
        <!-- mybatis 관련 의존성 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter-test</artifactId>
            <version>3.0.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

        <!-- JSP 관련 의존성 -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
             <scope>provided</scope>
        </dependency>

        <!-- JSTL API 의존성 -->
        <dependency>
            <groupId>jakarta.servlet.jsp.jstl</groupId>
            <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
            <version>3.0.0</version>
        </dependency>

        <!-- JSTL 구현체 의존성 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- JSON 라이브러리 사용을 위한 의존성 -->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20210307</version>
        </dependency>
        <!-- java 크롤링 기능인 jsoup 사용을 위한 의존성 -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.3</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

pom.xml에서 버전을 맞추는데 시간이 참 오래 걸렸다.

스프링 부트 버전에 따라 호환되는 Mybatis 버전을 찾아야 했고 이에 따라 버전이 낮아졌기 때문에 

mybatis-config.xml이라는 파일이 필수가 된 것으로 파악했다. (기존 스프링부트 3.x.x 버전에서는 properties 파일에서 전부 설정 가능했음)

그리고 eGov 관련 의존성에서 security 부분은 자동으로 Spring security가 적용되게 하는 것으로 일단 필요없어서 주석처리했다.

 

또한, 

<exclusions>
    <exclusion>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </exclusion>
</exclusions>

이 부분을 추가하지 않으면 slf4j multi binding이라는 에러를 마주하며 pom.xml 빌드가 진행되지 않는다.

(빌드 자체가 안되거나 프로젝트를 Run 할 때 에러 등장)

 

구글링을 하며 찾아보니 log4j-slf4j-impl과 logback-classic이 함께 존재할 경우 충돌이 발생할 수 있다는 내용이 있었기 때문에 제외를 시켰다. 

 

이 과정에서 mvn의 tree를 봐야 한다. 왜냐하면, pom.xml에 log4j-slf4j-impl과 logback-classic이라는 의존성을 넣은 적도 없는데 자꾸 넣었다고 하기 때문이다. 그래서 내부 구조를 뜯어 봐야 한다.

 

나는 IntelliJ를 사용하기 때문에 

Maven Helper라는 플러그인 설치 후 

 

빨간 동그라미 부분을 클릭하고 상단 All Dependencies as Tree를 클릭해보면 알 수 있을 것이다.

 

 

 

2. properties, mybatis-config.xml

mybatis.config-location=classpath:mybatis-config.xml
#mybatis.mapper-locations=classpath:mappers/**/*.xml
#mybatis.type-aliases-package=com.example.gkgk.dto

db 관련된 부분과 port 및 prefix, suffix는 제외하고 mybatis만 보면

처음엔 mybatis.mapper-locations=classpath:mappers/**/*.xml 을 주석처리 하지 않고 실행했었다.

 

그 후, mybatis-config.xml을 보면

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <typeAliases>
        <typeAlias type="com.example.gkgk.dto.itemDto" alias="item"/>
        <typeAlias type="com.example.gkgk.dto.updateDto" alias="update"/>
    </typeAliases>

    <mappers>
        <mapper resource="mappers/fileitem.xml"/>
        <mapper resource="mappers/filetest.xml"/>
    </mappers>



</configuration>

mappers라는 태그에 또 xml파일을 읽으라고 적혀있다. 

 

이 때문에 중복이 생겨 에러가 발생하는 것이었다. (이걸 찾는데 한참 걸리다니...)

 

여튼 주석처리를 하니 해결이 됐다.

참고로 typeAliases 태그에 alias를 정해주면 DB에서 적는 것처럼 mapper파일 쿼리에 

<select id="selectDetail" resultType="item" parameterType="int">
	select * from TABLE_UPDATE_ITEM where TABLE_UPDATE_UID=#{id}
</select>

이렇게 적을 수 있게 된다는 것을 의미한다.

 

3. jsp

여기까지 했으면 실행을 시키니 잘 작동하는 것을 볼 수 있을 것이다.

하지만, 추가로 코드를 적으려고 보니 jsp파일이 활성화가 되질 않는 것이다...

 

보통 이럴 땐 Project Structures의 Module이나 Settings > Editor > File types > jsp에 파일 확장자명이 .jsp로 잘 설정이 되어 있는가를 보면 된다.

 

하지만, Settings > Editor > File types에 jsp 자체가 없었다. 이런 경우는 처음이었다.

 

근데 생각보다 아주 간단한 곳에 해결방법이 있었다.

 

위에 올린 pom.xml에는 war로 되어 있지만, 처음엔 jar로 설정이 됐었다.

war로 바꾸니 바로 해결....

 

 


 

추가

글을 적고 나서 properties 파일에 mybatis-config.xml 부분을 주석 처리 후 실행해 보니 작동이 잘 된다.

버전을 낮춰도 필수는 아니었다는 것.

 

원인이 무엇이었는지는 추가 확인이 필요할 것으로 보인다.

'Tools > eGov' 카테고리의 다른 글

[eGov] IntelliJ 에서 eGov 4.2 프레임워크 적용  (2) 2024.09.11