예제>

jdbc를 사용하는 방식에서 Mybatis로 변경하는 경우
 --> 의존관계 결합도가 강한것일수록 수정의 범위가 크다.
 --> spring인 경우 수정의 범위는 ?

 --> JdbcDao를 사용하다 MybatisDao로 변경할 경우 spring이 아닌경우는 수정이 불가피하나 spring인 경우는 xml만 변경하면 된다.

 

 

(1) TestMain.java
(2) InsertAction.java
(3) UpdateAction.java
(4) JdbcDao.java
(5) MybatisDao.java
(6) CommonDao.java

 

 

(1) TestMain.java

; InsertAction, UpdateAction  메소드 호출.

package test.di3;

public class TestMain {
    public static void main(String[] args) {
        InsertAction insert = new InsertAction();
        insert.execute("hong jil dong");
       
        UpdateAction update = new UpdateAction();
        update.execute("kim jil dong");
    }
}

 

(2) InsertAction.java
; JdbcDao의 insert()사용.

package test.di3;

public class InsertAction {
    private JdbcDao dao;
   
    public void execute(String name){
        dao = new JdbcDao();
        dao.insert(name);
    }
}

 

(3) UpdateAction.java
; JdbcDao의 update()사용.

package test.di3;

public class UpdateAction {
    private JdbcDao dao;  
    public void execute(String name){
        dao = new JdbcDao();                
        dao.update(name);
    }
}

 

(4) JdbcDao.java

;

package test.di3;

public class JdbcDao implements CommonDao{
    public void insert(String name){
        System.out.println("JDBC를 사용해서 " + name + " 추가");
    }
    public void delete(String name){
        System.out.println("JDBC를 사용해서 " + name + " 삭제");

    }
    public void update(String name){
        System.out.println("JDBC를 사용해서 " + name + " 수정");
    }
    public void select(String name){
        System.out.println("JDBC를 사용해서 " + name + " 조회");
    }
}

 

 


- JdbcDao를 사용하다가 MybatisDao로 변경하는 경우.
CommonDao 인터페이스를 만들고 MybatisDao에서 구현하는 방식으로 변경.
( JdbcDao의 메소드와 동일하게 구현해야 하기 때문에 추상클래스로 )

InsertAction, UpdateAction 변경.

 

(6) CommonDao.java

package test.di3;

// DAO가 가져야 할 기능들의 목록을 제시
public interface CommonDao {
    public void insert(String name);
    public void update(String name);
    public void delete(String name);
    public void select(String name);
}

 

(5) MybatisDao.java

package test.di3;

public class MybatisDao implements CommonDao{

    @Override
    public void insert(String name) {
        System.out.println("Mybatis를 사용해서 " + name + " 추가");
    }

    @Override
    public void update(String name) {
        System.out.println("Mybatis를 사용해서 " + name + " 수정");
    }

    @Override
    public void delete(String name) {
        System.out.println("Mybatis를 사용해서 " + name + " 삭제");
    }

    @Override
    public void select(String name) {
        System.out.println("Mybatis를 사용해서 " + name + " 조회");
    }   
}

 

(2) InsertAction.java

package test.di3;

public class InsertAction {
    //private JdbcDao dao;
    private CommonDao dao;
   
    public void execute(String name){
        //dao = new JdbcDao();
        dao = new MybatisDao();
        dao.insert(name);
    }
}

 

(3) UpdateAction.java

package test.di3;

public class UpdateAction {
    //private JdbcDao dao;
    private MybatisDao dao;
   
    public void execute(String name){
        //dao = new JdbcDao();
        dao = new MybatisDao();
               
        dao.update(name);
    }
}

;  MybatisDao 로 수정이 불가피하다.

 

 


 

 

SPRING식으로 개발하면

(1) TestMain.java
(2) InsertAction.java
(3) UpdateAction.java
(4) JdbcDao.java
(5) MybatisDao.java
(6) CommonDao.java
(7) test04.xml

 

(1) TestMain.java

package test.di4;

 

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

 

 

public class TestMain {
    public static void main(String[] args) {
        String res = "test/di4/test04.xml";
        ApplicationContext context = new ClassPathXmlApplicationContext(res);
        InsertAction insert = (InsertAction)context.getBean("insert");
        insert.execute("홍길동");
        UpdateAction update = (UpdateAction)context.getBean("update");
        update.execute("김길동");
    }
}

 


(2) InsertAction.java

package test.di4;

 

public class InsertAction {
    private CommonDao dao;
    public void setDao(CommonDao dao) {
        this.dao = dao;
    }
    public void execute(String name){
        dao.insert(name);
    }
}

 

 

(3) UpdateAction.java

package test.di4;

 

public class UpdateAction {
    private CommonDao dao;
   
    public void setDao(CommonDao dao) {
        this.dao = dao;
    }   
    public void execute(String name){   
        dao.update(name);
    }
}


(6) CommonDao.java

package test.di4;

 

// DAO가 가져야 할 기능들의 목록을 제시
public interface CommonDao {
    public void insert(String name);
    public void update(String name);
    public void delete(String name);
    public void select(String name);
}

 

(4) JdbcDao.java

package test.di4;

public class JdbcDao implements CommonDao{
    public void insert(String name){
        System.out.println("JDBC를 사용해서 " + name + " 추가");
    }
    public void delete(String name){
        System.out.println("JDBC를 사용해서 " + name + " 삭제");
    }
    public void update(String name){
        System.out.println("JDBC를 사용해서 " + name + " 수정");
    }
    public void select(String name){
        System.out.println("JDBC를 사용해서 " + name + " 조회");
    }
}


(5) MybatisDao.java
; JDBC에서 Mybatis로 변경하는 경우.

package test.di4;

public class MybatisDao implements CommonDao{
    @Override
    public void insert(String name) {
        System.out.println("Mybatis를 사용해서 " + name + " 추가");
    }
    @Override
    public void update(String name) {
        System.out.println("Mybatis를 사용해서 " + name + " 수정");
    }
    @Override
    public void delete(String name) {
        System.out.println("Mybatis를 사용해서 " + name + " 삭제");
    }
    @Override
    public void select(String name) {
        System.out.println("Mybatis를 사용해서 " + name + " 조회");
    }   
}

 

 

(7) test04.xml

; <bean id="dao" class="test.di4.JdbcDao"/> 에서
    <bean id="dao" class="test.di4.MybatisDao"/> 로 변경하면 수정 끝이다.
; 의존성이 낮을 수록 수정이 적고, 유지보수가 용이하단다.

; namespace에서 p 속성 선택하면 <property> 을 p로 줄여쓸수 있다.

    <bean id="insert" class="test.di4.InsertAction" >
        <property name="dao" ref="dao"/>
    </bean>

<bean id="insert" class="test.di4.InsertAction" p:dao-ref="dao"/>

 

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

   <bean id="dao" class="test.di4.MybatisDao"/>
    <!-- <bean id="insert" class="test.di4.InsertAction" >
        <property name="dao" ref="dao"/>
    </bean>
    <bean id="update" class="test.di4.UpdateAction">
        <property name="dao" ref="dao"/>
    </bean> -->
    <bean id="insert" class="test.di4.InsertAction" p:dao-ref="dao"/>
    <bean id="update" class="test.di4.UpdateAction" p:dao-ref="dao"/>
</beans>




 

- DI( dependency injection )

 

- 의존관계 주입

의존관계를 간단히 설명하면
A {
    B b;
    b = new B();
    ...
}
A클래스에서 B클래스를 new로 만들어 사용한다.
A클래스와 B클래스는 의존관계가 있다 라고 ..

주입은 외부에서 이런 의존성 관계를 설정하는 것 ..

 

 

주입의 2가지 방법>

1) 생성자를 통한 주입
2) setter메소드로 주입

 

 

 

파일 목록

(1) TestMain.java
(2) MemberDao.java
(3) InsertController.java
(4) ListController.java
(5) test02.xml

 

 

 

 

( Spring 인 경우 S 자가 보인다. )

 

 

(1) TestMain.java

package test.di2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {
    public static void main(String[] args) {
        String res="test/di2/test02.xml";
        ApplicationContext context = new ClassPathXmlApplicationContext(res);
       
       InsertController insert =(InsertController)context.getBean("insert");
        insert.execute();
       
       ListController list1= (ListController)context.getBean("list1");
        list1.execute();
    }
}

 

 

(2) MemberDao.java
; 간단한 출력 만듬.
; 멤버변수 url 선언.

package test.di2;

public class MemberDao {
    private String url;
    public void setUrl(String url) {
        this.url = url;
    }
    public String getUrl() {
        return url;
    }
    public void insert(String id){
        System.out.println(id + "님을 추가했습니다.");
    }
    public void update(String id){
        System.out.println(id + "님을 수정했습니다.");
    }
    public void delete(String id){
        System.out.println(id + "님을 삭제했습니다.");
    }
    public void getinfo(String id){
        System.out.println(id + "님을 조회했습니다.");
    }
}

 

 

(3) InsertController.java
; setter 를 통한 주입

package test.di2;

public class InsertController {
    private MemberDao dao;
   
    public void setDao(MemberDao dao) {
        this.dao = dao;
    }

   
    public void execute(){
        dao.insert("Hong Jil Dong");
    }
}

 

(4) ListController.java
; 생성자 통한 주입

package test.di2;

public class ListController {
    private MemberDao dao;
   
    public ListController(){}
   
    public ListController(MemberDao dao){
        this.dao = dao;
    }

    public void execute(){       
        dao.getinfo("홍길동");
    }
}

 


(5) test02.xml
; id는 고유한 값.
; name  id의 별칭
; class  Bean클래스 이름.패키지.클래스이름의 완전한 형태
; singleton  기본이 싱글톤
; 자식태그
   생성자 통한주입 <constructor-arg>
    setter 통한 주입  <property>

; 위에 생성된것을 참조할때는 ref
; 일반 변수에 값도 주입

 

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <!-- 스프링에 주입하기 -->
   
    <!-- MemberDao타입의 dao객체를 만들어라.(스프링은 기본적으로 싱글톤으로 만든다.) -->
   
    <bean id="memdao" class="test.di2.MemberDao">
        <!-- 단순 스트링 값 은 value -->
        <property name="url" value="localhost"/>
    </bean>

   
    <bean id="insert" class="test.di2.InsertController">

         <!-- setter로 객체 주입하기 -->

         <!-- 위에서 만든 것(생성된것)을 참조할때는 ref -->
        <property name="dao" ref="memdao"/>
    </bean>
   
    <bean id="list1" class="test.di2.ListController">
        <!-- 생성자로 객체 주입하기 -->
        <constructor-arg ref="memdao"/>
    </bean>
</beans>

 

 

 

 

 

스프링에서는 new로 객체를 생성하지 않는다 라고 하는데..


기본적인 사용법 예제>

- 해당 라이브러리를 web-inf/lib에 복사
- 자바 콘솔 모드로 .

 

파일목록>

(1) MyPerson.java
(2) TestMain.java
(3) test01.xml

 

 

(1) MyPerson.java
: 멤버변수 선언, getter, setter

package test.di1;

public class MyPerson {
    private String name;
    private int age;
    private String phone;
   
    public MyPerson(){}
   
    public MyPerson(String name, int age, String phone) {
        super();
        this.name = name;
        this.age = age;
        this.phone = phone;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
}

 

(2) TestMain.java

package test.di1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {
    public static void main(String[] args) {
        MyPerson per = new MyPerson();
        //per객체에 값을 저장하고 출력해 보세요.
        per.setName("KIM");
        per.setAge(10);
        per.setPhone("010-000-9999");
       
        System.out.println("이름:" + per.getName());
        System.out.println("나이:" + per.getAge());
        System.out.println("전화번호:" + per.getPhone());
    }
}

 

new로 생성해서 getter 메소드 호출하여 출력한다.

 

이것을 spring으로 바꾸면


 

package test.di1;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {
    public static void main(String[] args) {
//        MyPerson per = new MyPerson();
//        //per객체에 값을 저장하고 출력해 보세요.
//        per.setName("hong");
//        per.setAge(10);
//        per.setPhone("010");
//       
//        System.out.println("이름:" + per.getName());
//        System.out.println("나이:" + per.getAge());
//        System.out.println("전화번호:" + per.getPhone());
       
        String res="test/di1/test01.xml";
        //classpath의 위치에 있는 test01.xml을 읽어와 객체를 생성해줌.
       ApplicationContext context = new ClassPathXmlApplicationContext(res);
        
        //생성된 객체중 id가 person인 객체를 꺼내온다.
        MyPerson person = (MyPerson)context.getBean("person");
        System.out.println("이름:" + person.getName());
        System.out.println("나이:" + person.getAge());
        System.out.println("전화번호:" + person.getPhone());
    }
}

; context.getBean는 object타입으로 반환하기 때문에 형변환해줘야 한다.
; new를 하지 않았는데 person변수 사용하고 있다.
  person.getName()...




(3) test01.xml

; xml을 생성해야 한다. spring 체험을 위해.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
   
    <!--  빈 설정파일(스프링이 생성할 자바객체에 대한 주문서) -->
   
    <!-- MyPerson타입의 객체 person을 만들어라. -->
    <!-- default 생성자를 호출함. -->
    <bean id="person" class="test.di1.MyPerson">
        <!-- 멤버변수name에 '홍길동'을 넣어라 -->
        <!-- setter메소드 -->
        <property name="name" value="KIM"/>
        <!-- 멤버변수 age에 10을 넣어라. -->
        <property name="age" value="10"/>
        <property name="phone" value="010-000-1111"/>
    </bean>
</beans>



결과는 동일하다. beans 라는 것을 이용해서 ..

xml 은 STS(spring tool suite)에서는 해당위치에서 마우스 우측 / new/other/






spring bean configuration file선택.
default 로 선택하고 나중에
해당 namespace를 변경할수 있다.


1. Mybatis 사이트
http://blog.mybatis.org/



products 로 이동.



Integration의 Spring 으로



mybatis-spring-1.0.0.jar 다운





mybatis는 3.0.4버전을 다운받아 사용함. 상위버전은 에러가 발생한다. spring3.1.1과 잘안되는 건지 뭐가 문제인지 모르겠다.








1. STS 사용시

 

1) STS 설치

http://www.springsource.org/








해당 OS에 맞는 것을 다운받아 설치한다.



--> 다운로드
--> 설치
--> 설치시 jdk, tomcat경로 지정해야 함.



2) 관련 라이브러리 다운로드

사이트 아래쪽을 보면 Downloads가 있다.



이중에서 3.1.1.RELEASE를 받을 것이다. (해당하는 것을 찾아 받으면 된다. 나는 3.1.1...)

spring-framework 3.1.1버전으로 너무 최신이면 찜찜해서..




- spring-framework-3.0.2.RELEASE-dependencies.zip도 다운로드.




spring-framework-3.1.1.RELEASE는 압축을 풀면 \spring-framework-3.1.1.RELEASE\dist 경로에 jar파일이 존재한다. 관련 jar파일을 복사해 WEB-INF/lib에 넣어 사용한다.



spring-framework-3.0.2.RELEASE-dependencies는 압축을 풀면 \org.apache.commons\com.springsource.org.apache.commons.logging\1.1.1에서 com.springsource.org.apache.commons.logging-1.1.1.jar 복사해서 WEB-INF/lib에 넣어 사용한다.



 

2. Eclipse 에서 maven 사용

 

1) 이클립스에서 프로젝트 생성

 

 

 

2) 프로젝트에서 우측

 

 

 

pom.xml파일 생성 후 스프링 관련 추가 후 run as 에서 build,install사용하면 됨.

 

 

 

 

 

 

 

 

+ Recent posts