페이지

2022년 4월 17일 일요일

JDK 1.6 + Spring Framework 4 + MyBatis 3 사용 기초

JDK 1.6 + Spring Framework 4 + MyBatis 3 사용 기초

1. 개요

다음과 같은 환경에서 Spring Framework 4 기반의 MyBatis 3 사용 프로그램을 작성하고 빌드하여 실행할 수 있도록 안내합니다.

도구 버전 설명
Windows 10 운영체제
JDK 1.6 Java 컴파일러 및 실행 환경
IntelliJ IDEA 2021.2.2 (Community Edition) 통합 개발 환경
Maven 3.2.5 (JDK 1.6에서 동작하는 마지막 버전) 빌드 도구
Spring Framework 4.3.30.RELEASE 응용 프레임워크
MyBatis 3.4.6 DB 사용 프레임워크

2. 준비

아래 블로그 글을 참고하여 프로젝트를 생성하고 Spring Framework 4 기반 응용프로그램을 작성합니다.

3. JDBC 설정 파일 추가

3.1. jdbc.conf

#############################  
##         MySQL           ##  
#############################  
jdbc.type=1  
jdbc.driver=com.mysql.jdbc.Driver  
jdbc.url=jdbc:mysql://DB_IP:DB_PORT/DB_NAME?serverTimezone=UTC&useSSL=false  
jdbc.username=DB_USERNAME  
jdbc.password=DB_PASSWORD 
jdbc.validation.query=SELECT 1  
mybatis.mapper.location=../conf/mapper/app-mysql.xml  
  
#===========================================================  
# DATABASE SESSION CONFIG ( init; max; min )  
#===========================================================  
jdbc.init.pool.size=5  
jdbc.max.pool.size=20  
jdbc.min.pool.size=5

3.2. applicationContext.xml

<beans ...
       xmlns:context="http://www.springframework.org/schema/context"
       ...
       xsi:schemaLocation="
       ...
       http://www.springframework.org/schema/context  
       http://www.springframework.org/schema/context/spring-context.xsd
       ...>

    <context:property-placeholder properties-ref="properties" />  
  
    <bean id="properties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
        <property name="locations">  
            <list>  
                <value>file:../conf/jdbc.conf</value>  
            </list>  
        </property>  
    </bean>
    ...

4. MyBatis 사용

4.1. pom.xml

<properties>  
    <spring.version>4.3.30.RELEASE</spring.version>  
    <mybatis.version>3.4.6</mybatis.version>  
    <mybatis.spring.version>1.3.3</mybatis.spring.version>  
    <hikaricp.version>2.3.13</hikaricp.version>  
    <mysql.connector.version>5.1.49</mysql.connector.version>
</properties>

<dependencies>
    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-tx</artifactId>  
        <version>${spring.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework</groupId>  
        <artifactId>spring-jdbc</artifactId>  
        <version>${spring.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>org.mybatis</groupId>  
        <artifactId>mybatis</artifactId>  
        <version>${mybatis.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>org.mybatis</groupId>  
        <artifactId>mybatis-spring</artifactId>  
        <version>${mybatis.spring.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>com.zaxxer</groupId>  
        <artifactId>HikariCP-java6</artifactId>  
        <version>${hikaricp.version}</version>  
    </dependency>  
    <dependency>  
        <groupId>mysql</groupId>  
        <artifactId>mysql-connector-java</artifactId>  
        <version>${mysql.connector.version}</version> 
    </dependency>
</dependencies>

4.2. applicationContext-dataSource.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xmlns:tx="http://www.springframework.org/schema/tx"  
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  
    <bean id="dataSource" class="com.example.helper.CryptoHikariDataSource" >  
        <constructor-arg index="0" ref="properties"/>  
        <property name="driverClassName" value="${jdbc.driver}"/>  
        <property name="jdbcUrl" value="${jdbc.url}"/>  
        <property name="username" value="${jdbc.username}"/>  
        <property name="password" value="${jdbc.password}"/>  
        <property name="minimumIdle" value="${jdbc.min.pool.size}"/>  
        <property name="maximumPoolSize" value="${jdbc.max.pool.size}"/>  
        <property name="connectionTestQuery" value="${jdbc.validation.query}"/>  
        <property name="leakDetectionThreshold" value="3000"/>  
    </bean>  
  
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <property name="dataSource" ref="dataSource"/>  
        <property name="configurationProperties" ref="properties"/>  
        <property name="mapperLocations">  
            <array>  
                <value>file:${mybatis.mapper.location}</value>  
            </array>  
        </property>  
        <property name="typeAliasesPackage" value="com.example.beans"/>  
    </bean>  
  
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">  
        <constructor-arg index="0" ref="sqlSessionFactory"/>  
    </bean>  
  
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean>  
  
    <tx:annotation-driven transaction-manager="transactionManager" />  
  
</beans>

4.3. app-mysql.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="app">  
  
    <select id="checkTable" parameterType="String" resultType="String">  
        SHOW TABLES LIKE #{tableName}  
    </select>  
  
</mapper>

4.4. ConsoleExecutor.java

protected void initBeanFactory() {  
    beanFactory = new ClassPathXmlApplicationContext(  
            "classpath:applicationContext.xml",  
            "classpath:applicationContext-dataSource.xml"  
    );  
}

5. App DAO 추가

5.1. applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
       xmlns:context="http://www.springframework.org/schema/context"  
       xmlns:task="http://www.springframework.org/schema/task"  
       xsi:schemaLocation="  
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context.xsd 
       http://www.springframework.org/schema/task 
       http://www.springframework.org/schema/task/spring-task.xsd">  
  
    <context:property-placeholder properties-ref="properties" />  
  
    <bean id="properties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
        <property name="locations">  
            <list>  
                <value>file:../conf/jdbc.conf</value>  
            </list>  
        </property>  
    </bean>  
  
    <bean id="appDao" class="com.example.dao.AppDao">  
        <property name="sqlSession" ref="sqlSession"/>  
    </bean>  
  
    <bean id="messageHandler" class="com.example.handler.DefaultMessageHandler">  
        <property name="appDao" ref="appDao"/>  
    </bean>  
  
    <bean id="serviceExecutor" class="com.example.executor.ServiceExecutor">  
        <property name="messageHandler" ref="messageHandler"></property>  
    </bean>  
  
    <bean id="appScheduler" class="com.example.scheduler.AppScheduler">  
    </bean>  
  
    <task:scheduler id="scheduler" pool-size="10"/>  
    <task:scheduled-tasks scheduler="scheduler">  
        <task:scheduled ref="appScheduler" method="sayHello" fixed-delay="10000"/>  
    </task:scheduled-tasks>  
  
</beans>

5.2. AppDao.java

package com.example.dao;  
  
import org.apache.commons.lang3.StringUtils;  
import org.mybatis.spring.SqlSessionTemplate;  
  
public class AppDao {  
  
    private SqlSessionTemplate sqlSession;  
  
    public void setSqlSession(SqlSessionTemplate sqlSession) {  
        this.sqlSession = sqlSession;  
    }  
  
    public boolean checkTable(String tableName) {  
        String table = sqlSession.selectOne("app.checkTable", tableName);  
  
        return !StringUtils.isEmpty(table);  
    }  
  
}

6. App DAO 사용

6.1. DefaultMessageHandler.java

package com.example.handler;  
  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
import com.example.dao.AppDao;  
  
public class DefaultMessageHandler implements MessageHandler {  
  
    private static Logger LOGGER = LoggerFactory.getLogger(DefaultMessageHandler.class);  
  
    private AppDao appDao;  
  
    public void setAppDao(AppDao appDao) {  
        this.appDao = appDao;  
    }  
  
    @Override  
  public void handle(String message) {  
        LOGGER.info("handle: " + message);  
        boolean result = appDao.checkTable("SERVER_INFO");  
        LOGGER.info("checkTable: " + result);  
    }  
  
}

6.2. applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:task="http://www.springframework.org/schema/task"  
    xsi:schemaLocation="  
    http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/task 
    http://www.springframework.org/schema/task/spring-task.xsd">  
  
    <bean id="messageHandler" class="com.example.handler.DefaultMessageHandler">  
    </bean>  
  
    <bean id="serviceExecutor" class="com.example.executor.ServiceExecutor">  
        <property name="messageHandler" ref="messageHandler"></property>  
    </bean>  
  
    <bean id="appScheduler" class="com.example.scheduler.AppScheduler">  
    </bean>  
  
    <task:scheduler id="scheduler" pool-size="10"/>  
    <task:scheduled-tasks scheduler="scheduler">  
        <task:scheduled ref="appScheduler" method="sayHello" fixed-delay="10000"/>  
    </task:scheduled-tasks>  
  
</beans>

Written with StackEdit.

JDK 1.6 + Spring Framework 4 사용 기초

JDK 1.6 + Spring Framework 4 사용 기초

1. 개요

다음과 같은 환경에서 Spring Framework 4 기반의 Hello World 프로그램을 작성하고 빌드하여 실행할 수 있도록 안내합니다.

도구 버전 설명
Windows 10 운영체제
JDK 1.6 Java 컴파일러 및 실행 환경
IntelliJ IDEA 2021.2.2 (Community Edition) 통합 개발 환경
Maven 3.2.5 (JDK 1.6에서 동작하는 마지막 버전) 빌드 도구
Spring Framework 4.3.30.RELEASE 응용 프레임워크

2. 준비

아래 블로그 글을 참고하여 프로젝트를 생성합니다.

3. Spring Framework 사용

3.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 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
    <modelVersion>4.0.0</modelVersion>  
  
    <groupId>org.example</groupId>  
    <artifactId>springframework4-study</artifactId>  
    <version>1.0-SNAPSHOT</version>  
    <dependencies>  
        <dependency>  
            <groupId>org.slf4j</groupId>  
            <artifactId>slf4j-api</artifactId>  
            <version>1.7.32</version>  
        </dependency>  
        <dependency>  
            <groupId>ch.qos.logback</groupId>  
            <artifactId>logback-classic</artifactId>  
            <version>1.2.10</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-beans</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-context</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework</groupId>  
            <artifactId>spring-core</artifactId>  
            <version>${spring.version}</version>  
        </dependency>  
    </dependencies>  
  
    <properties>  
        <maven.compiler.source>6</maven.compiler.source>  
        <maven.compiler.target>6</maven.compiler.target>
        <spring.version>4.3.30.RELEASE</spring.version>
    </properties>  
  
</project>

3.2. applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="  
 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  
    <bean id="serviceExecutor" class="com.example.ServiceExecutor">  
    </bean>
    
</beans>

3.3. ServiceExecutor.java

package com.example;  
  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
  
public class ServiceExecutor {  
    private static Logger LOGGER = LoggerFactory.getLogger(ServiceExecutor.class);  
  
    private boolean keepRunning = true;  
  
    public void start() throws Exception {  
        LOGGER.info("Service is starting...");  
        LOGGER.info("Service started.");  
  
        int count = 0;  
        while (keepRunning) {  
            Thread.sleep(1000);  
            LOGGER.info("count " + ++count);  
        }  
    }  
  
    public void stop() throws Exception {  
        LOGGER.info("Service is stopping...");  
        keepRunning = false;  
        LOGGER.info("Service stopped.");  
    }  
}

3.4. HelloWorld.java

package com.example;  
  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
import org.springframework.beans.factory.BeanFactory;  
import org.springframework.context.support.ClassPathXmlApplicationContext;  
  
public class HelloWorld {  
    private static Logger LOGGER = LoggerFactory.getLogger(HelloWorld.class);  
  
    private BeanFactory beanFactory;  
  
    protected HelloWorld() {  
        initBeanFactory();  
    }  
  
    protected void initBeanFactory() {  
        beanFactory = new ClassPathXmlApplicationContext(  
                "classpath:applicationContext.xml"  
  );  
    }  
  
    protected void start() {  
        final ServiceExecutor serviceExecutor = beanFactory.getBean("serviceExecutor", ServiceExecutor.class);  
  
        Runtime.getRuntime().addShutdownHook(new Thread() {  
            @Override  
  public void run() {  
                try {  
                    LOGGER.info("Application is stopping...");  
                    serviceExecutor.stop();  
                    LOGGER.info("Application stopped.");  
                } catch (Exception e) {  
                    LOGGER.error(e.getMessage(), e);  
                }  
            }  
        });  
  
        try {  
            LOGGER.info("Application is starting...");  
            serviceExecutor.start();  
            LOGGER.info("Application started.");  
        } catch (Exception e) {  
            LOGGER.error(e.getMessage(), e);  
            System.exit(1);  
        }  
    }  
  
    public static void main(String[] args) {  
        LOGGER.info("Hello World!!!");  
  
        HelloWorld executor = new HelloWorld();  
        executor.start();  
    }  
}

4. 참고 자료

  1. Spring Framework Versions - JDK Version Range

Written with StackEdit.

2022년 4월 2일 토요일

JDK 1.6 + Maven + IntelliJ 사용 기초

JDK 1.6 + Maven + IntelliJ 사용 기초

1. 개요

다음과 같은 환경에서 Hello World 프로그램을 작성하고 빌드하여 실행할 수 있도록 안내합니다.

도구 버전 설명
Windows 10 운영체제
JDK 1.6 Java 컴파일러 및 실행 환경
IntelliJ IDEA 2021.2.2 (Community Edition) 통합 개발 환경
Maven 3.2.5 (JDK 1.6에서 동작하는 마지막 버전) 빌드 도구

2. 사용 기초

2.1. IntelliJ IDEA에서 프로젝트 생성

  1. Windows 시작 메뉴에서 JetBrains 아래의 IntelliJ IDEA Community Edition 2021.2.2를 클릭합니다.

  2. Welcome to IntelliJ IDEA 대화상자에서 Projects 탭 화면의 New Project 버튼을 클릭합니다.

  3. New Project 대화상자에서 Maven 탭 화면의 Project SDK1.6으로 지정하고 Next 버튼을 클릭합니다.

  4. New Project 대화상자에서 다음과 같이 입력하고 Finish 버튼을 클릭합니다.

    • Name: HelloWorld
    • Location: C:\DevTest\220402_HelloWorld

    생성된 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
        <modelVersion>4.0.0</modelVersion>  
      
        <groupId>org.example</groupId>  
        <artifactId>HelloWorld</artifactId>  
        <version>1.0-SNAPSHOT</version>  
      
        <properties>  
            <maven.compiler.source>6</maven.compiler.source>  
            <maven.compiler.target>6</maven.compiler.target>  
        </properties>  
      
    </project>
    

2.2. 사용할 Maven 지정

  1. IntelliJ IDEA에서 File - Settings… 메뉴를 클릭합니다.

  2. Settings 대화상자에서 Build, Execution, Deployment - Build Tools - Maven 탭을 선택하고 아래와 같이 Maven 경로를 지정한 후 OK 버튼을 클릭합니다.

    • Maven home path: Maven 3.2.5 설치 경로

2.3. HelloWorld.java 추가

  1. IntelliJ IDEA에서 Project 창의 src - main - java 항목을 선택하고 마우스 오른쪽 버튼을 클릭합니다.

  2. 컨텍스트 메뉴에서 New - Package 항목을 클릭하고 아래와 같이 입력한 후 엔터를 칩니다.

    • New Package: com.example
  3. com.example 패키지를 선택하고 마우스 오른쪽 버튼을 클릭합니다.

  4. 컨텍스트 메뉴에서 New - Java Class 항목을 클릭하고 아래와 같이 입력한 후 엔터를 칩니다.

    • New Java Class: HelloMain

    생성된 클래스는 아래와 같습니다.

    package com.example;  
    
    public class HelloMain {  
    }
    
  5. HelloMain 클래스에 아래와 같이 main 메쏘드를 추가합니다.

    package com.example;  
    
    public class HelloMain {  
        public static void main(String[] args) {
            System.out.println("Hello World!!!");
        }
    }
    

2.4. HelloWorld 실행

  1. Project 창에서 HelloWorld 클래스를 선택하고 마우스 오른쪽 버튼을 클릭합니다.

  2. 컨텍스트 메뉴에서 Run ‘HelloWorld.main()’ 항목을 클릭합니다.

  3. 콘솔 창에 아래와 같은 결과가 표시되는지 확인합니다.

    "C:\Program Files\Java\jdk1.6.0_45\bin\java.exe" ...
    Hello World!!!
    
    Process finished with exit code 0
    

2.5. Maven으로 빌드

  1. IntelliJ IDEA에서 Maven 창을 열고 상단 메뉴바에 있는 Toggle ‘Skip Tests’ Mode 버튼을 클릭하여 테스트 단계를 수행하지 않도록 합니다.

  2. Maven 창의 HelloWorld - Lifecycle 항목을 펼치고 cleaninstall을 더블클릭합니다.

3. Logback 사용

3.1. logback-classic 의존성 추가

  1. Project 창에서 pom.xml 파일을 더블클릭하여 엽니다.

  2. pom.xml 파일에 커서를 두고 Alt + Insert 버튼을 클릭합니다.

  3. Generate 창에서 Dependency 항목을 클릭합니다.

  4. Maven Artifact Search 대화상자의 Search For Artifact 입력창에 logback-classic을 입력합니다.

  5. ch.qos.logback:logback-classic을 펼친 후 1.2.10을 선택하고 Add 버튼을 클릭합니다.

  6. Maven 창에서 HelloWorld를 선택하고 마우스 오른쪽 버튼을 누릅니다. 이어서 나타나는 컨텍스트 메뉴의 Reload project 항목을 클릭합니다.

3.2. slf4j-api 의존성 추가

Logback은 SLF4J API를 구현하고 있기 때문에 아래와 같이 의존성을 추가해 주어야 합니다.

  1. Project 창에서 pom.xml 파일을 더블클릭하여 엽니다.

  2. pom.xml 파일에 커서를 두고 Alt + Insert 버튼을 클릭합니다.

  3. Generate 창에서 Dependency 항목을 클릭합니다.

  4. Maven Artifact Search 대화상자의 Search For Artifact 입력창에 slf4j-api를 입력합니다.

  5. org.slf4j:slf4j-api를 펼친 후 1.7.32를 선택하고 Add 버튼을 클릭합니다.

  6. Maven 창에서 HelloWorld를 선택하고 마우스 오른쪽 버튼을 누릅니다. 이어서 나타나는 컨텍스트 메뉴의 Reload project 항목을 클릭합니다.

3.3. Logback으로 로그 남기기

  1. HelloWorld 클래스를 아래와 같이 수정합니다.

    package com.example;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class HelloMain {
        private static Logger LOGGER = LoggerFactory.getLogger(HelloMain.class);
    
        public static void main(String[] args) {
            LOGGER.info("Hello World!!!");
        }
    }
    

3.4. HelloWorld 실행

  1. Project 창에서 HelloWorld 클래스를 선택하고 마우스 오른쪽 버튼을 클릭합니다.

  2. 컨텍스트 메뉴에서 Run ‘HelloWorld.main()’ 항목을 클릭합니다.

  3. 콘솔 창에 아래와 같은 결과가 표시되는지 확인합니다.

    "C:\Program Files\Java\jdk1.6.0_45\bin\java.exe" ...
    14:14:42.815 [main] INFO com.example.HelloMain - Hello World!!!
    
    Process finished with exit code 0
    

참고 자료

Written with StackEdit.

국어 맞춤법 참고 자료

  제목 설명(인용) 출처 IT 글쓰기와 번역 노트 IT 기술 문서 및 서적을 집필/번역/교정하면서 얻은 경험/정보/지식을 공유합니다. 전뇌해커 [우리말 바루기] ‘대로’의 띄어쓰기 명사 뒤에서는 붙여 쓰고, 그 외에는 띄어 쓴다고 생각하면 쉽다. 다...