Acorn academy 02/02 Spring

Bae Seong Jun·2024년 2월 2일

Acorn academy

목록 보기
44/70

Properties (Hashtable 하위 클래스)

key가 String, value가 String인 맵 형태의 객체

setProperty(key) 값 설정
getProperty(key) 값 반환
props.stringPropertyNames(); 키값 반환

config.xml

    	<property name="phones">
    		<props>
    			<prop key="one">010</prop>
    			<prop key="two">011</prop>
    			<prop key="three">018</prop>
    		</props>
    	</property>

나중에 xml의 bean관련은 전부 자동화할 것이다.
그러니 개념만 잘 잡고 나중에 오류 발생시 잡을 수만 있게 되면 된다.

scope=""

<bean class="com.dto.Student" id="stu" scope="singleton"></bean>

  • singleton (default) : 객체를 하나만 생성 (scope가 없어도 기본값으로 가짐)
  • "prototype" : getBean()시마다 객체를 새로 생성

@Autowired (중요)(중요)(중요)

  1. 이름을 이용하는 방식
  2. 타입을 이용하는 방식

2) 타입을 이용하는 방식 - byType:

상단에 <beans default-autowire="byType"> 가 선언되어 있다면,
<bean>을 이용해 객체를 생성할 때마다 선언하지 않은 멤버변수가 있다면 set함수를 이용하여 생성.
주의점 : 멤버변수로 객체를 필요로할 경우 bean을 통해 객체가 생성되어있어야한다.
주의점2 : 만약 가져올 객체에 대한 선택지가 2개 이상이 있다면 오류 발생한다.

  • 만일 선택지가 2개 있다면 아래와 같은 에러메시지가 나타난다.
    expected single matching bean but found 2: xx,cat2
  • 그래서 byType을 사용할 경우 주의점은 : 프로퍼티를 통해서 주입당해야할 객체가 유일해야한다.

1) 이름을 이용하는 방식 - byName :

주입할 클래스의 멤버변수 이름 = 주입당할 객체(빈)의 id값이 같아야한다.

즉, 클래스의 멤버변수 이름과 동일한 id를 가진 빈이 없다면 에러가 발생한다.
어떤 에러가 발생하나 ?

  • 일단 저장단계에서 일치하는 id의 빈이 없다면 저장되지 않음. (NULL)
  • 저장되지 않은 멤버변수를 참조하려는 시도가 있다면 ? NULL.XXX() => 바로 NullPointerException 이 발생.
    즉, NullPointerException이 발생하였고, autowire 값을 byName으로 사용하고 있다면 id가 일치하는 빈이 없을 가능성이 있다는 것이다.

각 장단점

  1. byName :
  • 장 : 주입당할 타입의 객체를 여러개 생성해도 문제가 발생하지 않는다.
  • 단 : 일치하는 id 부재시, null포인터exception 발생 가능성이 생기며, 에러를 찾기 어려운 상황이 생길 수 있다. (논리적 오류 발생 가능)
  1. byType :
  • 장 : 이름의 일치를 신경쓰지 않아도 된다.
  • 단 : 주입당할 타입의 객체를 여러개 생성할 수 없다.

각 bean마다 autowire 따로 설정

default-autowire 없이 각 bean에 autowird=""를 선언

autowire의 후보군에서 제외 - candidate(후보)

autowire-candidate="false" 선언

candidate의 반대 primary 유력후보설정

primary="true" 선언

xml 파일을 분리해도 autowire 및 명시적 주입 가능

서로 다른 xml에서도 같은 파일처럼 작용이 가능

autowire="constructor" - 생성자 이용

최대한 모든 멤버변수를 포함하는 생성자를 사용.
없을수록 적은 인자를 필요로하는 생성자를 사용.
하나도 없으면 기본생성자 사용.

어노테이션(@) 사용하기

<context:annotation-config/> 가 필수적으로 들어가야 사용할 수 있다.
namespace에서 context 선택

@Required

클래스의 setXxx()함수 위에 사용
기능 : 필수 속성이 되게 한다.
setter에 사용되어서 있는지 아닌지 확인이 어렵다.

@Autowired (중요)

  • 속성 또는 생성자, setter 메소드에 설정, 필수 속성이다.

  • required=false 로 필수 속성 해제가능

  • autowire="byType"과 동일한 기능

  • 배열, 컬랙션 모두 설정 가능하다.

  • byType + @Reuired 가 합쳐진 기능

  • 주의점 : 주입받을 빈이 없거나 2개 이상이면 오류 발생

  • 주의점2 : setter로 주입하는 것이 아닌, @Autowired가 위치한 곳에 바로 주입된다.
    멤버변수가 private인 상태여도 주입이 된다.

@Autowired(required=false)
사용시 null이 들어갈 수 있다.
없다면 주입받을 빈이 없을 때 오류를 낸다.

profile
코딩 프로?

0개의 댓글