학원/SPRING

12/12 62-1 [SPRING] 오라클 연결하기(Database)

도원결의 2022. 12. 12. 19:48

데이터베이스 연결!!
전에 메이븐먼저 정리

 

(교안자료실 메이븐 교안 다운받아서 참고하셈)
 컴파일->패키징->배포
요 전 과정을 빌드한다고하는데 빌드해주는 도구가 바로 메이븐!

메이븐 사용의 목적

라이브러리의 종속성을 유기하기 위함이다.
즉, A라는 라이브러리가 B라는 라이브러리가 꼭 필요하다면 MAVEN에서는 A라는 라이브러리를

저장소에서 가져오면 B도 자동으로 프로젝트로 가져 온다.

 

저장소 얘기가 나와서 하는 말인데
그 때 잭슨파일 받은거 
한 번 다운받으면 로컬에 자동 저장됨!
메이븐을 사용하면
이렇게 라이브러리들을 자동 관리해줘서 좋다!

 


[POM.XML] : 여기서 관리하는데 요게 뭐냐?

프로젝트의 구조와 내용을 설명하고 ,프로젝트 관리 및 빌드에 필요한 환경 설정,
의존성 관리 등의 정보들을 기술해 놓은 곳이라고 보면 된다!
가서 보면
<modelVersion>4.0.0</modelVersion>    => 메이븐의 버전
<groupId>com.kosmo</groupId>       => 도메인 역할
<artifactId>springapp</artifactId>      ==>주로 어.플.리.케.이.션. 명
<name>SpringProj</name>
<packaging>war</packaging>     ====> 다 만들고 결국 뭐로 묶을 꺼?
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>

<org.springframework-version>4.3.30.RELEASE</org.springframework-version>    => 상수처럼 쓰면 됨

<exclusion>  ==>뭘 제외해? 패키징할 때 별로 필요하지않을 것같은것들은 뺀다
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>

<build> 빌드는 건들게 없어요...
빌드 테스트 하는도중에

install이 안되서 
 <configuration>
       <source>1.8</source>
        <target>1.8</target>

 </configuration>
이거원래1.6이였는데 1.8로 변경함



라이브러리(.jar)를 자동으로 관리해주는 TOOL 중에

그레이들? 이라는 것도 있는데 
메이븐보단 쉽대.. 근데 얘는 안배울 꺼니까 메이븐이나 잘 하자

 

이제 슬슬 jdbc연결로 들어가 보자

jdbc연결 프로그램의 발달순서(?)
ibatis   --->  mybatis    ---->  jpa
(옛날)        (요새)                (스타트업에서 많이 사용)
mybatis는 sql문을 내가직접 작성하지만
jpa는 sql까지 해주기도해서 클래스만 잘 만들면  아주 편하다고 함 그래도....

우린 mybatis 사용 할 거임

자 이제 할 것들을 아주아주 크게보면

JDBC라이브러리 넣어놓고!!(pom.xml)

오라클에서 SPRING 계정을 만들어서 

Server에 SPRING 계정 정보를 넣어놓고 

이렇게 등록한 데이터 소스들을 얻어오면 되는 것 !!(컨트롤러 만들어서 연결연결)

 

 

데이터베이스 연결은 총 3가지 방법으로 할 거임!!

1.커넥션 풀 미사용

2.커넥션 풀 사용

3.히카리 커넥션 풀 사용 (이게 속도가 엄청 빠르다고해서 이제 이거 사용 할 것임)

 

까먹기 전에 오라클 계정부터 만들어 놓자 

SPRING/SPRING

CREATE USER SPRING IDENTIFIED BY SPRING;

GRANT CONNECT,RESOURCE TO SPRING;

 

databalse07> Database.jsp 생성

Database.jsp  (index랑 index컨트롤러에는 이제 알아서 잘 추가 하세용)

<p>${message}${param.method}</p>
<ul class="list-unstyled">
   <li><a href="<c:url value="/Database/NotConnectionPool.do?method=NOT_CONNECTION_POOL" />">커넥션 풀 미사용</a></li>
   <li><a href="<c:url value="/Database/SpringConnectionPool.do?method=SPRING_CONNECTION_POOL" />">커넥션 풀 사용</a></li>
   <li><a href="<c:url value="/Database/HikariConnectionPool.do?method=HIKARI_CONNECTION_POOL" />">히카리 커넥션 풀 사용</a></li>
</ul>

 

DatabaseController.java

이건 뒤에서 주입해야 할 것 들 등록 및 연결하고 와서 내용 추가추가해도 될 것 같다

워낙 왔다갔다 작업이 많아서

그냥 앞에다가 빼놈

++ @Resouece()에 name속성을 추가한 것은 기존에 어노테이션 공부할 때 name속성 없이 만들어 놓은게 있어서

구분하기 위해 속성 추가 시킨 것! 이거 없으면 구분이 안되서 에러 남

@Controller
@RequestMapping("/Database")  //공통경로는 이렇게 빼도 위로 빼도 가능
public class DatabaseController {
	
	//데이터 소스를 자동으로 주입받기위한 멤버변수 선언
	@Resource(name = "driverManagerDataSource")
	private DataSource notCP;
	
    커넥션 풀 미사용
	@RequestMapping("/NotConnectionPool.do")
	public String notConnectionPool(Model model) throws SQLException {
		//주입받은 datasource객체로 커넥션객체 얻기
		Connection conn= notCP.getConnection();
		//데이터 저장
		model.addAttribute("message",conn==null? "데이터베이스 연결실패":"데이터베이스 연결성공");
		if(conn != null) conn.close();	
		//뷰정보 반환
		return "database07/Database";
	}
	
	스프링 커넥션풀 사용
	@Resource(name="indiJndiObjectFactoryBean")
	private DataSource springCP;
	@RequestMapping("/SpringConnectionPool.do")
	public String springConnectionPool(Model model) throws SQLException  {
		//주입받은 datasource객체로 커넥션객체 얻기
		Connection conn= springCP.getConnection();
		//데이터 저장
		model.addAttribute("message",conn==null? "데이터베이스 연결실패":"데이터베이스 연결성공");
		if(conn != null) conn.close();		
		//뷰정보 반환
		return "database07/Database";
	}
	
    히카리 사용
	@Autowired
	private HikariDataSource hikariCP;
	
	@RequestMapping("/HikariConnectionPool.do")
	public String hikariConnectionPool(Model model) throws SQLException  {
		//주입받은 datasource객체로 커넥션객체 얻기
		Connection conn= hikariCP.getConnection();
		//데이터 저장
		model.addAttribute("message",conn==null? "데이터베이스 연결실패":"데이터베이스 연결성공");
		if(conn != null) conn.close();		
		//뷰정보 반환
		return "database07/Database";
	}
}

 

pom.xml에 스프링 jdbc 라이브러리를 추가 

여기서 가져왕

스프링 jdbc 연결
 <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jdbc</artifactId> 
     <version>${org.springframework-version}</version> 
 </dependency>

오라클 연결용 드라이버 추가(단, 직접 WEB-INF/lib 넣어도 무방)	
<dependency>
    <groupId>com.oracle.database.jdbc</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0.4</version>
</dependency>

히카리 커넥션 풀
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.0.1</version>
</dependency>

Server> server.mxl에  SPRING 계정 관련 추가 

 <Resource auth="Container"
    driverClassName="oracle.jdbc.OracleDriver"
    maxTotal="20"
    maxIdle="20"
    name="spring"
    username="SPRING"
    password="SPRING"
    type="javax.sql.DataSource"
    url="jdbc:oracle:thin:@127.0.0.1:1521:xe"
  />

Server>context.xml 에도 SPRING 계정 추가

 <ResourceLink global="spring"
      name="spring"
      type="javax.sql.DataSource"/>

 

Datasource를 얻기 위한 빈 등록은 루트컨텍스트에서등록 혹은 자바코드로 등록
그래야 디스패처 서블릿에서 해당 빈을 공통으로사용 가능

 

자바로 등록안하고 빈으로 등록 시에는 루트 컨텍스트에다가 이렇게  연결하면 됨

(밑에 어차피 자바로등록 할 얘정이라 이건 모두주석처리 해 놓음 그래도 혹시 모르니까 하는법 을 남겨 둠)

	<!--  스프링 JDBC 사용(커넥션 풀 미사용) -->
   <!-- 
	<bean id="driverManagerDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
		<property name="username" value="SPRING"/>
		<property name="password" value="SPRING"/>
	</bean>
   -->	
	
	<!--스프링의 JNDI 커넥션 풀 사용   -->
	<!--
	<bean id="jndiObjectFactoryBean" class="org.springframework.jndi.JndiObjectFactoryBean" > 	
	 	<property name="jndiName" value="spring"/>
	 	<property name="resourceRef" value="true" />
	</bean>
	-->	
	
	<!-- Hikari CP -->	
	<!--  
	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig" >
		<property name="driverClassName" value="oracle.jdbc.OracleDriver" />	
		<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
		<property name="username" value="SPRING"/>
		<property name="password" value="SPRING"/>	
	</bean>	
	<bean class="com.zaxxer.hikari.HikariDataSource">
		<constructor-arg ref="hikariConfig"/>		
	</bean>
	-->

 

 

src/main/resources> database.properties(file)

민감한  정보들은 properties 파일에 넣어놓고

키 값만 꺼내서 키만 볼 수 있게한다 

driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
user=SPRING
password=SPRING
jndiName=spring

DatabaseConfig.java 

datasource를 얻기 위한  2번째 방법 !  자바코드로 등록하는법

@configuration +  @bean

그리고

@Value 의 기능 추가 !!

이건 properties 파일을  읽어올 때 사용하는 어노테이션

이것도 일종의 주입과  비슷한 기능인 것 같다 !!

 

한 페이지에서

@Value(${키값}) 으로 가져오면 

키 값으로 다  같이 사용이가능하네

오호 변수사용하는 것과 비슷하구먼

 

 properties파일을 @Value로 적용해서 

자바코드로 datasource을 얻어보면

DatabaseConfig.java

@Configuration
public class DatabaseConfig {
	
	커넥션 풀 미사용
	@Bean
	public DriverManagerDataSource driverManagerDataSource() {
		DriverManagerDataSource dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName(driverClassName);
		dataSource.setUrl(url);
		dataSource.setUsername(username);
		dataSource.setPassword(password);
		return dataSource;
	}
	
	스프링 커넥션 풀 사용	
	@Value("${jndiName}")
	private String jndiName;
	
	@Bean JndiObjectFactoryBean indiJndiObjectFactoryBean() {
		JndiObjectFactoryBean dataSource = new JndiObjectFactoryBean();
		dataSource.setJndiName(jndiName);
		dataSource.setResourceRef(true);
		return dataSource ;
	}
	
	히카리 커넥션 풀 사용: server.xml 및 context.xml 에 커넥션 풀 관련 설정 불필요
	@Value("${driverClassName}")	
	private String driverClassName;
	@Value("${url}")	
	private String url;
	@Value("${user}")	
	private String username;
	@Value("${password}")	
	private String password;
		
	@Bean
	public HikariDataSource hikariDataSource() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName(driverClassName);
		hikariConfig.setJdbcUrl(url);
		hikariConfig.setUsername(username);
		hikariConfig.setPassword(password);
		return new HikariDataSource(hikariConfig);
	}
	
}

 

요렇게 나와야 함 !! 굳굳

 

====> 팀프로젝트하느라 히카리만을 사용해서 다시 연결시도함 

하다가 개 빡쳤지만

해냈다!!!! 뿌듯 

대충 경로만 적어 놔야겠다 

그래야 나중에라도 헤매지 않지!!!

어차피 히카리를 거의 사용할 거니까 !!

 

1.pom.xml 에서

히카리 커넥션 풀 라이브러리 넣어놓기 (+ 한 김에 mybatis core 도 그냥 같이 받아놓기)

 

2.src/main/resources

 config패키지 밑에다가 database.properties 파일 생성

여기다가 오라클 정보 담아놓고 끌어와 쓸거임

 

3.servlet-context 로 가서 

2번에서 만든  외부 리소스 파일 로딩( properties파일의 값들을 읽어오기위한 설정 )

(**  location속성에 외부 리소스 파일 지정, 여러 개 지정 시에는 콤마로 구분)

<context:property-placeholder location="classpath:config/database.properties"/>

 

4.databaseConfig.java 생성

여기다가 히카리관련 빈 등록!(@Configuration)

(아까 마이바티스 라이브러리 가져왔다면 마이바티스관련 빈도 같이 등록 해놓아도  됨)

 

5. 컨트롤러생성!

DatabaseControlle.java

드디어 히카리 연결 !!!

주의할게 여기서 Connection 임포트 할 땐

히카리 어쩌구 아니고

import java.sql.Connection; 이거 임포트 해야함 !!! 히카리에 속지마라

 

순서만 정리해보니 생각보다 간단해 보이는데

그렇지 않아... 혼자 끙긍거리며 반나절을 보냈다고!!

그리고 얻어낸 값진 결과 !!! 뿌듯 !!