- 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