일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 함수
- HTML역사
- 웹브라우저 수용도
- 자바 오류
- 생성자
- 함수 선언
- 크롤링 오류
- 자바
- SQL입문
- 우아한테크
- 페이지분석
- 자바 예외
- R1C3
- 웹 브라우저 전쟁
- 크롤링
- DoIt
- 숫자 형식
- 숫자형식오류
- html
- 예제
- 배열 3요소
- 데이터베이스
- Doit입문SQL
- DoitSQL
- DoitSQL입문
- SQL
- 예외
- 배열 예제
- dbms
- 키-값 데이터베이스
- Today
- Total
프로그래밍
[Spring] day59 : 의존 관계와 의존 주입(DI) 본문
2023.08.01.화
의존 관계
어떤 메서드를 수행하는 주체가 되면 의존관계가 발생한다
예를들면 main Action을 하는 진짜 주체는 BoardDAO이다
selectAll / selectOne과 같은 메서드를 실행하는 주체는 BoardDAO이기 때문이다
실제로 TV를 켜는 주체는 리모콘인 것과 같은 맥락이다
의존 관계가 발생한다면 의존 주입을 해야한다
의존 주입(DI)
: Dependency Injection
의존 주입은 곧 멤버변수 초기화라고 이해하면 편하다
의존 주입에는 2가지 방식이 있다
- 생성자 주입
- setter 주입
해당 객체의 멤버변수를 초기화하는 기존의 방식과 비슷하다
설정(.xml)
우리는 POJO인 객체 의존 주입을 할 것이므로
스프링 컨테이너 설정파일인 applicationContext.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.2.xsd">
<context:component-scan base-package="test"></context:component-scan>
<bean class="test.GalaxyWatch" id="gw"></bean>
<context:component-scan base-package="day59"></context:component-scan>
<bean class="day59.RemoteA" id="a"></bean>
<!-- <bean class="day59.RemoteB" id="b"></bean> -->
<bean class="day59.LgTV" id="lTv">
<constructor-arg ref="a"></constructor-arg>
</bean>
<!--
<bean class="test.Ahri" id="ahri">
<constructor-arg ref="tti"/>
</bean>
<bean class="test.Teemo" id="teemo" lazy-init="true">
<constructor-arg ref="jsw"/>
</bean>
<bean class="test.JohnyasSandWatch" id="jsw" lazy-init="true"/>
<bean class="test.tenThousandIce" id="tti" lazy-init="true"/>
<bean class="day59.SamsungTV" id="sTv">
<constructor-arg ref="a"></constructor-arg>
</bean>
<bean class="day59.LgTV" id="lTv">
<property name="remote" ref="b"></property>
</bean>
<bean class="day59.RemoteA" id="a"></bean>
<bean class="day59.RemoteB" id="b"></bean>
<bean class="day59.TestBean" id="tb">
<property name="testList">
<list>
<value>작은티모</value>
<value>중간티모</value>
<value>큰티모</value>
</list>
</property>
</bean>
<bean class="day59.TestBean2" id="tb2">
<property name="testMap">
<map>
<entry>
<key><value>1001</value></key>
<value>작은티모</value>
</entry>
<entry>
<key><value>1002</value></key>
<value>중간티모</value>
</entry>
<entry>
<key><value>1003</value></key>
<value>큰티모</value>
</entry>
</map>
</property>
</bean>
-->
</beans>
[ 실행 흐름 ]
Client
1. 스프링 컨테이너 구동
: 팩토리 패턴을 사용하고 있어서, 객체명을 LookUp하여 객체반환
xml에서 lgTV랑 samsungTV 둘 다 같은 id로 지정후
필요할때마다 둘중하나를 가리는 방식으로 하기도 한다
→ xml의 변경만으로도 아웃풋이 달라진다
하지만 보통 객체의 이름은 같게 짓지는 않는다
→ 액션류는 바뀌는 일이 적고 조금씩 구동방식이 다를 수 있기 때문
→ 보통은 모듈마다 같게 한다(업그레이드 등등 주로 광고/멤버변수 변경 등등)
※ 예전것을 가려놓기도 한다
setter 방식은 생성자 주입 방식과 형태는 비슷하지만
이름으로 찾아가기 때문에 "이름"을 반드시 일치시켜야 한다
<bean class="test.IPhone" id="apple">
해당코드만 작성시에는 consturutor가 아니기 때문에 기본생성자이다
[순서]
지연로딩은 호출 시점에 생성
따라서 현재 호출되지 않았음
IPhone 기본 생성자 호출
setter 호출 시도
setter를 하려면 watch가 필요 ---> 갤럭시워치
갤럭시 워치 기본 생성자 호출
setter 호출 마무리
'자바 > Spring' 카테고리의 다른 글
[Spring] day61 : Command 객체 (0) | 2023.08.13 |
---|---|
[Spring] day61 : Spring MVC로 변경하기 (2) | 2023.08.12 |
[Spring] day60 : Service와 ServiceImplement(+@Repository) (0) | 2023.08.12 |
[Spring] day59 : new 객체화(인스턴스화) (0) | 2023.08.10 |
[Spring] day58 : 스프링 프레임워크 (0) | 2023.08.09 |