반응형

자세한 mybatis mysql 연결 설정법은 이번 글에서 포스팅하지 않겠습니다.

일반적으로 mybatis를 통해 연결하는게 아닌 터널링을 통해 접근하는법을 포스팅입니다.

 

@WebListener 어노테이션은 WAS서버에게 해당 클래스가 리스너임을 명시해줍니다.

 

ServletContextListener 클래스를 상속받으며 인터페이스를 상속받았으므로 2개의 클래스를 재정의하여

사용하시면 됩니다.

 

contextInitialized, contextDestroyed 메소드가 존재합니다.

 

contextInitialized : 해당 메소드는 was가 시작되면서 dispatcherServlet보다 먼저 시작되는 메소드입니다.

contextDestroyed : 해당 메소드는 was가 종료되면 종료되기 직전에 실행되는 메소드입니다.

 

@WebListener를 시작하기전 pom.xml에 라이브러리를 추가합니다.

 

pom.xml

<!-- WebListnener annotation-->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.1</version>
  <scope>provided</scope>
</dependency>

<!-- jsch 터널링을 위해 필요합니다. -->
<dependency>
  <groupId>com.jcraft</groupId>
  <artifactId>jsch</artifactId>
  <version>0.1.53</version>
</dependency>

 

SSH 연결 class를 정의합니다.

SSHConnection.java

import java.util.Properties;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

public class SSHConnection {
	private final static String HOST = "SSH연결을 할 IP";
	private final static Integer PORT = 포트; //기본포트는 22
	private final static String SSH_USER = "연결 USER값"; //ex) root
	private final static String SSH_PW = "연결 비밀번호값"; //ex) 1234
	
	private Session session;
	
	public void closeSSH() {
		session.disconnect();
	}
	
	public SSHConnection() {
		try {
			Properties config = new Properties();
			config.put("StrictHostKeyChecking", "no");
			JSch jsch = new JSch();
			session = jsch.getSession(SSH_USER, HOST, PORT);
			session.setPassword(SSH_PW);
			session.setConfig(config);
			session.connect();
			session.setPortForwardingL(3316, "127.0.0.1", 3306); //127.0.0.1/3316으로 접근한 포트를 연결HOST/3306으로 포트포워딩
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
}

 

 

위에서 정의한 클래스를 사용하는 클래스를 정의합니다.

MyContextListener.java @WebListener

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class MyContextListener implements ServletContextListener {
	
	private SSHConnection sshConnection;

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("init start!");
		try {
			sshConnection = new SSHConnection();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("init destory!");
		sshConnection.closeSSH();
	}
}

 

contextInitialized 메소드는 was가 동작하면 바로 실행되면서 앞 서 만든 SSHConnection 클래스를 통해 터널링을 할 준비를 합니다.

 

mybatis정보 (mybatis-context.xml)

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close" >
  <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  <property name="url" value="jdbc:mysql://127.0.0.1:3316/databaseName" />
  <property name="username" value="username" />
  <property name="password" value="password" />
  <property name="validationQuery" value="SELECT 1 FROM DUAL" />
  <property name="testWhileIdle" value="true" />
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">     
  <property name="dataSource" ref="dataSource" />
  <property name="mapperLocations" value="classpath:mapper/**/*.xml" />
  <property name="configLocation" value="/WEB-INF/mybatis/mybatis-config.xml" />
  <property name="transactionFactory">
  	<bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />
  </property>
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
	<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

3316으로 접근합니다.

하지만 터널링 처리로 인해 3306의 SSH 연결한 3306의 mysql에서 데이터를 가져와서 데이터를 뿌려줍니다.

 

 

결과페이지

local에서 was를 돌렸지만 SSH 터널링으로 인해 연결한 120서버(예시)의 mysql 3306포트의 데이터를 조회하여 결과를 가져왔습니다.

login.jsp

 

 

page 결과

반응형