H2 데이터베이스 설치
DBCP Connection Pooling 추가
JDBC 설정 파일 추가 및 Spring 설정
테이블 설계
사용자가 입력한 데이터를 Controller 까지 이동되었고
Controller에서 database 에 데이터를 저장하는 과정을 살펴본다.
일단, database의 설지과정이 필요하고
db의 connection을 관리하는 connection pooling을
springframswork을 이용해서 설정해 본다.
테이블 설계하는 과정을 살펴보고
다음단계로 설계한 테이블 스키마를 database에 초기화한다.
dao 클래스를 만들어서 db에 데이터를 추가해본다.
1. DB 설치
자바진영에서 사용하는 H2를 메이븐 의존성 주입으로 사용해본다.
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
<scope>test</scope>
</dependency>
2. database에 연결하기 위한 설정파일이 필요하다.
설정을 기존에는 자바소스코드에서 했다면 database에 대한 jdbc 설정을
springframework를 활용해서 web으로 설정을 뺄 수 있다.
설정은 properties파일로 key : value나
xml로 key : value로 관리할 수 있다.
src/main/resources - application-properties.xml
<entry key="database.driverClassName">org.h2.Driver</entry>
<entry key="database.url">jdbc:h2:~/slipp</entry>
<entry key="database.username">sa</entry>
<entry key="database.password"></entry>
자바소스에서 직접설정했던 이 부분을 xml파일로 추출했다.
추출한 다음에 이 설정파일을 springframework 설정파일에서 다음과 같이 사용할 수 있다.
3. Connection Pooling 추가를 해본다.
몇 개의 Connection Pooling이 있는데
apache-commons 에서 제공하는 commons-dbcp 라이브러리를 사용한다.
<!-- <a href="https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp"></a><a href="https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp" target="_blank">https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp> -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
Referenced Libraries에 commons-dbcp-1.4.jar와 commons-pool-1.5.4.jar가 설치된다.
4. 스프링 설정파일을 추가한 다음에
설정파일에서 database connecton pooling 설정을 한다.
설정파일은 기본설정 파일이름(spring bean configuration file) 으로 한다.
이름은 보통 applicationContext.xml이름으로 사용한다.
namespace는 필요할 때에 추가한다.
database에 대한 jdbc 설정파일인 application-properties.xml의 key, value를 읽어와서
database connection pooling의 설정 값들을 사용하는 과정이다.
- 먼저 값을 읽어온다 : namespace에 context 선택하고 아래 코드를 입력
<context:property-placeholder location="classpath*:application-properties.xml"/>
이렇게 하면 설정파일을 읽어서 key:value값을 가지고 있게 된다.
그러면 property 설정파일을 아래와 같이 사용할 수 있다.
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
p:driverClassName="${database.driverClassName}"
p:url="$database.url}"
p:username="database.username"
p:password="database.password" />
우리가 사용할 connection pooling을 자바의 표준에서 DataSource하는 Interface로 추상화 해 놓았다.
일반적으로 Pooling이라고 하지 않고 DataSource라고 사용한다.
apache.commons.dbcp에 있는 connection pooling의 구현체 클래스는 BasicDataSource이다.
'p:'로 하면 setter()메소드를 기반으로 해서 BasicDataSource에 값을 전달할 수 있다는 것이다.
BasicDataSource라는 클래스의 인스턴스를 만든다음
그 인스턴스에 setDriverClassName()에 p:key에 해당하는 값을 전달 할 수가 있다는 것.
이 값은 property-placeholder를 통해 읽어들인 xml에 있는 value값이다.
설정파일을 key:value로 구성한 다음에(xml, properties...)
스프링 설정에서 그 설정파일을 읽어서 클래스에 전달할 수 있다.
여기에서 보는 값을 전달하는 부분도 Dependency Injection의 형태로 동작한다고 봐도 좋다.
p:driverClassName="${database.driverClassName}"
즉 각각의 값들과의 의존관계가 있는데 이부분을 설정으로 빼서
외부에서 dataSource에 주입하는 것이기 때문이다.
그러면 이 설정파일이 정상동작하는지 확인해 본다.
서버나 dao클래스를 만들기 전에
junit 테스트 클래스를 만들어서 확인해 볼 수 있다.
net.slipp.support 패키지에 JUnit Test Case를 ApplicationContextTest 이름으로 생성한다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/applicationContext.xml")
"applicationContext.xml" 파일을 읽어서 정상동작하는지 확인해본다.
이 파일에는 DataSource 인터페이스를 구현한 BasicDataSource 객체가 있고
'정상동작'이란 말은 실제 db에 접근하는 것이 아니기 때문에
DataSource 인터페이스를 구현한 BasicDataSource 객체 주입 받는지만 확인한다.
@Autowired
private DataSource dataSource;
테스트가 성공했다.
여기까지 database Connection 설정이 끝났다.
간단한 database 설계롤 해본다.
src/main/resources/slipp.sql을 생성하고 쿼리문을 등록한다.
DROP TABLE IF EXISTS USERS;
CREATE TABLE USERS (
userId varchar(12) NOT NULL,
password varchar(12) NOT NULL,
name varchar(20) NOT NULL,
email varchar(50),
PRIMARY KEY (userId)
);
INSERT INTO USERS VALUES('jsdilnam', '1234', '스프링', <a href="mailto:'">jsdilnam@slipp.com</a>');[/code">'<a href="mailto:jsdilnam@slipp.com">jsdilnam@slipp.com</a>');
'프로그래밍 > JAVA & SPRING' 카테고리의 다른 글
[기타] Spring 추천사이트 (0) | 2020.06.07 |
---|---|
[박재성] Spring Web 9강 - DB initialize & UserDao 구현 (0) | 2020.06.07 |
[박재성] Spring 기반 웹 프로그래밍 7강 - dependency injection (0) | 2020.06.07 |
[박재성] Spring 기반 웹 프로그래밍 6강 - logback settings (0) | 2020.06.07 |
[박재성] Spring 기반 웹 프로그래밍 5강 - slipp 메인 페이지 개발 및 mvc setting (0) | 2020.06.07 |