의존 객체 자동 설정 방법: autowire
appCtx.xml 파일에서 의존객체를 하나씩 <constructor-arg>를 설정해야 한다라, 귀찮지 않는가.
그래서 개발자들은 의존객체를 자동으로 설정하는 방법을 만들었다. 빈 객체(사용을 원하는 클래스)
의 타입(byType)이나 이름(byName)을 이용하는 방법이다. 이는 생성된 빈 객체를 정의할 때 autowire
속성으로 지정한다.
[autowire의 세 가지 지정 방식]
먼저, autowire의 지정 방식에 대해 알아보겠다. 세 가지 지정방식이 있다.
• 세 가지 방식
– byName : 프로퍼티의 이름과 같은 이름을 갖는 빈 객체를 설정
– byType : 프로퍼티의 타입과 같은 타입을 갖는 빈 객체를 설정
– constructor : 생성자 파라미터 타입과 같은 타입을 갖는 빈 객체를 생성자에 전달
[autowire 사용 방법]
(1)먼저 byName 이용 방법에 대해 알아보겠다.
이렇게 appCtx.xml 파일에 Dao의 빈 객체를 만들어 준다.
왜냐하면 MemberDeleteService에서 Dao 클래스를 끌어와 사용하기 때문이다.
그 다음 내가 쓰고자 하는 Service 클래스의 빈을 정의해준다.
그 다음 속성에 autowire = “byName”을 적어준다.
여기서 궁금증이 들 것이다. 대체 무슨 이름 기준으로 끌어온단 말인가.
자, 그럼 MemberDeleteService.java 클래스의 코드를 보자
이제 공통된 이름이 보이는가. MemberDao 빈을 정의해줄 때 지정한 id의 이름이 MemberDeleteService.java 클래스에서 사용하는 MemberDao 객체의 변수 이름과 동일하다.
서비스에서 사용할 Dao bean의 id = “dao”
서비스 bean 안에 변수 이름 = “dao”
(2) byType 방법 사용하기
byType 방법은 단순히 이름만 지정해서는 오류가 난다.
그래서 두 눈 바싹 뜨고 잘 지켜봐야한다.
Service 클래스에서 사용하고자 하는 클래스 정의는 (1)byName 방법과 같다.
scope은 범위를 배울 때 다룰 것이니, 일단 무시해라.
autowire = “byType”으로 바꾼다.
그리고 MemberRegService.java 클래스에서 변수 타입을 MemberDao로 바꿔준다.
왜냐하면 그냥 Dao로 하면 오류*가 나기 때문이다.
그러면 Service 빈(memberDeleteService.java)이 알아서 MemberDao 빈을 찾은 다음 실행한다.
결과는 다음과 같다.
*궁금해요) 왜 오류가 날까?
왜냐하면
dao.java는 인터페이스이기 때문에, 변수 객체 타입을 dao로 지정하면
(1)JdbcDao.java (2)MemberDao.java (3)MybatisDao.java 중에 무엇을 선택해야 할지 모르기 때문이
다.
그래서, 하나의 변수 객체 타입을 pinpoint 한 다음에 지정해준다. 그래서나는 MemberDao로 변수 객
체 타입을 지정해줬다.
autowire의 설정 방법을 정리하자면 다음과 같다.
- xml 파일에 인터페이스를 구현한 클래스를 빈으로 생성한다.
- xml 파일에 해당 빈을 사용하고자 하는 클래스를 빈으로 생성한다.
- 2번을 생성 시, 속성 autowire를 정의하고 ‘byName’으로 할 지 ‘byType’으로 할 지 설정한다.
- 2번의 클래스 안에 변수 타입이나 이름을 주의해서 본다.
빈 객체의 범위
빈 객체, 빈 객체하니까 Empty 객체 같아서 혼동이 온다.
다시 한번 말하자면 빈 객체는 인터페이스의 메서드를 구현한 클래스이자, Service 클래스에서 사용
하고자 하는 클래스를 말한다.
일반적으로 컨테이너에 생성된 빈 객체는 범위를 갖는다.
마치 <jsp:useBean scope=””> 속성과 비슷하다.
이 때 주의해야 할 부분은, default 값은 singleton이라는 것이다.
애노테이션 (@)
자, 앞에서 배운 것은 문법들은 다 잊어도 된다. 처리 흐름만 파악하라. 왜냐하면 애노테이션으로 처리
하면 되니까. 애노테이션으로 처리하면 훨씬 간단하다.
그럼 애노테이션이란 무엇인가?
애노테이션이란 우리가 위해서 했던 일들을 골뱅이(@)로 해결한다. 쓰고자 하는 메서드나 문장 위에
@+문법단어 를 적어서 이 메서드의 성격을 정의해준다. 그럼 컴퓨터가 알아서 알아듣고 알맞게 실행
한다.
Q. 오랜만에 질문을 한다. 애노테이션이 무엇인지 감이 잡히지 않는다. 예시를 들어달라.
애노테이션의 예시는 다음과 같다.
Q. 애노테이션들과 그 기능들을 설명해 달라. 달라달라.
Q. 애노테이션을 사용하기 위해 무엇을 설치해야 하는가? 설치 필요없이 바로 사용해도 되는가.
아니다. 애노테이션을 사용하기 위해서는 약간의 추가가 필요하다.
그런데 사용하고 싶은 애노테이션을 적은 뒤 ctrl+space를 누르면 자동으로 뜨기에
굳이 이 문장 전체를 기억할 필요는 없다.
Q. 애노테이션 사용 예시 plz.
Ok. Let’s see an ‘@Autowired’ Example.
@Autowired 애노테이션은 의존 설정을 위한 애노테이션들 중 하나이다.
사실 오늘 배운 애노테이션들 중에서 ‘@Autowired’ 애노테이션만 알아 먹어도 반은 간다.
[@Autowired 애노테이션]
@Autowired 애노테이션이란 위에서 설명 했듯이*, 타입을 기준으로(byType) 빈을 찾아 주입하는 애
노테이션이다.
이 애노테이션을 사용하고자 한다면, xml 설정에 <context:annotation-config/>를 추가한다.
구체적인 예시를 위하여 appCtx.xml 파일을 보도록 하자.
아 참참, 참고로 저기 위에 있는 링크 중 xmlns:p는 Namespaces 설정을 통해 설정해주었다.
자, 본격적으로 @Autowired 를 사용하기 위해 xml 파일에 <context:annotation-config/>를 적어 주었
다. 참고로 서비스 빈에는 어떠한 처리(ex. byType, byName)도 하지 않았다.
MemberRegService.java 클래스이다.
빈 생성자와 @Qaulifier(“newDao”) 부분은 @Qualifier 애노테이션을 배울 때 다시 다루도록 하겠다. 뭐, @Qaulifier(“newDao”)를 쉽고 간단하게 설명하자면 pinpoint 개념이다. 이는 추후에 다루도록 하
겠다.
자 이제 사용하고자 하는 빈 클래스의 변수 타입 위에 @Autowired를 적어주었다.
이렇게만 적어주면 결과가 실행된다.
결과는 다음과 같다.
@Autowired을 잘못 사용하면 오류가 발생하기에, 적용 순서를 잘 알아두어야 한다. 적용순서는 다음
과 같다.
Q. 애노테이션 @Qualifier는 무엇인가?
@Qualifier의 Qualifier의 뜻은 ‘형언하다, 규정짓다’이다. 리터럴리 ‘난 이걸 쓸꺼야’라고 규정하는 것이다.
앞서 본 예제에서 인터페이스 Dao가 있었다. 그리고 Dao에서 정의한 메서드들을 구현한 클래스들이
있었다. JdbcDao, MemberDao, MybatisDao 클래스가 이 메서드들을 구현한 클래스이다. 이 세 클래
스들의 기능은 모두 같다.
그럼, 이걸 쓰고자 하는 사람은 세 가지 클래스들 중 한 가지를 선택해야 한다. 어느 것을 택해서 사용
할 것인가. 이 때 택한 클래스가 Qualifiered된 클래스라 할 수 있다 .
자 MemberRegService.java 클래스를 보자.
첫 번째로, 나는 객체 변수 타입으로 인터페이스 Dao를 선택했다. 세 클래스들 모두 사용할 수 있다는
것이다.
두 번째로, @Autowired를 적어주어 ‘나는 xml에서 autowire 속성을 따로 정의하지 않고 사용하겠다.
‘를 선언한다.
세번째로 @Qualifier(“newDao”)를 적어준다. 이 의미는 xml에서 내가 사용하고자 하는 빈에게
qualifier를 선언하겠다는 것이다. 이때 qualifier의 value가 newDao이다.
xml 파일을 코드로 보자.
의미를 해석하자면 ‘나는 MemberDao 클래스를 pinpoint해서 사용하고자 한다’ 이다.
결과는 다음과 같다.
댓글 없음:
댓글 쓰기