spring 3

MyBatis

  • SqlMapper Framework
  • 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스(영속성) 프레임워크
  • JDBC코드와 수동으로 셋팅하는 파라미터(전달 타입)와 결과(리턴값) 매핑을 제거
  • 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO를 설정하고 매핑하기 위해 XML과 어노테이션을 사용


MyBatis 사용하기

  • WEB-INF/spring/root-context.xml

    • Namspaces에서 context 선택 후 dao, repo, service 등을 포함하는 패키지명을 다음과 같이 추가해준다<context:component-scan base-package="패키지명"/>

    • MyBatis 사용에 필요한 객체들을 등록해준다

    • <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
            id="dataSource">
        <property name="driverClassName" 
                  value="com.mysql.cj.jdbc.Driver"></property>
        <property name="url"
                  value="jdbc:mysql://127.0.0.1:3306/데이터베이스명?serverTimezone=UTC&amp;useUniCode=yes&amp;characterEncoding=UTF-8"></property>
        <!-- 속성으로 "" 안쪽에 < or & 기호가 들어가면 안된다, 특수 기호로 변경해서 사용해야 함 &amp; -->
        <property name="username" value="mysql아이디"></property>
        <property name="password" value="mysql비밀번호"></property>                  
      </bean>	
          
      <!-- XML내에 작성된 sql문을 호출하는 객체: SqlMapClient(iBatis), SqlSession(MyBatis) -->
      <bean class="org.mybatis.spring.SqlSessionFactoryBean"
            id="sqlSessionFactory">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation"
                  value="classpath:/mybatis-config.xml"></property>
          
        <!-- sql문 작성된 mapperXML문서 등록 -->                 
        <property name="mapperLocations"
                  value="classpath:mappers/*.xml"></property>                       
      </bean>
          
      <!-- SqlSession 객체 -->
      <bean class="org.mybatis.spring.SqlSessionTemplate"
            destroy-method="clearCache">
        <constructor-arg ref="sqlSessionFactory"></constructor-arg>
      </bean>
          
      <!-- 모든 DAO, DAOImpl클래스는  repository 패키지 밑에 작성하겠음!! -->
      <context:component-scan base-package="패키지명"/>
          
      <!-- 모든 Service, ServiceImpl클래스는  service 패키지 밑에 작성하겠음!! -->
      <context:component-scan base-package="패키지명"/>
      
  • pom.xml 에 dependency를 추가해준다

    • <!-- MySQL 드라이버추가 -->
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
      </dependency>
          
      <!-- 스프링 JDBC연동 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${org.springframework-version}</version>
      </dependency>
          
      <!-- MyBatis라이브러리 -->
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.1</version> 
      </dependency>  <!-- mybatis.3.4.1.jar -->
          
          
      <!-- 스프링 MyBatis연동 -->
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.0</version>
      </dependency>
          
      <!-- 스프링 Transaction 처리 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${org.springframework-version}</version>
      </dependency>        	
      
  • src/main/resorces/mappers/product.xml 에 sql문으로 사용될 것들을 입력해준다

    • namespace 필수

    • 태그명이 DML이 된다

    • <!DOCTYPE mapper
          PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
          "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
      <mapper namespace="product"> 
        <insert id="insert">
        	insert into product (pid, pname)
          values (#{pid}, #{pname})
        </insert>
        <select id="selectAll" resultType="Product">
        	select * from product
        </select>
      </mapper>
      
  • src/main/resources/mybatis-config.xml 에 모델로 쓰일 클래스가 있는 패키지를 등록한다

    • <configuration>
       <!-- mybatis-config.xml -->
        <typeAliases>
          <package name="모델이 있는 패키지명"/>
        </typeAliases>
      </configuration>
      
  • repoImple이나 daoImpl에서 메서드를 구성한다

    • 클래스에 @Repogitory 어노테이션 사용

    • SqlSession에 @Autowired를 사용하여 sql문을 호출할 수 있도록 해준다

    • SqlSession 아래에 메서드들이 많은데 적당한 것을 골라 product.xml에서 지정한 namespace.id로 접근한다

    • sqlSession.selectList() : 다수의 결과값 리턴

    • sqlSession.selectOne() : 하나의 결과값 리턴

    • @Repogitory
      public class ProductRepoImpl implements ProductRepo {
        @Autowired
        private SqlSession sqlSession; // sql문 호출하는 객체
            
        public List<Product> selectAll() {
          return sqlSession.selectList("product.selectAll");
        }
      }
      
  • serviceImpl 에서 메서드를 구현해준다

    • @Service
      public class ProductServiceImpl implements ProductService {
        @Autowired
        ProductRepo repo;
            
        public List<Product> findAll() {
          return repo.selectAll();
        }
      }
      
  • controller에서 알맞게 호출해준다

    • @Controller
      public class ProductController {
        @Autowired
        private ProductService service;
            
        @PostMapping("/form")
        public String form(Product product, Model model) throws SQLException {
          service.registry(product);
          model.addAttribute("product", product);
          return "product/result";
        }
            
        @RequestMapping("list")
        public String list(Model model) throws SQLException {
          List<Product> productList = new ArrayList<Product>();
          model.addAttribute("products", service.findAll());
          return "product/list";
        }
      }
      
    • @PostMapping("form")@RequestMapping(value="/form", method = RequestMethod.POST)와 같다

    • @GetMapping("/form")@RequestMapping(value="/form", method = RequestMethod.GET)와 같다


Spring 구조

  • pom.xml
    • 필요한 라이브러리를 센터저장소에서 로컬로 다운받아, 현재 프로젝트에 사용할 수 있게 넣어줌
    • 디펜던시 복사해서 추가하는 방법
  • WEB-INF/web.xml
    • 설정파일의 위치
      • 객체관리 컨테이너의 설정파일 위치 root-context.xml
      • 컨트롤러의 위치 servlet-context.xml
    • DispatcherServlet의 위치
    • 한글 처리 필터
  • spring/appServlet/servlet-context.xml
    • 리소스 위치 설정
    • ViewResolver 설정
    • 컨트롤러들을 설정
  • Controller
    • @Component
      • @Repository : DB 관련 클래스
      • @Service : Service 관련 클래스
      • @Controller : MVC Controller 클래스
  • spring/root-context.xml
    • DB 설정
      • sqlMapper의 위치 : mappers/*.xml
      • 네임스페이스 위치 : mybatis-config.xml
    • 컨트롤러를 제외한 나머지 모든 객체의 관리
    • context 사용 시 Namespaces -> context 체크 필수
  • resources/mappers/guest.xml
    • sql 문장
  • resources/mybatis-config.xml
    • 네임스페이스 : sql 문장에서 사용해야하는 패키지 등록
  • service, dao …