12/12 62-1 [SPRING] 오라클 연결하기(Database)
데이터베이스 연결!!
전에 메이븐먼저 정리
(교안자료실 메이븐 교안 다운받아서 참고하셈)
컴파일->패키징->배포
요 전 과정을 빌드한다고하는데 빌드해주는 도구가 바로 메이븐!
메이븐 사용의 목적
라이브러리의 종속성을 유기하기 위함이다.
즉, 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; 이거 임포트 해야함 !!! 히카리에 속지마라
순서만 정리해보니 생각보다 간단해 보이는데
그렇지 않아... 혼자 끙긍거리며 반나절을 보냈다고!!