ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    위와 같이 설정된 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

     

    [NarP Series] MVC 프레임워크는 내 손에 [나프2탄] - 인프런 | 강의

    본 과정은 WEB MVC 프레임워크가 무엇이고 WEB MVC 프레임워크가 어떻게 변형이 되면서 Spring WEB MVC 프레임워크로 넘어가는지 TPC(생각하고-표현하고-코딩하고) 기법을 통해 단계적으로 학습하고 이

    www.inflearn.com

     

Designed by Tistory.