-
Spring MVC01 - DB연결하기Web/Spring 2023. 6. 28. 16:11
- 프로젝트 폴더에서 WEB-INF아래에 appServlet폴더에 servlet-context.xml과 root-context.xml은
스프링에서 아주 중요한 설정파일이다.
-Servlet-context.xml: dispatcherServlet이 읽음, dispatcherServlet이 해야할 일을 설정해둔 파일
- root-context.xml : spring 구동시 가장 먼저 실행되는 일들을 설정해둔 파일이다. ContextLoaderListener가 읽는다.
- 위와 같이 xml파일들은 api들이 읽어서 무언가를 하도록 미리 설정해둔 파일들이다.
- web.xml -> rootcontext->servlet-context 순서 (각 xml파일들은 위치나 이름 바꿔도 됨 *단 web.xml에 잘 등록 해둘 것)
위와 같이 설정된 web.xml을 보면, listener가 context-param에 지정된 root-context.xml을 읽고,
appServlet(dispatcher)가 servlet-context.xml을 읽도록 설정되어 있다.
DB를 연결하는 부분은 frontcontroller에서 하는 것은 아니고, 시작과 동시에 연동되어야 하므로, root-context.xml에 설정해두도록 하자
1. API다운로드
DB연결을 위해 필요한 API는 총 3개로 다음과 같은 연결을 돕는 API이다.
- JDBC <->mysql
- JDBC <-> mybatis
- mybatis <-> Spring
mvnrepository에서 각각 찾아서 pom.xml에 추가해두자
*중간에 하나는 그냥 mybatis용 api이다.
<!-- Spring DB API --> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.31</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>3.1.1.RELEASE</version> </dependency>
2. root-context.xml설정
1.2 root.xml에 DB properties 설정
* 기존에 db.properties파일과 config.xml파일은 자주 변경되지않는다. 따라서 WEB-INF/mybatis 폴더 새로만들어서 옮겨두었다.
- 기존 servlet-jsp에서는
dp.properties (url,username,password 등등 기록)와 Mapper.xml을 config.xml에 연결
config를 통해 sqlsessionFactory를 얻어서 ConnectionPool을 셋틩한다음 connection(sqlsession)들을 가지고 DB작업을 했다.
- spring에서도 이와 마찬가지로 하기 위해서 미리 다운받아온 api에 클래스들을 생성하고 클래스 속성에 맵핑이나 db.properties를 연결할 것이다.
- root.xml이 마치 config.xml처럼 활용된다는 것이다.
> 1. dp.properties연결
<!-- db.properties 파일 연결 --> <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations" value="/WEB-INF/mybatis/db.properties"/> </bean> //beans에 팩토리 config에 Property를 설정(placeholder) //해당 클래스 마우스 오른쪽 버튼 ..패키지명까지 copy할 수 있는 방법 있음
- 다음을 추가해서 dp.properties의 내용을 읽는 클래스를 생성하자.
- id는 일종의 참조변수명, class는 인스턴스를 생성할 클래스 이름 등록
-Spring beans안에 <bean> </bean>은 spring에서 리플랙션기법을 통해 객체를 생성하는 방식이다.
즉 자바에서 new A()로 클래스를 만들듯이, 태그에 이용해 객체를 생성하는 것이다.
(마치 text파일에 클래스명을 지정해두고 -> 이를 스트림으로 읽은 뒤 Class.forName을 통해 만드는 것과 비슷)
- 위 클래스를 생성하고 미리 정해진 속성 중 location이라는 속성에 value에 설정된 값을 넣는 것으로
setLocations(value)와 같다고 보면 된 다.
이렇게 설정하면, dp.properties의 내용을 가진 클래스가 내부적으로 생성된다.
> 2. Spring - JDBC (DataSource)
<!-- Spring - JDBC와 Driver연결 (DataSource 생성) --> <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> <property name="driverClass" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> //새로 다운받은 Spring JDBC 라이브러리에 가져와야 할 클래스 있음 //기존 config.xml이나, Jdbc에서 커넥션 객체 얻기 위해 드라이버, url, 이름 등등 등록하던것과 동일 </bean>
- 내부에 JDBC에 커넥터를 연결하고 DataSouce를 생성하는 작업이다.
-SimpleDriverDataSource클래스는 내부적으로 PropertyPlaceHolder와 연결되어 있다.
(프로퍼티 등록 클래스가 Spring.beans.factory 패키지등에 속해 있고, 위 클래스는 Spring<->JDBC<->DB연결을 위한 클래스 이므로 어느정도 납득이 간다)
- 따라서 ${}을통해 properties에 설정된 값을 읽어올 수 있다. (config.xml에서 하는 작업과 같다)
> 3. SqlsessionFactory생성
<!-- Mybatis sqlsessionFacroty --> <bean id ="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="/WEB-INF/mybatis/config.xml" /> <property name="mapperLocations" value="classpath:kr/bit/mybatis/*.xml" /> </bean> //커넥션 풀 안에는 커넥션들도 있지만 mapper정보가 필요함 //config.xml파일 연결하는 이유는 typeAlias 때문
> datasource는 JDBC연결 데이터 소스
> configLocation은 기존의 config.xml파일을 의미
- 기존의 config.xml파일은 이제 typeAliases를 지정하는 것을 뺀 나머지 내용은 필요없다
> mapperLocationdms 맵핑파일의 위치를 지정해주는 것으로 classpath:뒤에 지정해주면된다. 맵핑파일이 많을 수 있음으로 *.xml으로 해두었다.
DB를 연결하기 위한 준비는 이렇게 해두면된다.
+ DAO객체 Spring Container에 등록
DB와 연동해서 사용하는 컨테이너에 등록해두자
<context:component-scan base-package="kr.bit.model" />
context: name space는 root-context에 없음으로, 맨 위에 추가 설정을 해줘야한다.
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd 에다가 http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd 추가
두가지를 beans에 추가해두면된다.
*추가 xml코드 어시스턴스
Preference -> General -> Editors -> File Associations -> xml -> xml Editor를 default로 설정
*JDBC는 매번 DB와의 커넥션을 driver클래스를 통해 생성해야함 (DriverManager.getConnection())
Datasource는 커넥션 풀에 커넥션들을 미리 만들어두고 필요시 사용하고 반납하는 것
-Datasource는 커넥션 풀을 관리함
-Datasource로부터 DB와의 연결을 얻음
* 그냥 Datasource만 사용한다면, 기존 JDBC사용하는 것과 connection얻어오는 것 빼곤 코드에서 큰 차이 없음
-> mybatis같은 api를 사용해야, 내부적으로 mybatis에서 제공하는 api(sqlsession 등)으로 JDBC api를 내부적으로 사용하고 sql과 자바코드 분리할 수 있음
->mybatis는 JDBC를 내부적으로 사용하고, 외부적으로 간단하게 처리할 수 있는 유용한 API제공 + 커넥션 풀 만들어서 사용
참고자료: 나프2탄(인프런) - 박매일
https://www.inflearn.com/course/%EB%82%98%ED%94%84-mvc-2
'Web > Spring' 카테고리의 다른 글
Spring MVC02 - Mapper Interface와 XML이용한 CRUD (0) 2023.06.29 Spring MVC01 - 스프링 동작 절차 (0) 2023.06.28 Spring (1) - 기존 servlet-jsp와 차이점 (0) 2023.06.28 스프링 - 간단 용어들 정리 (0) 2023.03.05 스프링 MVC -간단한 코드로 보는 원리 (0) 2023.03.04