ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC2 - 4. MyBatis
    JAVA/웹 프로그래밍 - Spring 2020. 12. 18. 21:40

    아래의 내용을 이어서 진행해보자.

    designatedroom87.tistory.com/342

     

    Spring MVC2 - 3. Spring을 통해서 DB에 접근하기

    아래의 내용과는 이어지지 않는다. designatedroom87.tistory.com/341 Maven Project를 선택하고 Next를 선택한다. create simple project를 체크하고 Next를 선택한다. artifact id는 프로젝트 이름이다. wa.." d..

    designatedroom87.tistory.com

     

    src/main/java에서 mybatis라는 패키지를 하나 만든다.

    그리고 아래와 같이 이클립스의 Help 탭에서 Eclipse Marketplace를 선택한다.

     

    아래와 같이 mybatis 라고 검색하고 generator로 설치하자. Install을 선택한다.

     

    mybatis가 잘 설치가 되었는지 확인해보자. 

    현재의 프로젝트를 선택하고 우클릭해서 New -> Other -> mybatis를 입력하자.

    그러면 아래와 같이 설정 파일이 뜨면 된다.

     

    그리고 pom.xml에 설정할 내용이 많다.

    우선 아래의 내용 전체를 pom.xml에 덮어쓰자.

    pom.xml

    더보기
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.iot</groupId>
      <artifactId>springjdbc</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <properties>
    		<java-version>1.8</java-version>
    		<maven.compiler.source>1.8</maven.compiler.source>
    		<maven.compiler.target>1.8</maven.compiler.target>
    		<org.springframework-version>5.2.9.RELEASE</org.springframework-version>
    		<org.aspectj-version>1.6.10</org.aspectj-version>
    		<org.slf4j-version>1.6.6</org.slf4j-version>
    	</properties>
    	
    	<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-api -->
    <dependency>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-api</artifactId>
        <version>9.0.39</version>
    </dependency>
    
    
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.2.9.RELEASE</version>
        <scope>test</scope>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.9.RELEASE</version>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.9.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    
    <!-- mybatis -->
    <!-- mybatis 프레임워크 사용하기 위해 -->
    		<dependency>
    		    <groupId>org.mybatis</groupId>
    		    <artifactId>mybatis</artifactId>
    		    <version>3.5.5</version>
    		</dependency>
    		<!-- mybatis와 spring 연동하기 위해 -->
    		<dependency>
    		    <groupId>org.mybatis</groupId>
    		    <artifactId>mybatis-spring</artifactId>
    		    <version>2.0.5</version>
    		</dependency>
    <!-- jdbc Connection Pool -->
    		<dependency>
    	        <groupId>com.zaxxer</groupId>
    	        <artifactId>HikariCP</artifactId>
    	        <version>3.4.5</version>
    	    </dependency>
    
    <!-- Logging -->
    		<dependency>
    			<groupId>org.slf4j</groupId>
    			<artifactId>slf4j-api</artifactId>
    			<version>${org.slf4j-version}</version>
    		</dependency>
    		<dependency>
    			<groupId>org.slf4j</groupId>
    			<artifactId>jcl-over-slf4j</artifactId>
    			<version>${org.slf4j-version}</version>
    			<scope>runtime</scope>
    		</dependency>
    		<dependency>
    			<groupId>org.slf4j</groupId>
    			<artifactId>slf4j-log4j12</artifactId>
    			<version>${org.slf4j-version}</version>
    			<scope>runtime</scope>
    		</dependency>
    		<dependency>
    			<groupId>log4j</groupId>
    			<artifactId>log4j</artifactId>
    			<version>1.2.15</version>
    			<exclusions>
    				<exclusion>
    					<groupId>javax.mail</groupId>
    					<artifactId>mail</artifactId>
    				</exclusion>
    				<exclusion>
    					<groupId>javax.jms</groupId>
    					<artifactId>jms</artifactId>
    				</exclusion>
    				<exclusion>
    					<groupId>com.sun.jdmk</groupId>
    					<artifactId>jmxtools</artifactId>
    				</exclusion>
    				<exclusion>
    					<groupId>com.sun.jmx</groupId>
    					<artifactId>jmxri</artifactId>
    				</exclusion>
    			</exclusions>
    			<scope>runtime</scope>
    		</dependency>
    		<!-- Spring -->
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-context</artifactId>
    			<version>${org.springframework-version}</version>	<!-- 위에서 받은 버전을 가지고 올 수 있다. -->
    			<exclusions>
    				<!-- Exclude Commons Logging in favor of SLF4j -->
    				<exclusion>
    					<groupId>commons-logging</groupId>
    					<artifactId>commons-logging</artifactId>
    				 </exclusion>
    			</exclusions>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-webmvc</artifactId>
    			<version>${org.springframework-version}</version>
    		</dependency>
    				
    	</dependencies>
    </project>

    위의 pom.xml의 내용에 아래와 같은 내용이 나오는데, 의미는 아래와 같다.

    Connection 객체를 미리 만들어둔다. Connection 객체는 id,pw,url이필요하다.
    클라이언트가 접속하면 connection을 하나씩 꺼낸다.
    미리 connection을 만들어 둔다. 쓰고나면 다시 회수한다.
    정보들을 미리 설정한다.

     

     

    간혹, 에러가 나는 경우도 있는데, 이에 대한 처리는  이클립스를 닫고 아래의 경로로 이동한 다음 repository폴더 내의 모든 내용을 지우고 다시 이클립스를 열면 된다. 그러면 이클립스에서 자동으로 다시 다운로드를 한다.

    그런데 절대로 repository폴더는 지우면 안 된다.

     

     

    그리고, 특별한 말이 없으면 파일들은 모두 mybatis 패키지에 만든다.

    인터페이스를 만들어야 한다.

    우선 Member.java 파일을 만든다. 이는 모델의 역할을 한다. jdbc패키지의 Member.java와 같다.

    Member.java 

    더보기
    package mybatis;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Member {
    	String id;
    	String password;
    	
    	/*
    	 	create table member(id varchar(20), password varchar(20));
    	 	insert into member values('hong', '1234');
    	 	select * from member;
    	 	update member set password='1111' where id ='hong';
    	 	delete from member where id='hong';
    	*/
    	public Member() {}
    	
    	public Member(String id, String password) 
    	{
    		this.id = id;
    		this.password = password;
    	}
    
    	public String getId() {return id;}
    	public void setId(String id) {this.id = id;}
    	public String getPassword() {return password;}
    	public void setPassword(String password) {this.password = password;}
    
    	@Override
    	public String toString() {
    		return "Member [id=" + id + ", password=" + password + "]";
    	}
    }

     

     

     

    그리고 MemberService라는 인터페이스를 만든다.

    내용은 아래와 같다.

    MemberService는 인터페이스이며 이는 DB구현을 한다.

    MemberService.java 파일 내용

    더보기
    package mybatis;
    
    import java.util.List;
    
    public interface MemberService {
    	public void insert(String id, String password);	//	저장하는 함수
    	public String select(String id);				//	개별 출력 함수
    	public List<Member> getList();					//	리스트를 들고 오는 함수
    	public boolean update(Member member);			//	수정하는 함수
    	public boolean delete(String id);				//	삭제하는 함수
    }

     

     

     

    다시 인터페이스를 또 만든다.

    MemberMapper라고 이름을 짓는다. 자바 파일이다.

    MemberMapper는 인터페이스이며, MemberMapper.xml의 인터페이스이다.

    MemberMapper인터페이스는 MemberService와 비슷한 역할을 한다.

    MemberMapper인터페이스는 sql문을 사용하기 위한 인터페이스이다.

    sql문은 MemberMapper.xml에 정의되어 있다.

    MemberMapper.java 파일 내용

    더보기

     

    package mybatis;
    
    import java.util.List;
    
    //	인터페이스 mapper java파일과 xml파일의 이름은 일치해야 한다.
    public interface MemberMapper {
    	public int insert(String id, String password);	//	저장하는 함수
    	public String select(String id);				//	개별 출력 함수
    	public List<Member> getList();					//	리스트를 들고 오는 함수
    	public int update(Member member);				//	수정하는 함수
    	public int delete(String id);					//	삭제하는 함수
    }

     

     

     

    그리고 이 패키지에 다음과 같이 mybatis 설정 파일을 하나 추가한다.

     

    이름은 다음과 같다.

    MemberMapper.xml이라고 하자.

     

     

     

    MemberMapper.xml에는 sql문을 집어넣어 구현했다.

    MemberMapper.xml은 sql문을 위한 xml이다.

    resultType은 반환하는 값을 의미한다.

    parameterType은 매개변수의 타입을 의미한다.

    MemberMapper.java를 이용해서 사용할 구현 객체를 만들어보자.

    아래의 내용을 복사해서 쓰자.

    MemberMapper.xml

    더보기
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <!-- mybatis패키지 내의  MemberMapper 파일을 쓰겠다는 의미-->
    <mapper namespace="mybatis.MemberMapper">
    
    <!-- public int insert(String id, String password); -->
    <insert id="insert">
    insert into member values(#{id},#{password})
    </insert>
    
    <!-- public String select(String id); -->
    <select id="select" resultType="java.lang.String">
    select password from member where id=#{id}
    </select>	
    	
    <!-- public List<Member> getList(); -->		
    <select id="getList" resultType="mybatis.Member">
    select id,password from member
    </select>					
    								
    <!-- public int update(Member member);	 -->
    <update id="update" parameterType="mybatis.Member">
    update member set password=#{password} where id=#{id}
    </update>	
    				
    <!-- public int delete(String id); -->	
    <delete id="delete" parameterType="java.lang.String">
    delete from member where id=#{id}
    </delete>	
    					
    </mapper>

     

     

     

    MemberServiceImpl 자바 파일을 만든다.

     

    아래는 MemberServiceImpl.java 내용 

    MemberServiceImpl클래스는 인터페이스 MemberService를 상속해서 정의한 클래스이다.

    @Autowired는 자동으로 mapper를 연결해준다.

    ( MemberMapper.xml의 내용을 자동으로 연결 )

    MemberServiceImpl.java 파일 내용

    더보기
    package mybatis;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service("memberservice")
    public class MemberServiceImpl implements MemberService{
    	
    	@Autowired
    	private MemberMapper mapper;	//	sql xml 인터페이스(sqlMapper.xml)
    	
    	@Override
    	public void insert(String id, String password) {
    		//	sqlmapper.xml의 insert메소드가 호출된다.
    		System.out.println(this.mapper.insert(id, password) == 0 ? "실패" : "성공");
    	}
    
    	@Override
    	public String select(String id) {	
    		//	sqlmapper.xml의 select메소드가 호출된다.
    		return this.mapper.select(id);	
    	}
    
    	@Override
    	public List<Member> getList(){	
    		//	sqlmapper.xml의 getList메소드가 호출된다.
    		return this.mapper.getList();	
    	}
    
    	@Override
    	public boolean update(Member member) {
    		//	sqlmapper.xml의 update메소드가 호출된다.
    		return this.mapper.update(member) == 1 ? true : false;
    	}
    	
    	@Override
    	public boolean delete(String id) {
    		//	sqlmapper.xml의 update메소드가 호출된다.
    		return this.mapper.delete(id) == 1 ? true : false;
    	}
    }

     

     

     

    mybatisConfig.xml 의 내용은 아래와 같다. (DB연결에 필요한 내용은 dataSource에 있다.)

    우리가 앞에서 dataSource를 사용했었다. 

    이 dataSource는 preparedStatement, Connection 등에 대한 역할을 한다.

    이는 다시 mybatis한테 연결해준다. 이 mybatis가 DB에 접근한다.

    이 접근을 위해서 설정이 필요하다. 이는 mybatisConfig.xml에서 한다.

    위와 같이 MyBatis Generator configuration File로 만든다.

    복사해서 덮어쓰자.

    mybatisConfig.xml

    더보기
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
    	xsi:schemaLocation="http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
    		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
    <!-- mybaties DB 설정 -->
    <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="hr"></property>
    	<property name="password" value="1234"></property>
    </bean>
    
    <context:component-scan base-package="mybatis" />
    <mybatis-spring:scan base-package="mybatis" />
    
    <!--DB연결에 필요한 내용은 dataSource에 있다. 
    	dataSource는 DriverManager에서 만들었는데, 이번에는 다른 경로를 통해 생성한다.
    	DB datasource bean 생성
    -->
    <bean id="ds" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    	<constructor-arg ref="hikariConfig"></constructor-arg>
    </bean>
    
    <!--mybaties 사용 bean 생성-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="dataSource" ref="ds"></property>
    </bean>
    
    </beans>

    bean태그에서 클래스 파일을 이용해서 객체를 생성한다.
    그 때 필요한 내용이 오라클 드라이버, 오라클에 접속하기 위한 주소, 아이디,비번이 필요하다.

    memberservice는 만든 적이 없는데 만들 수 있게 만드는 것이 위의 캡쳐한 두 문장 중에 첫 문장때문이다.

    그리고 아래 문장은 스프링 관련 스캔할 수 있도록 해주기 위한 문장이다.

    base-package를 설정해서 @Component, @Service 등을 스캔할 수 있게 해야 한다. 이는 반드시 있어야 한다.

     

    그리고 아래는 mybaties 사용 bean 생성(SQL문법에 대한 부분)에 대한 내용이다.

     

    그리고 이 파일 좌측 하단에 다음과 같은 목록이 보일 것이다.

    Namespaces탭으로 이동하자.

    그리고 아래와 같이 context와 mybatis-spring 둘 다 체크한다.

     

     

     

    실행을 위해 Main.java파일을 만든다.

    ClassPathXmlApplicationContext를 통해 설정 파일을 로드한다.

    그리고 getBean메소드를 통해 객체를 가지고 온다. 

    Main.java 파일 내용

    더보기
    package mybatis;
    
    import java.sql.SQLException;
    
    import javax.sql.DataSource;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.jdbc.datasource.DriverManagerDataSource;
    import org.springframework.stereotype.Repository;
    import java.util.List;
    
    public class Main {
    	 public static void main(String[] args) 
    	 { 
    		 ApplicationContext context = new ClassPathXmlApplicationContext("mybatis/mybatisConfig.xml");
    	  
    		 MemberService service = (MemberService)context.getBean("memberservice", mybatis.MemberServiceImpl.class);
    	  
    		 List<Member> list = service.getList();
    		 
    		 for (Member m : list)
    			 System.out.println(m);
    	 }
    }

     

     

    Main.java에서 다음과 같이 실행시켜보자.

     

    다음과 같이 출력 된다.

     

    그리고 위의 Main.java에서 나머지 함수들도 호출해보자.

     

     

    mybatis를 사용하기 위한 설정에는 아래와 같다.

    1. lib pom 설정

    2. connection pool에 대한 bean 설정을 한다. ( mybatisConfig.xml 에서 )

        datasource는 connection을

         sqlSessionFactory라는 bean은 sql문을 담당한다. 이는 스프링을 이용한다

     

    아래는 기본 접근 구조이다.

    구현 인터페이스를 통해서 mapper 인터페이스를 통하고 mapper.xml의 sql에 접근한다.

     

     

    외부 설정으로 돌려서 외부에서 설정파일 가져오자.

    이에 대한 내용은 앞에서 언급을 하였다. 우리가 설정파일에서 고정된 내용은

    오라클 드라이버에 대한 내용, 주소, 아이디, 비밀번호이다. 이에 대한 내용을 따로 다른 파일에 저장한 이후에

    필요한 부분에서 이 내용을 로드해서 쓸 수 있다.

    즉, 오라클 접속에 관한 내용을 따로 외부 파일에 저장하고 이 정보가 필요한 쪽에서 이 파일의 정보를

    가져와서 쓰면 된다.

    jdbc패키지의 Main.java로 이동한다.

    jdbc패키지의 Main.java

    더보기
    package jdbc;
    
    import java.sql.SQLException;
    import javax.sql.DataSource;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import java.util.List;
    
    public class Main {
    	
    	@Test
    	public void dataSourceTest()
    	{
    		//	classpath는 resources가 중심이 된다.
    		
    		//	classpath : 가 붙지 않은 경우 현재 src/main/resources가 기본 경로가 됨
    		//ApplicationContext context = new ClassPathXmlApplicationContext("jdbc/dbconfig.xml");
    		
    		//	classpath : 이 붙을 경우 src/main/java가 기본 경로가 됨
    		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:jdbc/dbconfig.xml");
    		
    		DataSource ds = (DataSource)context.getBean("dataSource"); 
    		
    		context.getBean("dataSource");
    		
    		try { System.out.println(ds.getConnection()); } 
    		catch (SQLException e) {	e.printStackTrace(); } 
    		
    		JDBCService service = context.getBean("oracleMemberDAO",jdbc.db.OracleMemberDAO.class);
    		
    		System.out.println(service.count());
    		
    		List<Member> list = service.select();
    		
    		for (Member m : list) System.out.println(m.toString()); 
    	}
    }

     

    기존의 jdbc패키지의 dbconfig.xml을 복사해서 src/main/resources에 붙여넣는다.

    dbconfig.xml 에서 변경된 내용은 아래와 같다.

    아래의 내용은 외부 파일에서 정보를 가지고 오는 것이다. 

    src/main/resources의 dbconfig.xml 의 내용

    dbconfig.xml

    더보기
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
    <!-- Namespaces에서 context를 체크 해야 한다. -->
    <context:component-scan base-package="jdbc.db" />
    
    <!--아래 문장을 호출해야 db.properties에 있는 내용을 가지고 올 수 있다. 
    	classpath는 src/main/resources가 기본겨로가 된다.
    -->
    <context:property-placeholder location="classpath:db.properties" />
    
    <!-- 클래스를 생성하고 나서, set메소드를 통해 데이터들을 주입한다. 
    -->
    
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    	<!-- DB연결에 필요한 정보
    	setDriverClassName 함수가 있다. 매개변수 이름이  driverClassName 이다. -->
    	<property name="driverClassName" value="${driverClassName}"></property>
    	<property name="url" value="${url}"></property>
    	<property name="username" value="${username}"></property>
    	<property name="password" value="${password}"></property>
    </bean>
    
    <!-- 외부의 db.properties파일에서 읽어와야 하므로, 아래아 같이 context태그를  추가한다. -->
    <!-- <context:property-placeholder location="classpath:jdbc/db.properties"/>
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    	DB연결에 필요한 정보
    	setDriverClassName 함수가 있다. 매개변수 이름이  driverClassName 이다.
    	<property name="driverClassName" value="${driverClassName}"></property>
    	<property name="url" value="${url}"></property>
    	<property name="username" value="${username}"></property>
    	<property name="password" value="${password}"></property>
    </bean> -->
    		
    <!-- mvc2에서 connection conn의 역할을 한다. 
    	위에서 생성한 "dataSource"가 필요하다.
    -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    	<!-- <constructor-arg><ref bean="dataSource" /></constructor-arg> -->
    	<constructor-arg ref="dataSource" />
    </bean>
    
    </beans>

     

    그리고, src/main/resources에 라는 이름의 파일을 만든다.

    src/main/resources의 db.properties 파일 내용

    driverClassName=oracle.jdbc.driver.OracleDriver
    url=jdbc:oracle:thin:@localhost:1521:xe
    username=hr
    password=1234

     

    jdbc패키지의 Main.java를 실행해보자.

    아래와 같이 JUnit Test로 실행하면 된다.

     

    아래는 실행결과이다.

     

     

    전체 프로젝트 내용

    springjdbc.zip
    0.03MB

     

    댓글

Designed by Tistory.