티스토리 뷰

개인공부/Spring

설정 - ORACLE DB

날따라해봐요요롷게 2021. 9. 15. 13:53

- JDBC 테스트 코드 작성

 : 데이터베이스가 제대로 연결이 되었는지 확인할 수 있는 테스트 코드를 작성한다.

 

테스트 코드는 Java와 JDBC 드라이버만으로 구현해서 먼저 테스트한다. 정상적으로 연결이 된다면 Connection 객체가 출력된다.

 

@Log4j
public class JDBCTests {
	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Test
	public void testConnection() {

		try (Connection con = DriverManager.getConnection(
				"jdbc:oracle:thin:@localhost:1521:XE",
				"book_ex", "book_ex")) {
			log.info(con);
		} catch (Exception e) {
			fail(e.getMessage());
		}
	}
}

 

- 커넥션 풀 (DBCP) (출처 : https://codevang.tistory.com/206, https://programmer93.tistory.com/74)

 

커넥션 풀 이란?

 : DB도 외부 리소스이기 때문에 커넥션을 생성하고 삭제하는 것은 오버헤드가 발생합니다. 또한 DBMS 입장에서도 커넥션을 계속 맺고 끊어야하기 때문에 오버헤드가 발생합니다. 따라서 connection 객체를 일정량 모아둔 Pool을 생성해두고 계속 재활용하는 방식입니다. 요청을 처리하는 각 스레드에서 커넥션을 따로 생성해주지 않고 커넥션풀의 커넥션 객체를 할당받아 사용한 뒤 반납합니다.

WAS(웹 컨테이너)가 실행 될 때 DB연결을 위해 미리 일정수의 connection 객체를 만들어 Pool에 담아 뒀다가 사용자의 요청이 발생하면 Pool에서 생성되어 있는 Connection 객체를 넘겨주고 사용자가 사용이 끝나면 Connection 객체를 다시 Pool에 반환하여 보관하는 기법이다.

 

커넥션 풀

#작동 방식 

1. 사용자가 DB를 사용하기 위하여 Connection을 요청한다.

2. Connection Pool에서 사용되지 않고 있는 Connection 객체를 제공한다.

3. 사용자가 Connection 객체를 사용 완료하면 pool로 반환한다.

 

# 웹 어플리케이션에서 커넥션 풀을 사용해서 얻는 이점

- 서버의 부하를 줄여준다.

웹 어플리케이션에서 커넥션 풀을 사용하는 이유 중 첫번째로 Java에서는 DB Connection을 맺는 과정이 부하가 많이 걸리는 작업이라 동시에 많은 사람들이 DB 커넥션을 요구한다면 최악의 경우 서버가 죽어버리는 문제가 발생할 수도 있다. 이러한 문제를 해결하기 위해 미리 Connection을 생성하고 재활용하여 서버에 부하를 줄여주는 용으로 사용한다.

 

- 서버의 한정적인 자원을 효율적으로 사용할수 있다.
서버는 한정적인 자원을 가지고 있다. 요청이 올때마다 무제한의 Connection을 생성하게 된다면 전체 시스템 성능에 문제가 생길 수 있다. 이러한 문제를 해결하기 위해 커넥션풀에 미리 정해진 숫자의 Connection을 생성해서 관리한다.

 

# 커넥션 풀 등록

- context.xml 파일에 등록

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="driverClassName"
			value="oracle.jdbc.driver.OracleDriver"></property>
		<property name="jdbcUrl"
			value="jdbc:oracle:thin:@localhost:1521:XE"></property>
		<property name="username" value="book_ex"></property>
		<property name="password" value="book_ex"></property>
	</bean>

- java 설정

@Configuration
@ComponentScan(basePackages = {"org.zerock.sample"})
public class RootConfig {
	
	@Bean
	public DataSource dataSource() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		hikariConfig.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
		hikariConfig.setUsername("book_ex");
		hikariConfig.setPassword("book_ex");
		
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		return dataSource;
	}
}

java 에서는 DataSource 인터페이스를 구현하여 커넥션 풀을 생성한다.

 

- 설정한 Bean 을 확인하는 테스트 코드

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
// 설정 파일을 읽어내는 어노테이션
@Log4j
public class DataSourceTests {
	
	@Autowired
	private DataSource ds;
	@Autowired
	private SqlSessionFactory sessionFactory;
	
	public void testConnection() {
		try(Connection con = ds.getConnection()){
		}catch(Exception e) {
			e.printStackTrace();
			log.error(e);
		}
	}
	
	@Test
	public void testConnection1() {
		try(SqlSession session = sessionFactory.openSession();
				Connection con = ds.getConnection();
				){
			log.info(session);
			log.info(con);
		}catch(Exception e) {
			fail(e.getMessage());
		}
	}
}

 

## MyBatis

 : 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다. 마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.

 

MyBatis의 이점

  • 자동으로 Connection close() 가능
  • MyBatis 내부적으로 PreparedStatement 처리 #{prop}와 같이 속성을 지정하면 내부적으로 자동처리
  • 리턴 타입을 지정하는 경우 자동으로 객체 생성 및 ResultSet 처리

MyBatis 와 mybatis-spring 을 사용하기 위해서 pom.xml 파일에 추가적인 라이브러리를 설정

- spring-tx : 스프링에서 db처리와 트랜잭션 처리

- mybatis-spring  : MyBatis와 스프링 연동용 라이브러리

 

# SQLSessionFactory

 : MyBatis 에서 가장 핵심적인 객체는 SQLSession 이라는 존재와 SQLSessionFactory이다.

Factory는 내부적으로 SQLSession 이라는 것을 만들어 내어 개발에서 Connection을 생성하여 SQL을 전달하고 결과를 리턴 받는 구조로 되어있다.

 

- Mapper

 : Mapper 는 sql 과 그에 대한 처리를 지정하는 역할을 한다.

MyBatis-Spring을 이용하는 경우 Mapper를 XML 과 인터페이스 + 어노테이션의 형태로 작성할 수 있다.

 

TImeMapper.xml 을 작성 시 namespace를 작성하는데 반드시 인터페이스 전체 명을 적어야한다.

 

 

 

 

 

'개인공부 > Spring' 카테고리의 다른 글

스프링2  (0) 2022.05.12
면접 준비 - spring framework  (0) 2022.05.11
스프링1  (0) 2022.05.09
CRUD 구현  (0) 2021.11.02
Lombok  (0) 2021.09.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함