Spring - mysql SSH Tunneling(mysql 터널링 접근하기)
자세한 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포트의 데이터를 조회하여 결과를 가져왔습니다.