본문 바로가기

Linux

웹 배포를 위한 Spring + MySQL 세팅하기

 

JSP 동작하는지 확인

- 본 글 03 에서 Tomcat 과 Apache 두 서버를 연동했다.

*.jsp 파일은 톰캣이 처리하여 화면에 띄워줄 것이고, *.html 파일은 Apache 가 처리하여 화면에 띄워준다. 

 

- 다음의 Test.jsp 파일을 리눅스의 root 폴더에 만들고 제대로 동작하는지 확인하자.

 

 

 

--생략--

 

 

JSP 페이지에서 DB에 접속하기

- java 는 DB에 접근하여 DB 를 제어할 수 있는 'Driver' 가 필요하다. 'Drive'는 *.jar 파일이다
-
MySQL 은 JAVA(JRE) 환경에서 DB 를 제어할 수 있는 기능을 가진 클래스들의 집합인 JAR 파일을 제공한다. 

- MySQL 에서 Driver 의 이름을, Connector/J 라고 붙였다.

 

 

export CLASSPATH = :$JAVA_HOME/lib/mysql-connector-java-8.0.9-rc-bin.jar

 

 

우분투 버전 확인

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
Codename:       bionic

 

.deb파일을 명령어로 다운 받는 방법을 제대로 몰라서 그런지 계속 에러떠서, FileZilla를 이용해서 넣어줄 것임

 

내 인스턴스에 접속

 

윈도우 환경에서 다운받은 .deb 파일을 /home/ubuntu 하위에 넣어준다.

 

 

이제 .deb 패키지 풀기

$ dpkg -i mysql-connector-java_8.0.18-1ubuntu18.04_all.deb

설치된 패키지 정보 확인

/home/ubuntu# dpkg -s mysql-connector-java

 

설치된 위치 확인

$ dpkg -L mysql-connector-java

 

jar 파일 이동시키기

- 우리가 JAVA 설치시 환경변수로 설정해준 CLASSPATH가 가리키는 곳에 *.jar 파일을 넣어주는게 포인트

나의 경우 $JAVA_HOME/jre/lib/ext로 넣어준다.

$ mv mysql-connector-java-8.0.18.jar /usr/local/java/jre/lib/ext

 

 

CLASSPATH 경로는 다음과 같이 설정되어 있는 상태이다.

 

Driver 클래스가 실제로 동작할 수 있는 상태인지 경로를 확인하는 과정

$ javap com.mysql.jdbc.Driver

[참고]  톰캣 서버가 실행중인지 확인하는 명령어

# netstat -nlp

아래 그림처럼 8080, 8005, 8009 포트가 LISTEN 상태인것을 확인할 수 있다.

(톰캣은 기본적으로 이 3개의 포트를 사용함)

 

 


 

Spring 프레임워크를 이용한 jsp와 MySQL 연결하기 

 

<XML 파일 차이점>

xml 파일은 모두 객체(Bean)를 정의한다.
참고 - https://thiago6.tistory.com/70

1. servlet.context.xml -  웹과 관련된 설정을 하는 곳
servlet에서 보듯이 요청과 관련된 객체를 정의합니다.
url과 관련된 controller나, @(어노테이션), ViewResolver, Interceptor, MultipartResolver 등의 설정을 해줍니다.

초기 파일을 보시면

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
위와 같은 주석이 있는데,,

DispatcherServlet과 관련된 설정을 해야함을 알 수 있습니다.

2. root-context.xml - 스프링과 관련된 설정을 하는 곳으로 웹과 관련되지 않은 모든 자원을 설정하는 곳입니다.
servlet-context.xml 과는 반대로 view와 관련되지 않은 객체를 정의합니다.
따라서 Service, Repository(DAO), DB등 비즈니스 로직과 관련된 설정을 해줍니다.

3. web.xml
설정을 위한 설정파일입니다.
즉, 최초로 WAS가 최초로 구동될 때, 각종 설정을 정의해줍니다.
여러 xml파일을 인식하도록 각 파일을 가리켜 줍니다.

 

1. pom.xml 

		<!-- mysql-connector-java 8.0.18 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.18</version>
		</dependency>

		<!-- spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.6</version>
		</dependency>

		<!-- MyBatis Spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.2</version>
		</dependency>
		
		<!-- Spring-test -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>



 

2. servlet-context.xml 설정

[알고가야하는 개념]

JDBC는 클라이언트의 요청마다 커넥션을 생성하고 닫기 때문에 그 과정에서 시간이 소모되고 서버 자원이 낭비될 수 있다. 그래서 이런 문제를 해결하기 위해 등장한 것이 "커넥션 풀(Conntection Pool)"이다

 

클라이언트가 요청할 때마다 커넥션을 연결하는 것이 아니라, 웹 컨테이너가 실행할 때 "풀" 안에 미리 커넥션들을 만들고, DB 작업시 "풀"에서 빌려 사용후 다시 반납하는 것이다. DataSource는 커넥션 풀을 관리하므로 DataSource를 통해 커넥션을 얻거나 반납할 수 있다. -> 고로 java와 DB연결 시 반드시 필요

 

1) pom.xml 에 커넥션 풀 관련 maven 추가

			<!-- dbcp -->
		<dependency>
   			<groupId>commons-dbcp</groupId>
   			<artifactId>commons-dbcp</artifactId>
  			<version>1.4</version>
		</dependency>
		
		<!-- commons pool -->
		<dependency>
   			<groupId>commons-pool</groupId>
  			<artifactId>commons-pool</artifactId>
  			<version>1.6</version>
		</dependency>

 

2) DataSource 생성  - 커넥션 풀 관리

DataSource는 MySQL과 연결을 담당. 

	<!-- dataSource -->
	<beans:bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<beans:property name="driverClassName"  value="com.mysql.cj.jdbc.Driver"/>
		<beans:property name="url" value="jdbc:mysql://서버IP:db접속포트번호/DB스키마명?useSSL=false&amp;serverTimezone=UTC"/>
		<beans:property name="username" value="user"/>
		<beans:property name="password" value="123"/>
	</beans:bean>

 

** 나는 db접속포트번호를

우분투 SSH 접속 포트번호로 잘못 써서

5일동안 접속이 안 되는 원인을 몰랐음..ㅎㅎ

반드시 DB(mysql) 포트 번호로 쓸 것!!!!!!!

 

 

 

2) MyBatis와 연결하기

	<!-- mybatis SqlSessionFactoryBean -->
	<beans:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<beans:property name="dataSource" ref="dataSource"/>
		<!-- mybatis-config.xml이 스프링 시작될때 같이 실행되도록 설정하기 -->
		<beans:property name="configLocation" 	value="classpath:/mybatis-config.xml"/>
	</beans:bean>

SqlSessionFactoryBean는 DB와의 연결과 SQL의 실행에 대한 모든 것을 가진 객체

 

3) SqlSessionTemplate 만들기

DB의 연결과 종료를 담당한다 

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

 

3. 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>	
	<mappers>
		<mapper resource="com/exe/mapper/sourceMapper.xml"/>
	</mappers> 
</configuration>

mybatis-config.xml를 새로 추가했기 때문에, 위에서 servlet-config.xml 의 Factory한테 정보를 넘겨준 것

 

 

출처 - https://min-it.tistory.com/6

[참고]  classpath란?

프로젝트 우클릭 > Properties

 

즉, src/main/java나 main/java/resource의

classpath src/main/webapp/WEB-INF/classes

라고 이해하면 되겠다. 

 

프로젝트를 실행하게되면

노란색깔 4개의폴더 (resource/java/test..)의

각각 안에 들어있는 파일들이

자동으로  classes폴더에 컴파일된 파일들이 옮겨진다.

(이때 아까 만든 mybatis.config.xml이

classes폴더 안에 들어간다고 생각하면 된다.)

 

 

여기까지 설정이 완료되면, 스프링이 동작할 때 mybatis-config.xml (mybatis설정파일)도 동시에 동작하는 작업까지 완료한 것

 

4. html 소스 => css/js/image 등 경로처리

그 전에, 경로에 대한 이해를 하고 가자

request.getContextPath() 
 = 프로젝트 Path만 가져옵니다.
예)  http://localhost:8080/project/list.jsp
[return] /project 

request.getRequestURI() = 프로젝트 + 파일경로까지 가져옵니다.
예)  http://localhost:8080/project/list.jsp
[return] /project/list.jsp  

String url = request.getRequestURI.split("/");
String Name = url[url.length -1];       // list.jsp 반환

request.getRequestURL() = 전체 경로를 가져옵니다. (L만 바뀜)
예) http://localhost:8080/project/list.jsp
[return]  http://localhost:8080/project/list.jsp

request.ServletPath() = 파일명만 가져옵니다.
예) http://localhost:8080/project/list.jsp
[return] /list.jsp

request.getRealPath("") = 서버 or 로컬 웹 애플리케이션 절대경로 가져옵니다.
예) http://localhost:8080/projectname/list.jsp
[return] c:\project\webapps\projectname\

출처 - https://yi-chi.tistory.com/12

 

 

경로처리는 다음과 같이 해준다.

 

(1) http://IP:8080/ 로 접속하는 경우

이 말은 Root Document가 webapps/프로젝트명 으로 되어있다는 소리이다.

(필자의 경우 ROOT -> 프로젝트명 으로 심볼릭 링크를 걸어놓은 상태)

/usr/local/tomcat8/webapps/ROOT# ls
META-INF  WEB-INF  resources

리눅스 서버에서 war파일이 풀린 구조를 보면 다음과 같이 3개로 풀어져있다.

 

http://IP:8080 은 webapps/OpenSource 경로까진 이동한것이므로,

나머지 경로는 그 이후인 /resources 이하부터 접근해주면 된다.

   <link type="text/css" rel="stylesheet" href="/resources/css/materialize.min.css"/>

Spring 내에서의 구조

 

(1) http://IP:8080/OpenSource 로 접속하는 경우 (OpenSource는 본인의 프로젝트명 생각하면 된다)

 

리눅스 서버에서 war파일이 /ROOT/OpenSource 이렇게 들어가있는 경우이므로,

css, img, js 경로도 자신의 프로젝트명을 기입해서 접근해야 한다.

   <link type="text/css" rel="stylesheet" href="/OpenSource/resources/css/materialize.min.css"/>

이게 결국

http://IP:8080/OpenSource/resources/css/materialize.min.css  로 안내한다고 생각하면 될 것 같다.

 

 

 

 

 

 


[주의할 점]

1. 

웹 배포 시 

service apache2 restart

tomcat start 해주기

apache start 안해주면 수정한 웹 배포 결과가 반영이 잘 안됨

 

 

 

 

 

 

 

 

참조

https://gbsb.tistory.com/69