뉴렉처 스프링(6 ~ 14)

김상복·2022년 4월 12일
0

뉴렉처스프링

목록 보기
2/7

6. DI 지시서 작성

<!-- Exam exam = new NewlecExam(); -->
<bean id="exam" class="spring.di.entity.NewlecExam"></bean>

 <!-- ExamConsole console = new GridExamConsole();-->
 <bean id="console" class="spring.di.ui.GridExamConsole">
 	<!-- console.setExam(exam); -->
 	<property name="exam" ref="exam"></property> 
 </bean>	
 
 

라는 느낌이다, 여기서 property로 어떻게 setExam이 사용되는지를 보자

property 의 name은 exam이고 ref 또한 exam이다 같은 이름이지만 이 둘은 다르다.
먼저 ref의 exam은 NewlecExam 클래스의 객체를 가르치는 이름이다. 그리고 rpoperty의 exam은 사실은 exam이 아니다. setExam을 가르키는데 이럴 경우 set을 생략하고 첫글자를 소문자로 바꿔주면 실행이되는 규칙을 가지고 있어서 이런식으로 선언하게 된다
즉, name의 exam 은 setExam을 가르키는 것이고, ref의 exam은 NewlecExam을 가리킨다

그렇다면 setExam과 NewlecExam의 관계는 어떤 관계이길래 ref에 적게되는 것일까??
그건 setExam 메소드를 보면 알 수 있다

	public class GridExamConsole implements ExamConsole {

        private Exam exam;

        @Override
        public void setExam(Exam exam) {
            this.exam = exam;
        }

bean으로 생성하고 있는 GridExamConsole 클래스이다.
안의 setExam을 보면 Exam 을 인자로 받고 있다
그리고 NewlecExam 클래스를 살펴보자

      public class NewlecExam implements Exam {

          private int kor;
          private int eng;
          private int math;
          private int com;

          public int total() {
              // TODO Auto-generated method stub
              return kor + eng + math + com;
          }

          @Override
          public float avg() {
              // TODO Auto-generated method stub
              return total() / 4.0f;
          }

  }

여기서 주목할 코드는 메소드가 아닌 implements로 상속받는 Exam이라는 클래스이고
setExam에서는 이 인터페이스를 매개변수로 가져오게 된다.
즉 setExam의 인자에 NewlectExam이라는 클래스를 인자로 넣을 수 있음을 의미하고

ref는 property에서 인자로 넣어줄 클래스를 지정할 때 사용한 다는 것을 알 수 있다

8. 스프링 Ioc컨테이너 사용하기

ApplecationContext는 인터페이스
ClassPathXmlApplicationContext는 ApplecationContext의 종류 중 하나이다
루트 파일에서부터 경로를 찾아서 xml을 검색한다
해당 클래스의 생성자 인자에 빈을 등록한 xml파일을 넣어주면 자동으로 스프링 컨테이너에 등록하게 된다

	ApplicationContext context = 
		new ClassPathXmlApplicationContext("spring/di/setting.xml");

context.getBean을 통해서 등록한 xml에서 해당 빈을 객체의 형태로 가져온다
예를 들어 ExamConsole.class라고 하면 해당 클래스에 맞는 객체를 불러오게 된다

    ExamConsole console = (ExamConsole)context.getBean("console");
	ExamConsole console = context.getBean(ExamConsole.class);
	
	console.print();

10. 스프링 빈 Value입력

    <!-- Exam exam = new NewlecExam(); -->
<bean id="exam" class="spring.di.entity.NewlecExam" 
p:kor="10" p:eng="10">

	1. Setter를 이용하는 방법
	<property name="kor" value="10"/>
	<property name="eng" value="10"/>
	<property name="math" value="10"/>
	<property name="com" value="10"/> 
	
	2. 생성자를 이용하는 방법
	<constructor-arg name="kor" value="10"/>
	<constructor-arg name="eng" value="20"/>
	<constructor-arg name="math" value="30"/>
	<constructor-arg name="com" value="40"/>-->	
</bean> 

 <!-- ExamConsole console = new GridExamConsole();-->
 <bean id="console" class="spring.di.ui.InlineExamConsole">
 	<!-- console.setExam(exam); -->
 	<property name="exam" ref="exam"></property> 
 </bean>	 
    
    

위의 방법으로 해당 데이터에 값을 입력할 수 있다

11. list에 Value 입력

1. 평범한 리스트 입력 방법 생성자 이용
<bean id="exams" class="java.util.ArrayList">
	<constructor-arg>
		<list>
			<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1"/>
			<ref bean="exam"/>
		</list>
	</constructor-arg>
</bean>

2. namespace의 util 추가 후 생성방법
<util:list id="exams" list-class="java.util.ArrayList">
		<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="1"/>
		<ref bean="exam"/>
</util:list>

위 방식대로 List에 값을 입력 할 수 있다 ↓ 실행 코드

	List<Exam> exams = (List<Exam>)context.getBean("exams");
	
	for(Exam e : exams)
	{
		System.out.println(e);
	}

12.13 어노테이션 @Autowired

어노테이션을 사용하는 이유

  • 어노테이션을 사용하면 xml에서 일일히 설정을 변경해줘야하는 번거로움을 덜어버릴 수 있다

Autowired 위치
1. Setter
2. 생성자
3. 인자가 있는 오버로드가 있는 생성자

생성자 우선 순서
생성자 > Setter > 인자가있는 오버로드 생성자

중요한 것은 기본 생성자를 반드시 거쳐서 Autowired로 주입시킨다는 점이다

14. 어노테이션 @requeired

@requeired 어노테이션은 여러 가지의 Bean이 존재할 때, bean id를 기준으로 Autowired를 주입시키기 위한 어노테이션이다

<bean id="exam1" class="spring.di.entity.NewlecExam" 
p:kor="5" p:eng="10">

이라는 xml 파일의 Bean이 있을 때

@Autowired
@requeired("exam1")

형식으로 사용하면 된다

profile
초보 개발자

0개의 댓글