2015년 7월 16일 목요일

신입SW인력을 위한 실전 자바(Java) 스프링(Spring) 동영상과정 03_06 DI

이 게시물은
http://www.wiz.center/233
http://www.wiz.center/234
http://www.wiz.center/235
http://www.wiz.center/236


해당 링크를 청취하고 작성한 글입니다.

본인 이해도 확인을 위해서 작성한 것이니
스프링에 대해서 알고 있다면 쑥 훝어보고 끝내시고

좀 깊게 알고 싶다면 위의 링크부터 시작해서
총 30개 강의로 이루어진 스프링 과정을 청취하세요

1. 간단하게 Spring DI 맛보기

-------------------------------
예제 1번에서 작업을 진행함.

작성1. resource 밑에 applicationCTX.xml 파일을 생성후 아래와 같이 작성한다.



 

 
  
   
  
  
  
 




ps. 용어설명
bean
     id ="여기서 부여한 고유 id 이름"
     class="패키지를 포함한 class 위치"
property 
     name ="빈 밑에 프러퍼티가 존재하며 프러퍼티 이름은
        해당 객체(클래스) 가 지니고 있는
        매개변수 = 변수명 과 일치한다."
     ref bean ="해당 매개변수가 참조하는 bean(객체) 이며
        객체 이름은 xml에 등록한
        객체(클래스)명과 형식이 일치하여야 한다."
     value ="매개변수가 지니는 값 값도 설정할 수 있다."
        값을 설정하려면 set매개변수() 함수가 있어야
        에러없이 진행된다.

작성2. 메인 클래스 java 를 아래와 같이 수정한다.

package com.javalec.ex;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

 public static void main(String[] args) {
  
  String configLocation = "classpath:applicationCTX.xml";
  AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);
  MyCalculator myCalculator = ctx.getBean("myCalculator", MyCalculator.class);
  
  myCalculator.add();
  myCalculator.sub();
  myCalculator.mul();
  myCalculator.div();
  
 }
}


ps. Spring  에서 제공하는 AbstractApplicationContext
       클래스 형태의 객체를 생성하고
       new GenericXmlApplicationContext 객체에
       (AbstractApplicationContext 상속 받은 애임)에서 
       config값을 모두 등록한다. 
     그리고 myCalculator 객체에 
        xml "myCalculator" 값으로 작성한 객체를 
       가져온다. myCalculator 는 Calculator 를 매개변수로
       포함하고 있기 때문에 계산이 실행된다.

결과 )  ex01 결과와 동일




















----------------------------------------------------------

2.  xml 파일에 bean 등록하는 방법 설명



3. bean 에 등록한 파일을 자바에서 써보기



4. DI를 활용하기
    Spring 에서 의존을 주입하는 방법
 1) xml에서 주입 (상단 예제 참고)
 2) 생성자를 통해서 Java 파일에서 주입

-------------------------------
프로젝트는 Spring Spring Maven 으로 생성
   (기존과 같은 방식)

작성1. src 밑에 다음 Student.java 클래스를 추가한다.

package com.javalec.ex;

public class Student {

 private String name;
 private String age;
 private String gradeNum;
 private String classNum;
 
 public Student(String name, String age, String gradeNum, String classNum) {
  this.name = name;
  this.age =  age;
  this.gradeNum = gradeNum;
  this.classNum = classNum;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getAge() {
  return age;
 }

 public void setAge(String age) {
  this.age = age;
 }

 public String getGradeNum() {
  return gradeNum;
 }

 public void setGradeNum(String gradeNum) {
  this.gradeNum = gradeNum;
 }

 public String getClassNum() {
  return classNum;
 }

 public void setClassNum(String classNum) {
  this.classNum = classNum;
 }
 
}


4개 멤버변수와 get, set 함수 그리고 생성자에 값을 넣음.


작성2. src 밑에 StudentInfo.java 작성


package com.javalec.ex;

public class StudentInfo {

 private Student student;
 
 public StudentInfo(Student student) {
  this.student = student;
 }
 
 public void getStudentInfo(){
  if(student != null) {
   System.out.println("이름 : " + student.getName());
   System.out.println("나이 : " + student.getAge());
   System.out.println("학년 : " + student.getGradeNum());
   System.out.println("반 : " + student.getClassNum());
   System.out.println("======================");
  }
 }
 
 public void setStudent(Student student) {
  this.student = student;
 }
 
}

작성3. 가져다 사용할 MainClass.java 작성

package com.javalec.ex;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

 public static void main(String[] args) {
  
  String configLocatioin = "classpath:applicationCTX.xml";
  AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocatioin);
  StudentInfo studentInfo = ctx.getBean("studentInfo", StudentInfo.class);
  studentInfo.getStudentInfo();
  
  Student student2 = ctx.getBean("student2", Student.class);
  studentInfo.setStudent(student2);
  studentInfo.getStudentInfo();
  
  ctx.close();
 }
}

 여기서 2가지 차이점을 확인 가능함. 상단의 studentInfo 를 getBean
   하는데 xml 에 뭔가 작성이 되어서 동작하게끔 보이는걸로 보인다.

 밑의 student2 라는 객체에는 getBean으로 바로 들고오고
   이전에 실행했던 예제와 동일한 방식임.


작성4. resource 밑에 applicationCTX.xml 을 작성한다.



 
  
   홍길동
  
  
   10살
  
  
   3학년
  
  
   20번
  
 
 
 
  
  
  
  
 
 
 
  
   
  
 
 


student1, student2 가 bean으로 등록되어 있으며
   문법이 이전거랑 틀린점을 발견할 수 있는데
   property 를 준경우는 set 함수를 통해서 변수를
   입력하려는 경우이며
  여기서는 생성자를 통해서 주입이 가능한데 생정자를 통할 경우
   property 입력을 하지 않고 위와 같이 constructor 인자와
   작성순서(java, xml 둘다 순서가 같아야 함)에 따라 각 값이
   입력된다.
   그리고 다만 가장 아래 studentInfo 에서 bean인 student1 을
   참조하고 있으며 생성자를 실행하도록 작성되어 있음.
   studentInfo  bean 에는 student1 객체가 들어간다는걸 확인
 
==> set 함수를 이용코자 한다.      property
==> 생성자 함수를 이용코자 한다. constructor-arg


결과 )


----------------------------------------------------------

5. DI 활용
  여기까지 예제만 봤을때 아쉬운점이 있는데
    참조하는 클래스명을 메인에서 직접 언급하는 점이다.
student1 을 쓸지 2를 쓸지 xml에서만 정하고
    + Student 를 쓸지 ElementStudent 혹은 HighStudent
    중 어느 클래스를 사용할지 정하는걸 모르게 하고 싶다.
    그래야 DI 개념이 잘 적용되었다고
    (main 에서는 코드 수정없이 클래스를 바꾸는게 가능해야)
    볼수 있다.

-------------------------------
프로젝트 생성순서는 이전과 동일하다

작성1. src 밑에 다음 MainClass.java 를 작성한다.

package com.javalec.ex;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  AbstractApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationCTX.xml");
  Pencil pencil = ctx.getBean("pencil", Pencil.class);
  pencil.use();
  
  ctx.close();
 }
}

작성2. resourcce 밑에 applicationCTX.xml 을 작성

 

  


작성3. Pencil .java <- interface 를 작성
package com.javalec.ex;

public interface Pencil {
 public void use();
}
작성4.Pencil을 참조하는  Pencil4B 클래그를 구현한다.
package com.javalec.ex;

public class Pencil4B implements Pencil {

 @Override
 public void use() {
  System.out.println("4B 굵기로 쓰입니다.");
 }

}
결과 )

----------------------------------------------------------


getBean 함수에서 interface 를 호출할 수 있다.
    이 interface 만 implements 하고 있는 클래스는 호출 가능하다.
    그리고 해당 내용을 xml 에 표시하면 이후에는 어떤 클래스, 객체인지
    소스상에 명시하지 않아도(수정하지 않아도) 된다.
    현재 Pencle4B 에서 다른 클래스로 바꾸고자 한다면
    Pencle 을 임플리먼트한 클래스를 하나 작성하고, xml에 bean
    명시를 해주면 자바에서 기존 소수의 수정 없이
    해당 업무를 변경 할 수 있다.


6. Java 에서 DI를 설정하는 방법 (어노테이션 사용방법)

 1) DI 설정을 간단하게 하는 방법
      우선 하단 2줄을 삽입해줘야 단축 사용이 가능하다.

xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"

단축 명령어 사용방법 (여기서 papaName 등은 생성자에서
     입력하던 변수명과 동일하게 작성한다.)

 
  
 

정상적으로 적용할때 사용했던 방법


  
  
  

                
   홍누나
  
  
  
   홍오빠
  
  
  
 

Java main 에서는 다음과 같이 복수의 xml 파일을 로딩 가능하다.

String configLocation1 = "classpath:applicationCTX.xml";
  String configLocation2 = "classpath:applicationCTX1.xml";
  AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation1, configLocation2);
  Student student1 = ctx.getBean("student1", Student.class);


 2) Java 에서 DI를 설정하는 방법

첫번째 .xml 파일은 없는 상태
그리고 bean으로 작성할 클래스에 다음을 import 한다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

그리고 클래스부터 어노테이션을 붙인다.
(이걸 작성하면 xml 의 내용이 자바 파일 형태로 대체된다.)

@Configuration
public class ApplicationConfig {
//클래스안에서 작성한 함수 위에 어노테이션을 붙인 경우
    //ApplicationConfig 가 Context 에 담을때 쓰는 클래스가 된다.

 @Bean
 public Student student1(){
 //Student(class name) student1() <-- data-blogger-escaped-arraylist="" data-blogger-escaped-tring="" data-blogger-escaped-xml="" id=""> hobbys = new ArrayList();
  hobbys.add("수영");
  hobbys.add("요리");
  
  Student student = new Student("홍길동", 20, hobbys);
                //생성자에서 값을 설정해줄때

  student.setHeight(180);
  student.setWeight(80);
                //set 함수에서 값을 설정할때
                    //물론 student 클래스가 있고 그 안에 set함수나
                    // 생성자가 있어야 된다.
  
  return student;
 }


그리고 호출하는 main 에서는 Annotation 기반의 클래스를
    이용해서 context 를 담아낸다.
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class);

   쓰는 getBean은 똑같이 사용한다.


7. Java, XML DI 설정방법을 혼합하여 사용하기
 1) xml 파일안에 java 파일을 포함시키는 방법
   xml 파일에 다음 내용을 추가 물론 ApplicationConfig.java는
     annotation 으로 선언된 bean 이어야 한다.

 
 


 2) java 파일안에 xml 을 포함시키는 방법
   java 파일중 ApplicationConfig.java(annotation으로 bean 선언한)
     클래스에 아래 어노테이션을 하나더 부여한다.

@Configuration
@ImportResource("classpath:applicationCTX.xml")
public class ApplicationConfig { .....


1) or 2) 번 둘중에 하나만 써야 잘 적용된다.

댓글 없음:

댓글 쓰기