본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Spring framework

스프링 WebListener를 통한 Mysql 또는 Oracle 등 터널링 설정 하기(Mysql 터널링, Oracle 터널링, Mongodb 터널링)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2020. 2. 3.

 

서블릿 3.0 이상을 사용하는 스프링 프레임워크에서 가능한 기능이다.

WebListener이라는 에노테이션을 사용해서 쉽게 터널링을 할 수 있다.

기본 Mysql, Oracle 또는 Mongodb등 어떠한 데이터베이스에 접속하던지 간에 해당 에노테이션을 잘 활용하면 같은 모양으로 터널링이 가능하다.

일단..서블릿 3.0 이상이 지원되는 환경을 구성하는게 가장 중요하다.

 

WebListener는 스프링에서 정의한 리스너의 종류이다.

스프링에서 정의한 웹 어플리케이션 구조를 먼저 살펴보면,

 

1. 서블릿(Servlet) : 외부 클라이언트 요청에 대한 내용 수행
2. 필터(Filter) : 요청 처리 전 또는 후에 해야할 일을 수행
3. 리스너(Listener)  : 특정 상태(조건)에 놓일 때 작업을 수행
 1) 서블릿 컨텍스트 영역에서의 시작, 종료시에 대한 내용을 정의 (ServletContext 객체가 생성 또는 소멸되기 전)
 2) 외부 클라이언트의 요청이 들어오거나 서버에서 응답을 수행할 때 발생하는 내용을 정의 (ServletRequet 객체가 생성 또는 소멸 하였을 때)
 3) ServletRequet의 객체에 등록, 수정 및 삭제 행위가 수행할 때

 

여기서 3번의 1)번 개념을 적용해서 공통적으로 데이터베이스에 대한 터널링이 가능 하다.

그러면 터널링을 위해서 가장 많이 사용되는 JSCH 라이브러리를 받자.

 

* maven 추가 방법

<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

* gradle 추가 방법

// https://mvnrepository.com/artifact/com.jcraft/jsch
compile group: 'com.jcraft', name: 'jsch', version: '0.1.55'

 

3번의 1)번의 개념을 적용하려면 필요한 인터페이스는 ServletContextListener이다.

해당 인터페이스를 상속받은 빈 껍데기 클래스를 만들어주자.

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyContextListener implements ServletContextListener {
	@Override
	public void contextDestroyed(ServletContextEvent arg0) {

	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {

	}

}

 

요렇게 만든 클래스를 WebListener 에노테이션을 설정하여 주면 서블릿 컨텍스트가 생성될 때 해당 내용이 수행된다.

그럼 여기서부터가 터널링 방법이다.

JSCH를 활용해서 ssh 접속을 설정하여 주자.

해당 클래스를 만드는 것만 하면 90%이상 작업은 끝났다고 볼 수 있다.

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

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

@WebListener
public class MyContextListener implements ServletContextListener {
    static Session SSH_SESSION;
    static JSch jsch = new JSch();

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        if(SSH_SESSION != null){
            SSH_SESSION.disconnect();
        }
        if(jsch != null){
            jsch = null;
        }
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {

        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");

        try {
            SSH_SESSION = jsch.getSession("아이디", "접속할서버아이피", 포트번호);
            SSH_SESSION.setPassword("비밀번호");
            SSH_SESSION.setConfig(config);
            SSH_SESSION.connect();
            SSH_SESSION.setPortForwardingL(가상포트, "127.0.0.1", 사용할데이터베이스포트);
        } catch (JSchException e) {
            e.printStackTrace();
        }
    }

}

 

먼저 첫번째 포트번호는 ssh로 접속할 포트번호이다

그리고 가상포트는 말 그대로 가상포트, 아무숫자나 써 주어도 상관없는 포트이다.

 -> 데이터베이스 서버에서 충돌나지 않도록 주의!!

사용할데이터베이스포트 는 mysql, oracle 또는 몽고db가 열어준 포트를 의미한다.

 

뭔소린고 하면,

실제 데이터베이스에서 사용중인 포트가 3306이라고 하자.

그리고 가상포트를 8923라고하자.

만약 8923으로 접속을 시도하는 행위를 발견하면 알아서 스스로 127.0.0.1:3306 으로 접속 행위를 돌려준다.

 

여기까지 하였다면 내가 접속할 Mysql, 오라클, 몽고db의 접속 주소를 아래처럼 바꾸어 주어야 한다.

기존 접속방식은 그대로두고 접속할 아이피와 포트만 바꾸면 된다.

 

만약 mysql이라고 하면은 아래처럼 사용하면 된다.

jdbc:log4jdbc:mysql://127.0.0.1:가상포트/데이터베이스?characterEncoding=UTF-8&serverTimezone=UTC

 

오라클이라고 하면은?

jdbc:oracle:thin:@127.0.0.1:가상포트:sid번호

 

그럼 몽고db는?

mongodb://127.0.0.1:가상포트/데이터베이스

 

 

ServletContextListener를 상속받아서 WebListener 에노테이션을 활용하면 손쉽게 터널링이 가능하여 진다.

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글