/ #JAVA#SPRING

스프링 레거시(Spring legacy) - 설정

지난번 스프링 부트를 통해 게시판을 만들어 보았는데 이번에는 스프링 레거시를 사용해서 게시판을 만들어보겠습니다.

STS3 / JDK 11 / Tomcat9 설치

우선은 Spring Tool Suite 3을 다운받습니다. 3버전은 스프링 레거시를 지원합니다.

JDK는 11 버전 이상이여야 사용할 수 있습니다. 이전에 open JDK 17을 다운받았는데, oracle JDK 11을 새로 설치하겠습니다. 오라클에 로그인 하셔야 다운가능합니다.

스프링 부트와 달리 내장 톰캣이 없어서 톰캣을 다운받아야 합니다. Tomcat 9 버전을 다운받습니다.

STS3 압축을 풀어 sts-bundle 폴더 안에 ws폴더를 만들고, 톰캣의 압축을 풉니다.

sts-3.9.18.RELEASE 폴더에 들어가서 STS를 실행시킵시다.

방금 생성한 ws 폴더를 작업폴더로 지정하고 Launch를 누릅니다.

img01

인코딩 설정

상단에 Window > Preferences를 클릭합니다.

img08

General > Content Types에 들어가서 Text를 선택하고 하단에 Default encodingutf-8을 입력후 Update 버튼을 누르세요.

img09

General > Workspace에서 Text file encoding 또한 UTF-8로 번경 후 Apply 버튼을 누르세요

img10

Web > CSS Files, Web > HTML Files, Web > JSP Files, XML > XML Files, JSON > JSON Files 또한 Encoding을 UTF-8로 변경후 Apply 버튼을 누르세요.

img11

기본 JDK 버전을 17로 사용하고 있어서 환경변수가 17 버전으로 되어 있습니다. 환경변수를 변경해도 되지만 에디터를 통해 설정하겠습니다.

JAVA > Compiler에서 JDK Compiler compliance level11로 변경하고, JAVA > Installed JREs에서 JDK 11버전 경로를 추가한 후 Apply를 클릭하세요.

img12

img13

톰캣 서버 생성

왼쪽 Package Explorer 창에 있는 기본 서버 프로젝트를 삭제합니다.

img02

Delete project contents on disk (cannot be undone)을 체크하여 완전시 삭제합시다.

img03

왼쪽 하단에 톰켓 서버도 삭제합니다.

img04

왼쪽 하단에 링크를 클릭하여 서버를 추가합시다.

img05

Tomcat v9.0 Server를 선택후 Next 버튼을 클릭합니다.

img06

Browse... 버튼을 클릭하여 아까 설치한 톰캣 폴더를 디렉토리로 지정한후 Finish를 클릭하세요.

img07

프로젝트 서버 생성

스프링 레거시 프로젝트를 생성하겠습니다. 왼쪽 Package Explorer 창에 오른쪽 마우스 클릭을 한 후 New > Spring Legacy Project를 선택합니다.

img14

Spring MVC Project를 선택후 프로젝트 이름을 적고 Next를 클릭합니다.

img15

패키지 및 아티팩트 이름을 적고 Finish를 클릭하면 레거시 프로젝트의 의존성이 자동으로 설치되면서 프로젝트가 추가됩니다.

img16

톰캣 서버에서 Add and Remove...를 선택하여 프로젝트를 추가해줍니다.

img17

img18

Ctrl + Alt + R을 누르면 톰캣 서버가 시작됩니다. 기본 포트는 8080 입니다. localhost:8080/board로 접속해보세요. (board는 아티팩트 이름입니다.)

img19

한글이 깨지는데 뷰 페이지를 작성할때 encoding 메타정보를 utf-8로 입력하야합니다. 뷰 페이지 작성을 참고하세요.

의존성 추가

레거시 프로젝트의 경우 빌드툴로 메이븐(maven)을 사용하기 때문에 pom.xml을 통해 의존성을 추가할 수 있습니다.

저는 롬복을 통해 간단하게 getter, setter 설정 및 의존성의 생성자 주입을 하므로 롬복을 설치하겠습니다. 또한 DB는 스프링 부트 게시판을 만들때 사용했던 오라클 클라우드를 사용하도록 하겠습니다.

롬복을 설치하면 IDE를 찾을 수 없다고 뜨는데, Specify loaction...을 클릭하여 STS3의 위치를 지정해주고 Install / Update를 클릭합니다.

img20

pom.xml 파일에 롬복 의존성을 추가합니다.

pom.xml
        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>provided</scope>
        </dependency>

mvnrepository를 참고하여 의존성을 설정해줍니다.

자바 버전은 1.8로 변경하고, 스프링 프레임워크 버전도 5.1.5.RELEASE로 설정합시다.

pom.xml
    <properties>
        <java-version>1.8</java-version>
        <org.springframework-version>5.1.5.RELEASE</org.springframework-version>
        <org.aspectj-version>1.6.10</org.aspectj-version>
        <org.slf4j-version>1.6.6</org.slf4j-version>
    </properties>

junit은 현재 4.12 버전의 사용률이 높으므로 4.12버전으로 변경합니다.

pom.xml
        <!-- Test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

JPA 대신 이번에는 mybatis를 사용하여 sql문을 실행하겠습니다.

DB 연결을 위해 Spring JDBC를 의존성으로 추가하고, 메이븐 레포지토리를 참고하여 mybatismybatis-spring을 의존성 추가합니다.

pom.xml
        <!-- Spring JDBC -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>

DB는 오라클 클라우드를 사용할 예정이므로 OJDBC 의존성을 추가합니다. 클라우드 연결에는 인증키를 통한 인증 과정이 필요하므로 Osdt도 OJDBC 버전에 맞추어 의존성으로 추가합니다.

pom.xml
        <!-- https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc8 -->
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>21.1.0.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.oracle.database.security/osdt_cert -->
        <dependency>
            <groupId>com.oracle.database.security</groupId>
            <artifactId>osdt_cert</artifactId>
            <version>21.1.0.0</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/com.oracle.database.security/osdt_core -->
        <dependency>
            <groupId>com.oracle.database.security</groupId>
            <artifactId>osdt_core</artifactId>
            <version>21.1.0.0</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/com.oracle.database.security/oraclepki -->
        <dependency>
            <groupId>com.oracle.database.security</groupId>
            <artifactId>oraclepki</artifactId>
            <version>21.1.0.0</version>
        </dependency>

프로퍼티 설정

스프링 부트에서는 Gradle 빌드툴을 사용하여 빈(Bean)이 자동으로 등록되고, 빈에 대한 설정은 application.properties 파일에 작성했지만, 레거시에서는 빈을 직접 등록합니다. 레거시 앱의 빈 등록은 /src/main/webapp/WEB-INF/spring/appServlet/root-context.xml 파일에 작성합니다.

mybatis를 통해 오라클 DB에 접근하기 위해 dataSourcesqlSessionFactory, sqlSession을 빈으로 등록하고 property에 다음과 같이 설정값을 입력합니다.

src/main/webapp/WEB-INF/spring/root-context.xml
    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" name="dataSource">
        <property value="oracle.jdbc.driver.OracleDriver" name="driverClassName"/>
        <property value="[DB 주소]" name="url"/>
        <property value="[DB 아이디]" name="username"/>
        <property value="[DB 암호]" name="password"/>
    </bean>
         
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
        <property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>            
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
    </bean>

sqlSession은 SQL을 실행하고 트랜잭션을 제어하는 객체입니다. mybatis에서는 sqlSession 객체를 통해 mapper의 쿼리문을 실행합니다. sqlSessionFactory를 의존성 주입받으며, sqlSessionFactory은 dataSource를 참조하여 sqlSession 객체를 생성합니다.

img21

sqlSessionFactory에는 mybatis-config.xml 파일과 mappers.xml의 위치를 지정해주고, dataSource에는 DB 정보를 입력해줍니다.

해당 위치에 mybatis-config.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>
        <package name="kro.rubisco.dto"/>
    </typeAliases>
</configuration>

typeAliases 태그 아래 package 태그의 name 속성은 패키지의 별칭을 나타냅니다. 나중에 매퍼를 작성함에 있어서 DTO를 연결할 때 패키지명을 모두 적어야하지만, 이렇게 별칭을 지정해두면 작성된 패키지 부분을 생략하고 DTO 클래스명만 적어도 연결이 됩니다.

mappers라는 패키지 폴더도 하나 만들어둡시다. 나중에 매퍼를 작성할 폴더입니다.