728x90

1. 롬복 설치하기

롬복 다운로드로 이동해서 롬복을 다운로드해 주세요.

버전은 2018-03-07일 기준으로 1.18.12 버전입니다.

"jar 파일은 다운로드 중에 컴퓨터를 손상시킬 수도 있다."라는 경고 메시지가 나오는데요,

무시하고 계속을 클릭해서 진행해 주시면 되겠습니다.

728x90
728x90

@Resource @Autowired @Inject 의 공통점은 의존 주입 이다.

또한 특정 Bean 기능을 수행하기 위해 기능에 필요한 특정 Bean을 참조 해야 하는 경우가 많이 발생한다

그럴때 사용하는것이 @Resource @Autowired @Inject 의 어노테이션이다

그럼 이 어노테이션의 차이점과 사용법을 알아보도록 하자.

 

 

@Resource

@Autowired

@Inject

설명

Java 에서 지원하는 어노테이션

Spring Framework 에서 지원하는 Dependency 정의 용도의 어노테이션 자동주입이며 종속적이다

Java 에서 지원하는 어노테이션

사용하는 위치

필드 , 한개의 파라미터인 빈 프로퍼티 setter 메소드

필드 , 생성자 , 여러개인 파라미터 메소드

필드 , 생성자 , 메소드

연결 또는 검색 방식

이름으로 연결 안되면 타입

타입으로 연결 안되면 이름

타입으로 연결 안되면 이름

특이사항

 

스프링프레임워크 종속적이다

 

강제 연결 하기

@Resource(name="title")

@Qualifier("title")

 

 

 

간단한 설명은 이렇게 자세한 설명을 이어가겠다.

 

@Resource

name 으로 DI 를 가능케한다. 자바에서 지원하는 어노테이션 이며 프레임워크에 종속적이지 않아 많이 사용한다. 이걸 추천한다.

다 똑같지만 필요로 하는 자원을 쓰기 위해 어노테이션을 추가해 DI를 한다.

Bean을 생성해주며 싱글톤 패턴이 자동으로 적용이 된다고 생각하면 된다.

 

@Autowired

type으로 DI 를 가능케한다. 스프링 프레임워크에서 지원 하는 어노테이션이면 프레임워크에 종속적이다.

그래서 추천하지는 않는다 왜냐하면 스프링 프레임워크를 쓰다 다른 프레임워크로 수정할 경우에 많은 리소스가 발생한다

다 바꿔줘야하는 부분이... 양이 방대하다면 답이 없고

그래서 나는 Resource를 추천한다 어느 프레임워크에 종속적이지 않기 때문에

이것또한 Bean를 생성하며 싱글톤 패턴이 자동으로 적용이 된다. 타입으로 연결 하기 때문에 같은 타입인 여러개의 필드는 오류가 날것이다

강제 연결 할경우에는 @Qualifier를 사용하면 된다 네임을 붙혀서

 

@Inject

name으로 DI를 가능케한다. 자바에서 지원하는 어노테이션 이며 프레임 워크에 종속적이지 않아 사용해도 좋다

이것은 @Resource 랑 다를게 없지만 다른점이라하면 자바에서 지원하는건데 타입으로 연결한다는 점이다

Autowired 를 사용할거라면 차라리 Inject를 사용하는 걸 추천하는 편이기는 한다

다만 오토와이어는 확실한 의존성이 보장이 되기때문에 이거는 어느걸 추천한다고는 확실히 답변 못주겠다.

알아서 리소스와 코드의 맞게 써라

728x90

'프로그래밍 > java' 카테고리의 다른 글

롬복 설치  (0) 2022.05.19
SVN 락 풀기  (0) 2020.03.12
인터넷이 끊겼을 때 spring xsd 관려  (0) 2020.01.14
String, StringBuffer, StringBuilder의 장단점 및 차이점  (0) 2019.10.11
poi cell Number 포맷 문자로 읽기  (0) 2016.11.04
728x90

형상관리 프로그램 SVN을 사용하다 보면...

lock 걸려서 update도 안되고 commit 도 안되고...

그래서 cleanup을 해서 풀려고 해도 안되고...

 

참으로 짜증날 때가 있다.

 

lock 이 걸리는 부분에 대해서 아직도 정확히 어느시점에 왜?! 걸리는지 모르겠다는...

update 받고 commit 하는데 갑자기 lock 걸려버림...

내가 무슨잘못을 한건지....

 

찾아보면 다들 cleanup 시키라는데

해봤자 lock 이 걸려서 cleanup 자체가 되지 않음

 

 

이래 될때 마다 매번 새로 받을 수도 없는 노릇이고 해서 SVN db를 까봄

 

.svn 폴더를 들어가보면 wc.db 파일이 존재함.

요녀석을 sqlite3 으로 열어봄

 

 

SQLite Browser 다운로드 링크

http://sqlitebrowser.org/

DB Browser for SQLite

News 2016-12-17 - The v3.9.1 binary for OSX has been rebuilt using Qt 5.7.1, to fix an important colour display problem on macOS Sierra. 2016-12-15 - An initial DBHub.io server is online , running our latest development code. Testing and feedback is encouraged . Note - The data on this server will p...

sqlitebrowser.org

 

wc.db 내부 테이블 중에

WC_LOCK, WORK_QUEUE 테이블이 존재함.

 

물론 SVN이 이상없을 시에는 이곳에 데이터가 쌓여있지 않음.

LOCK이 걸려서 이러지도 저러지도 못할때 조회해보면 그 해당 에러났던 파일들이 들어있음.

 

과감하게

DELETE FROM WC_LOCK

DELETE FROM WORK_QUEUE

 

SQL 실행 후 변경사항을 저장시키고 LOCK 걸린곳에서 cleanup을 한 후

update 실행하면 lock이 해제되어 있는것을 볼 수 있다.

728x90
728x90

문제 상황

인터넷이 연결되어 있을때는 정상이지만 연결되어 있지 않으면 톰캣 실행시 아래와 같은 에러 발생.

참고로 웹소켓을 연동한 프로젝트였다.

 

org.xml.sax.SAXParseException; lineNumber: 95; columnNumber: 84; schema_reference.4: 스키마 문서 'http://www.springframework.org/schema/util/spring-util-3.2.xsd' 읽기를 실패했습니다. 원인: 1) 문서를 찾을 수 없습니다. 2) 문서를 읽을 수 없습니다. 3) 문서의 루트 요소가 가 아닙니다.

 

Caused by: java.net.UnknownHostException: www.springframework.org

 

2014-09-04 10:34:22,195 [localhost-startStop-1] ERROR [org.springframework.web.servlet.DispatcherServlet] Context initialization failed

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 95 in XML document from class path resource [spring/spring.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 95; columnNumber: 84; cvc-complex-type.2.4.c: 일치하는 와일드 카드 문자가 엄격하게 적용되지만 'util:properties' 요소에 대한 선언을 찾을 수 없습니다.

문제 원인

스프링 설정 파일에서 xsd 파일 버전이 맞지 않아 발생하는 문제였다.

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:websocket="http://www.springframework.org/schema/websocket"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
			http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
			http://www.springframework.org/schema/websocket
			http://www.springframework.org/schema/websocket/spring-websocket-4.2.xsd">

웹소켓을 연동하기 위해 spring 4.2.1 release jar를 프로젝트에 포함시킨 것은 제대로 했으나 spring 설정 파일에서 xsd를 읽어올 때는 4.2.xsd 파일을 참조하도록 하였다. 이 둘의 버전이 맞지 않기 때문에 서버 구동시 프로젝트에 포함된 jar 가지고는 xsd를 읽을 수 없어 자동으로 인터넷에서 4.2 버전의 xsd 파일을 찾는 것 같다. 

 

이를 해결하기 위해서는,

1.프로젝트에 포함된 jar와 spring 설정 파일의 xsd 버전을 똑같이 맞춰주든지

2.그냥 설정 파일의 버전을 없애고 빌드하면 된다

문제 해결

Spring 설정 파일의 xsd 버전을 삭제했다. 

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:websocket="http://www.springframework.org/schema/websocket"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
			http://www.springframework.org/schema/beans/spring-beans.xsd
			http://www.springframework.org/schema/websocket
			http://www.springframework.org/schema/websocket/spring-websocket.xsd">

참고 사이트

schema_reference.4: Failed to read schema document 'http://www.springframework.org/schema/beans/spring- beans-4.1.5.xsd - stackoverflow

Spring schemaLocation fails when there is no internet connection - stackoverflow

인터넷에 연결 안되면 Spring Framework 에러 발생. - 민서네집 티스토리 블로그



출처: https://insomniachaos.tistory.com/161 [DEV_NOTE]

728x90
728x90

String, StringBuffer, StringBuilder의 장단점 및 차이점

자바에서 String과 StringBuffer, StringBuilder의 차이점을 알아본다.

이들의 공통점은 모두다 String(문자열)을 저장하고 관리하는 클래스들이다.

어떤 차이점이 있을까?

String과 (StringBuffer, StringBuilder)의 차이점은 String은 immutable(불변)하고 StringBuffer, StringBuilder는 mutable(가변)하다는 점이다.

쉽게 말해서 String은 new 연산을 통해 생성되면 그 인스턴스의 메모리 공간은 절대 변하지 않는다.

그래서 + 연산이나 concat을 이용해서 문자열에 변화를 줘도 메모리 공간이 변하는 것이 아니라 새로운 String객체를 new로 만들어서 새로운 메모리 공간을 만드는 것이다.

이렇게 새로운 문자열이 만들어지면 기존의 문자열은 가비지 콜렉터에 의해 제거되야 하는 단점(언제 제거될지 모름)이 있다.

또한 이러한 문자열 연산이 많아질 때 계속해서 객체를 만드는 오버헤드가 발생하므로 성능이 떨어질 수 밖에 없는 단점이 있다. (+연산에 내부적으로 char배열을 사용함)

대신 String 클래스의 객체는 불변하기 때문에 단순하게 읽어가는 조회연산에서는 타 클래스보다 빠르게 읽을 수 있는 장점이 있다. (+불변하기 때문에 멀티쓰레드환경에서 동기화를 신경쓸 필요가 없음(장점))

결론 => String 클래스는 문자열 연산이 적고 조회가 많을 때 멀티쓰레드 환경에서 사용하면 좋음.

StringBuffer와 StringBuilder 클래스는 String과 다르게 mutable(변경가능)하다.

즉 문자열 연산에 있어서 클래스를 한번만 만들고(new), 연산이 필요할 때 크기를 변경시켜서 문자열을 변경한다.

그러므로 문자열 연산이 자주 있을 때 사용하면 성능이 좋다!

심지어 StringBuffer와 StringBuilder 클래스의 메서드들이 같으므로 호환(?)이 가능하다.

그렇다면 StringBuffer와 StringBuilder의 차이는 무엇일까?

차이점은 StringBuffer는 멀티쓰레드환경에서 synchronized키워드가 가능하므로 동기화가 가능하다. 즉, thread-safe하다.

StringBuilder는 동기화를 지원하지 않기 때문에 멀티쓰레드환경에서는 적합하지 않다.

대신 StringBuilder가 동기화를 고려하지 않기 때문에 싱글쓰레드 환경에서 StringBuffer에 비해 연산처리가 빠르다.

결론 => 문자열 연산이 많을 때 멀티쓰레드환경에서는 StringBuffer, 싱글쓰레드또는 쓰레드를 신경쓰지 않아도 되는 환경에서는 StringBuilder를 사용하는 것이 적절하다.

다시 한번 정리하면,

String클래스는 불변 객체이기 때문에 문자열 연산이 많은 프로그래밍이 필요할 때 계속해서 인스턴스를 생성하므로 성능이 떨어지지만 조회가 많은 환경, 멀티쓰레드 환경에서 성능적으로 유리합니다.

StringBuffer클래스와 StringBuilder클래스는 문자열 연산이 자주 발생할 때 문자열이 변경가능한 객체기 때문에 성능적으로 유리합니다.

StringBuffer와 StringBuilder의 차이점은 동기화지원의 유무이고 동기화를 고려하지 않는 환경에서 StringBuilder가 성능이 더 좋고, 동기화가 필요한 멀티쓰레드 환경에서는 StringBuffer를 사용하는 것이 유리합니다.

* StringBuffer와 StringBuilder는 성능으로 따졌을 때 2배의 속도차이가 있다고 하지만 참고사이트의 속도 차이 실험 결과 append()연산이 약 1억6천만번 일어날 때 약 2.6초의 속도차이를 보인다고 합니다.

(String은 +연산이 16만번이상 넘어가게 되면 10초이상 걸리면서 못 쓸정도의 성능을 보입니다.)

따라서 문자열연산이 많지만 엄청나게 일어나지 않는 환경이라면 StringBuffer를 사용해서 thread-safe한 것이 좋다는 생각입니다.

* JDK1.5이상부터 String에서 +연산으로 작성하더라도 StringBuilder로 컴파일하게 만들어 놨다지만 여전히 String클래스의 객체 생성하는 부분을 동일하므로 StringBuffer,StringBuilder 사용이 필요함.

+ StringBuffer, StringBuilder의 경우 buffer size를 초기에 설정해야하는데 이런 생성, 확장 오버로드가 걸려 버퍼사이즈를 잘못 초기화할 경우 성능이 좋지 않을 수 있음.

+ String클래스가 컴파일러분석단계에서 최적화될 가능성이 있기때문에 간혹 성능이 잘나오는 경우도 있음. 문자열 연산이 많지 않은 경우는 그냥 사용해도 무방.

런타임에서 문자열조합이 많아질 경우 String은 여전히 성능이 아주 안좋기 때문에!

+, concat을 사용하는 사고(?)를 치면 안된다. 특히 현업에서....



출처: https://jeong-pro.tistory.com/85 [기본기를 쌓는 정아마추어 코딩블로그]

728x90

'프로그래밍 > java' 카테고리의 다른 글

SVN 락 풀기  (0) 2020.03.12
인터넷이 끊겼을 때 spring xsd 관려  (0) 2020.01.14
poi cell Number 포맷 문자로 읽기  (0) 2016.11.04
에러코드 정리  (0) 2016.05.25
스프링 DI  (0) 2016.03.29
728x90


아놔.

poi로 엑셀을 읽어들이는데 숫자포맷으로 되어있어서 지수로 표시되었다....



6061600042650 -> 6.06160004265E12 


텍스트로 올라왔어야 하는데. 숫자포맷을 문자로 변경되는 법을 찾다가... 엄청 나게 쉬운..


셀타입을 String으로 변경한후에 읽어버리면 숫자포맷이 없어져서 문자열로 읽을수가 있었다.




    switch(obj.getCellType()) {

    case Cell.CELL_TYPE_STRING

    return obj.getStringCellValue();

    

    case Cell.CELL_TYPE_NUMERIC:

    obj.setCellType(Cell.CELL_TYPE_STRING);

    //return String.valueOf((obj.getNumericCellValue()));

    return obj.getStringCellValue();

    

    case Cell.CELL_TYPE_BLANK:

    return "";

    

    case Cell.CELL_TYPE_BOOLEAN:

    return String.valueOf((obj.getBooleanCellValue()));

    default

    return "";

    }



728x90

'프로그래밍 > java' 카테고리의 다른 글

인터넷이 끊겼을 때 spring xsd 관려  (0) 2020.01.14
String, StringBuffer, StringBuilder의 장단점 및 차이점  (0) 2019.10.11
에러코드 정리  (0) 2016.05.25
스프링 DI  (0) 2016.03.29
에자일 방법론  (0) 2016.03.29
728x90

 HTTP 

에러코드

 에러 메시지 

100

 Continue 

101 

 Switching Protocols

200

 OK, 에러 없이 전송 성공 

202 

 Accepted, 서버가 클라이언트의 명령을 받음 

203 

 Non-authoritative Information, 서버가 클라이언트 요구 중 일부만 전송함 

204 

 Non Content, 클라이언트 요구를 처리했으나 전송할 데이터가 없음 

205 

 Reset Content 

206 

 Partial Content 

300 

 Multiple Choices, 최근에 옮겨진 데이터를 요청함. 

301 

 Moved Permanently, 요구한 데이터를 변경된 임시 URL에서 찾음 

302 

 Moved Permanently, 요구한 데이터가 변경된 URL에 있음 

303 

 See Other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음 

304 

 Not modified 

305 

 Use Proxy 

400 

 Bad Request, 요청 실패 - 문법상 오류가 있어서 서버가 요청 사항을 이해하지 못함. 

401.1 

 Unauthorized, 권한 없음 - 접속 실패, 이 에러는 서버에 로그온 하려는 요청 사항이 서버에 들어있는 권한과 비교했을 시 맞지 않을 경우 발생. 이 경우, 요청한 자원에 접근할 수 있는 권한을 부여받기 위해서 서버 운영자에게 요청해야 함. 

401.2 

 Unauthorized, 권한 없음 - 서버 설정으로 인한 접속 실패, 이 에러는 서버에 로그온 하려는 요청사항이 서버에 들어있는 권한과 비교했을 때 맞지 않을 경우 발생. 이것은 일반적으로 적절한 www-authenticate head field를 전송하지 않아서 발생함. 

402.3 

 Unauthorized, 권한 없음 - 자원에 대한 ACL에 기인한 권한 없음. 이 에러는 클라이언트가 특정 자원에 접근할 수 없을 때 발생. 이 자원은 페이지가 될 수도 있고, 클라이언트의 주소 입력란에 명기된 파일일 수도 있다. 또한, 클라이언트가 해당 주소로 접속할 때 이용되는 

또 다른 파일일 수도 있다. 접근할 전체 주소를 다시 확인해 보고 웹 서버 운영자에게 여러분이 자원에 접근할 권한이 있는지를 확인한다. 

401.4 

 Unauthorized, 권한 없음 - 필터에 의한 권한 부여 실패. 이 에러는 웹 서버가 서버에 접속하는 사용자들을 확인하기 위해 설치한 필터 프로그램이 있음을 의미함. 서버에 접속하는데 이용되는 인증 과정이 이런 필터 프로그램에 의해 거부된 것임 

404.5 

 Unauthorized, 권한 없음 - ISA PI/CGI 어플리케이션에 의한 권한 부여 실패. 이 에러는 이용하려는 웹 서버의 어드레스에 ISA PI나 CGI 프로그램이 설치되어 있어 사용자의 권한을 검증함. 서버에 접속하는데 이용되는 인증 과정이 이 프로그램에 의해 거부됨. 

402 

 Payment Required, 예약됨 

403.1 

 Forbidden, 금지 - 수행 접근 금지. 이 에러는 CGI나 ISA-PI, 혹은 수행시키지 못하도록 되어 있는 디렉터리 내의 실행 파일을 수행시키려고 했을 때 발생함. 

403.2

 Forbidden, 금지 - 읽기 접근 금지. 이 에러는 브라우저가 접근한 디렉터리에 가용한 디폴트 페이지가 없을 경우에 발생함. 

403.4 

 Forbidden, 금지 - SSL 필요. 이 에러는 접근하려는 페이지가 SSL로 보안 유지되고 있는 것일 때 발생.

403.5 

 Forbidden, 금지 - SSL 128이 필요. 이 에러는 접근하려는 페이지가 SSL로 보안 유지되고 있는 것일 때 발생. 브라우저가 128비트의 SSL을 지원하는지를 확인해야 함. 

403.6 

 Forbidden, 금지 - IP 주소 거부됨. 이 에러는 서버가 사이트에 접근이 허용되지 않은 IP주소로 사용자가 접근하려 했을 때 발생함. 

403.7 

 Forbidden, 금지 - 클라이언트 확인 필요. 이 에러는 접근하려는 자원이 서버가 인식하기 위해서 브라우저에게 클라이언트 SSL을 요청하는 경우 발생함. 자원을 이용할 수 있는 사용자임을 입증하는데 사용됨. 

403.8 

 Forbidden, 금지 - 사이트 접근 거부. 이 에러는 웹 서버가 요청사항을 수행하고 있지 않거나, 해당 사이트에 접근하는 것을 허락하지 않았을 경우에 발생함. 

403.9 

 Forbidden, 금지 - 연결된 사용자수 과다. 이 에러는 웹 서버가 busy한 상태에 있어서 요청을 수행할 수 없을 경우에 발생함. 

403.10 

 Forbidden, 금지 - 설정이 확실하지 않음. 이 에러는 웹 서버의 설정 부분에 문제가 있을 경우 발생함. 

403.11 

 Forbidden, 금지 - 패스워드 변경. 이 에러는 사용자 인증 단계에서 잘못된 패스워드를 입력했을 경우 발생함. 

403.12 

 Forbidden, 금지 - Mapper 접근 금지. 이 에러는 클라이언트 인증용 맵(map)이 해당 웹 사이트에  접근하는 것을 거부할 경우에 발생. 

404 

 Not Found, 문서를 찾을 수 없음 - 이 에러는 클라이언트가 요청한 문서를 찾지 못한 경우에 발생함. URL을 다시 잘 보고 주소가 올바로 입력되었는지를 확인함. 

405 

 Method not allowed, 메소드 허용 안 됨 - 이 에러는 Request 라인에 명시된 메소드를 수행하기 위한 해당 자원의 이용이 허용되지 않았을 경우에 발생함.

406 

 Not Acceptable, 받아들일 수 없음 - 이 에러는 요청 사항에 필요한 자원은 요청 사항으로 전달된 Accept header에 따라 "Not Acceptable" 내용을 가진 사항이 있을 경우에 발생함. 

407 

 Proxy Authentication Required, Proxy 인증이 필요함 - 이 에러는 해당 요청이 수행되도록 proxy 서버에게 인증을 받아야 할 경우에 발생함.

408 

 Request timeout, 요청 시간이 지남 

409 

 Conflict 

410 

 Gone, 영구적으로 사용할 수 없음. 

411 

 Length Required 

412 

 Precondition Failed, 선결조건 실패 - 이 에러는 Request-header filed에 하나 이상에 선결 조건에 대한 값이 서버에서의 테스트 결과 false로 나왔을 경우에 발생 

413 

 Request entity too large 

414 

 Request-URI too long, 요청한 URI가 너무 김 - 이 에러는 요청한 URI의 길이가 너무 길어서 서버가 요청 사항의 이행을 거부했을 경우 발생

415 

 Unsupported media type 

500 

 Internal Server Error, 서버 내부 오류 - 이 에러는 웹 서버가 요청사항을 수행할 수 없을 경우에 발생함 

501 

 Not Implemented, 적용 안 됨 - 이 에러는 웹 서버가 요청사항을 수행하는데 필요한 기능을 지원하지 않는 경우에 발생 

502 

 Bad gateway, 게이트웨이 상태 나쁨 - 이 에러는 게이트웨이 상태가 나쁘거나 서버의 과부하 상태일 때 발생한다. 

503 

 Service Unavailable, 서비스 불가능 - 이 에러는 서비스가 현재 멈춘 상태 또는 현재 일시적인 과부하 또는 관리 상황일 때 발생될 수 있다. 

504 

 Gateway timeout 

505 

 HTTP Version Not Supported 


출처 : http://hyeonstorage.tistory.com/

728x90

'프로그래밍 > java' 카테고리의 다른 글

String, StringBuffer, StringBuilder의 장단점 및 차이점  (0) 2019.10.11
poi cell Number 포맷 문자로 읽기  (0) 2016.11.04
스프링 DI  (0) 2016.03.29
에자일 방법론  (0) 2016.03.29
java.lang.UnsupportedClassVersionError  (0) 2016.03.28
728x90


2. 스프링 DI (빈 생성과 의존 관계 설정)  스프링 2.5 / = Study = 

2010.05.11. 17:45

복사http://blog.naver.com/chocolleto/30085911267

번역하기 전용뷰어 보기

2. 빈(Bean) 생성과 의존 관계 설정

  □ 빈 생성 및 사용
    ■ <bean>태그를 이용하여 생성할 빈 객체에 대한 정보 설정.
      ○ <bean> 태그
        - 스프링 컨테이너가 관리할 빈 객체를 생성.
 <?xml version="1.0" encoding="UTF-8"?>

 <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    <bean id="articleDao" class="kame.spring.chap02.MysqlArticleDao">
    </bean>

 </beans>
      ○ <bean> 태그 속성
        - class : 생성할 빈 객체의 완전한 클래스 이름.
        - id : 스프링 컨테이너에서 생성된 객체를 구분하는데 사용되는 식별값. (name 속성을 사용해도 됨.)
    ■ 컨테이너로부터 빈 객체를 가져와 사용
 Resource resource = new ClassPathResource("applicationContext.xml");
 // 스프링 컨테이너 생성
 BeanFactory beanFactory = new XmlBeanFactory(resource);
 // 스프링 컨테이너로부터 빈 객체를 가져와 사용
 MysqlArticleDao articleDao = (MysqlArticleDao)beanFactory.getBean("articleDao");
      - 식별값(id속성 또는 name 속성)을 getBean() 메서드에 전달해서 컨테이너로부터 객체를 가져올 수 있음.
    ■ 주의 사항
      - <bean> 태그에 생성자와 관련된 정보(<constructor-arg>태그)를 명시하지 않았다면, 스프링은 파라미터가 없는 기본 생성자를
         이용하여 객체를 생성.
      - 빈으로 사용할 클래스에 파라미터를 갖는 생성자를 정의했다면 기본 생성자도 함께 정의.
 public class MysqlArticleDao implements ArticleDao {
    // 파라미터를 갖는 생성자가 정의되어 있는 경우, 기본 생성자 추가해야 함.
    public MysqlArticleDao() {}

    public MysqlArticleDao(DataSource dataSource) {
        .......
    }
 }
    ■ 빈 팩토리 메서드
      ○ 생성자가 아닌 static 메서드를 이용하여 객체를 생성해야 하는 경우.
 // 싱글톤 패턴이 적용된 클래스.
 public class ParserFactory {
    private static ParserFactory instance = new ParserFactory();

    public static ParserFactory getInstance() {
        return instance;
    }

    // 기본 생성자 접근 막음.
    private ParserFactory() {}
    .......
 }
      ○ <bean> 태그에 factory-method 속성값으로 static 메서드를 지정
        - 해당 메서드를 이용하여 빈을 생성하도록 설정.
 <bean id="parserFactory" class="kame.spring.chap02.ParserFactory"
    factory-method="getInstance" />
        - factory-method 속성을 지정하면 스프링 컨테이너는 생성자를 사용하지 않고 getInstance()메서드를 이용하여 ParserFactory
          클래스의 객체를 구함.

  □ 의존 관계 설정
    - 스프링 컨테이너에서 각 객체 간의 의존 관계도 XML 파일을 통해 명시 가능.
    ■ 생성자 방식
      - 의존하는 객체를 생성자를 통해 전달 받음.
      ○ 의존 관계
        - WriteArticleServiceImpl 클래스는 ArticleDao 인터페이스에 의존.
      ○ 생성자를 통해 의존하는 객체 전달 받기
 public class WriteArticleServiceImpl {
    private ArticleDao articleDao;

    public WriteArticleServiceImpl(ArticleDao articleDao) {
        this.articleDao = articleDao;
    }

    public void write(Article article) {
        ...
        articleDao.insert(article);
    }
 }
      ○ <constructor-arg> 태그
        ● 특징
          - 생성자를 통해서 의존하는 객체를 전달 받는 경우, <constructor-arg> 태그를 이용하여 의존하는 객체를 전달 할 수 있음.
          - 스프링은 <constructor-arg> 태그를 통해 전달된 값의 타입과 가장 근접한 파라미터를 갖는 생성자를 이용하여 객체를 생성.
        ● <constructor-arg> 태그를 이용한 생성자 방식의 설정
 <!-- WriteArticleServiceImpl 클래스의 생성자에 식별값이 "articleDao"인 빈 객체를 전달.-->
 <bean id="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpel">
    <constructor-arg>
        <ref bean="articleDao">
    </constuctor-arg>
 </bean>

 <bean id="articleDao" calss="kame.spring.chap02.OracleArticleDao">
 </bean>
 // 코드로 표현
 OracleArticleDao articleDao = new OracleArticleDao();
 WriteArticleServiceImpl writeArticleService = new WriteArticleServiceImpl(articleDao);
         - <ref> 태그는 레퍼런스(reference)를 의미.
         - <ref> 태그 대신에 <constructor-arg> 태그의 ref 속성을 사용하여 지정 가능.
 <bean id="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpel">
    <constructor-arg ref="articleDao" />
 </bean>
        ● 생성자가 전달받는 값이 기본데이터 타입이나 String 타입일 경우
          - <ref> 태그 대신에 <value> 태그를 사용하여 값을 지정.
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <constructor-arg>
        <value>10</value>
    </constructor-arg>
 </bean>
         - <value> 태그 대신에 <constructor-arg> 태그의 value속성을 사용하여 지정 가능.
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <constructor-arg value="10" />
 </bean>
        ● 생성자가 전달받는 파라미터가 2개 이상인 경우
          - 파라미터 개수 만큼 <constructor-arg> 태그 설정.
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <constructor-arg value="10" />
    <constructor-arg ref="sender" />
 </bean>
      ○ 예제
        - 두 개의 생성자를 갖는 클래스 설정.
        ● 두 개의 생성자를 갖는 클래스
 public class JobExecutor {
    pubilc JobExecutor(Runnable run) {
        ....
    }

    public JobExecutor(Job job) {
        ....
    }
 }
        ● Job 클래스
          - Runnalbe 인터페이스를 상속받은 인터페이스.
 public interface Job extends Runnable {
    ....
 }
        ● SomeRunnable 클래스
          - Runable 인터페이스를 구현한 클래스.
 public class SomeRunnable implements Runnable {
    ....
 }
        ● 스프링 설정 파일
 <bean name="run" class="kame.SomeRunnable" />
 <bean name="job" class="kame.Job" />

 <bean name="executor1" class="kame.JobExecutor">
    <constructor-arg ref="run" />
 </bean>

 <bean name="executor2" class="kame.JobExecutor">
    <constructor-arg ref="job" />
 </bean>
         - executor1 빈을 생성할 때에는 Runnable(SomeRunnable의 타입이 Runnable이므로)을 전달받는 JobExecutor 생성자 사용.
         - executor2 빈을 생성할 때에는 Job을 전달받는 JobExecutor 생성자 사용.
      ○ 예제
        - 두 개 이상의 생성자에서 기본 데이터 타입이나 래퍼 타입을 사용하여 생성하는 클래스 설정.
        ● 세 개의 생성자를 제공하는 클래스
 public class JobExector {
    public JobExecutor(String name, int seconds) { ... }
    public JobExecutor(String name, long millis) { ... }
    public JobExecutor(String name, String seconds) { ... }
 }
        ● 스프링 설정 파일1
 <bean name="executor" class="kame.spring.chap02.JobExecutor">
    <constructor-arg>
        <value>실행기1</value>
    </constructor-arg>
    <constructor-arg>
        <value>3000</value>
    </constructor-arg>
 </bean>

         - 스프링은 기본적으로 <value>에 전달된 값을 java.lang.String 타입으로 처리.
         - 두 번째 파라미터가 String 타입인 생성자를 사용해서 객체를 생성.
         - 만약 매칭되는 파라미터 타입이 String인 생성자가 존재하지 않을 경우 <value>에 전달된 값에 따라 두 번째 파라미터가 알맞는

           데이터 타입인 int인 생성자가 사용.
        ● 스프링 설정 파일2

 <bean name="executor" class="kame.spring.chap02.JobExecutor">
    <constructor-arg>
        <value>실행기1</value>
    </constructor-arg>
    <constructor-arg>
        <value type="long">3000</value>
    </constructor-arg>
 </bean>
         - <value> 태그에 type 속성을 추가하면 직접 매칭될 파라미터의 타입을 명시 가능.
         - <value> 태그뿐만 아니라 <constructor-arg> 태그에 type속성을 추가해도 동일한 동작을 함.
    ■ 프로퍼티 설정 방식
      - setXXXX() 형태의 설정 메서드를 통해서 필요한 객체와 값을 전달 받음.
        (setXXXX() 형태의 메서드에서 프로퍼티의 이름은 XXXX가 됨.)
      ○ 설정 메서드를 통해 의존하는 객체 전달 받기
 public class WriteArticleServiceImpl implements WriteArticleService {
    private ArticleDao articleDao;

    public void setArticleDao(ArticleDao articleDao) {
        this.articleDao = articleDao;
    }
 }
      ○ <property> 태그
        - 프로퍼티에 값을 전달.
        ● <property> 태그를 이용한 프로퍼티 값 설정
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl">
    <property name="articleDao">
        <ref bean="mysqlArticleDao" />
    </property>
 </bean>
          - <property> 태그에서도 <ref> 태그를 이용하여 빈 객체를 프로퍼티의 값으로 전달할 수 있음.
        ● 설정 메소드가 전달받는 값이 기본데이터 타입이나 String 타입일 경우
          - <value> 태그를 사용하여 설정.
 <bean name="lockingFailManager" class="kame.spring.chap02.PessimisticLockingFailManager">
    <property name="retryCount">
        <value>3</value>
    </property>
 </bean>
        ● 빈 객체와 기본 데이터 타입값 전달
 <bean name="monitor" class="kame.spring.chap02.SystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>
    ■ XML 네임스페이스를 이용한 프로퍼티 설정
      - XML 네임스페이스를 이용하면 <property> 태그를 사용하지 않고 좀 더 간단한 방법으로 프로퍼티의 값 설정 가능.
 <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:p="http://www.springframework.org/schema/p"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="monitor" class="kame.spring.chap02.SystemMonitor"
        p:periodTime="10" 
        p:sender-ref="smsSender" />

    <bean id="smsSender" class="kame.spring.chap02.SmsSender" />
 </beans>
         - 접두어 "p"를 사용하여 프로퍼티 값 설정.
         - 기본 데이터 타입 설정 : "p:프로퍼티이름" 속성을 사용하여 프로퍼티 값을 설정.
         - 빈 객체를 프로퍼티에 전달 : "p:프로퍼티이름-ref" 속성을 사용.
    ■ 임의 빈 객체 전달
      - 식별 값을 갖지 않는 빈 객체를 생성해서 전달 가능.
      - <constructor-arg> 태그나 <property> 태그에 <bean> 태그를 중첩해서 사용.
 <bean id="monitor" class="kame.spring.chap02.SystemMonitor"
     p:periodTime="10">
    <property name="sender">
        <!-- 임의 빈 객체 -->
        <bean class="kame.spring.chap02.SmsSender">
            <constructor-arg value="true" />
        </bean>
     </property>
 </bean>
         - 임의 빈 객체는 식별 값을 갖지 않기 때문에 임의 빈 객체를 재사용할 수 없음. (식별값을 준다하더라도 사용할 수 없음.)

  □ 컬렉션 타입 프로퍼티 설정
    ■ 컬렉션 타입을 입력받기 위한 스프링 태그
    ■ List 타입과 배열
      ○ 특징
        - java.util.List 타입의 프로퍼티나 생성자 인자에 값 목록을 전달.
        - <list> 태그 사용
      ○ 설정 방법
 public class ProtocolHandler {
    private List<Filter> filters;

    public void setFilters(List<Filter> filters) {
        this.filters = filters;
    }
    ......
 }
 <bean name="handler" class="kame.spring.chap02.ProtocolHandler">
    <property name="filters">
        <list>
            <ref bean="encryptionFilter" />
            <ref bean="zipFilter" />
            <bean class="kame.spring.chap02.HeaderFilter" />
        </list>
    </property>
 </bean>

 <bean name="zipFilter"class="kame.spring.chap02.ZipFilter" />
 <bean name="encryptionFilter" class="kame.spring.chap02.EncryptionFilter" />
      ○ <list> 태그
        - List에 저장된 객체 목록을 <ref> 태그를 이용하여 전달 받음.
        - <bean> 태그를 이용하여 식별 값을 갖지 않는 임의 객체를 List에 전달 가능.
      ○ List에 저장되는 값이 래퍼 타입이거나 String 타입일 경우
        - <value> 태그를 사용하여 값 전달.
        - <list> 태그의 value-type 속성을 이용하여 List에 저장될 값들의 타입 명시 가능.
        - <value> 태그에 type 속성을 이용해도 List에 저장될 값들의 타입 명시 가능.
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- <value> 태그에 명시된 값은 String 타입으로 처리. -->
        <list>
            <value>0.2</value>
            <value>0.3</value>
        </list>
    </property>
 </bean>
 public class PerformanceMonitor {
    private List deviations;

    public setDeviations(List deviations) {
        this.deviations = deviations;
    }
 }
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- value-type 속성을 이용하여 Double 타입으로 처리. -->
        <list value-type="java.lang.Double">
            <value>0.2</value>
            <value>0.3</value>
        </list>
    </property>
 </bean>
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- value 태그의 type 속성을 이용하여 Double 타입으로 처리. -->
        <list>
            <value type="java.lang.Double">0.2</value>
            <value type="java.lang.Double">0.3</value>
        </list>
    </property>
 </bean>
      ○ Generic 을 이용할 경우
        - <list>나 <value>태그에 값의 타입을 명시하지 않아도 알맞게 타입을 변환.
 public class PerformanceMonitor {
    private List<Double> deviations;

    public setDeviations(List<Double> deviations) {
        this.deviations = deviations;
    }
 }
 <bean name="monitor" class="kame.spring.chap02.PerformanceMonitor">
    <property name="deviations">
        <!-- 제너릭을 사용한 경우, 알맞게 타입 처리. -->
        <list>
            <value>0.2</value>
            <value>0.3</value>
        </list>
    </property>
 </bean>
      ○ List에 저장될 값을 표현하기 위해 사용 가능한 태그
        - <ref> : 다른 스프링 빈 객체를 값으로 사용.
        - <bean> : 임의 빈 객체를 생성해서 값으로 사용.
        - <value> : 래퍼 타입이나 String을 값으로 사용.
        - <list>, <map>, <props>, <set> : 컬렉션 객체를 값으로 사용.
        - <null> : null 값을 값으로 사용.
      ○ 배열
        - <list> 태그는 배열을 설정할 때도 사용.
 public class ProtocolHandler {
    private Filter[] filters;

    public void setFilters(Filter[] filters) {
        this.filters = filters;
    }
    ......
 }
        - <list> 프로퍼티를 이용해서 값 전달.
    ■ Map 타입
      ○ 특징
        - java.util.Map 타입의 프로퍼티를 설정.
        - <map> 태그 사용.
      ○ 설정 방법
 public class ProtocolHandlerFactory {
    private Map<String, ProtocolHandler> handlers;

    public void setHandlers(Map<String, ProtocolHandler> handlers) {
        this.handlers = handlers;
    }
    .......
 }
 <bean name="handlerFactory" class="kame.spring.chap02.ProtocolHandlerFactory">
    <property name="handlers">
        <map>
            <entry>
                <key><value>soap</value></kay>
                <ref bean="soapHandler" />
            </entry>
            <entry>
                <kay><value>rest</value></kay>
                <ref bean ="restHandler" />
            </entry>
        </map>
    </property>
 </bean>
      ○ <entry> 태그
        - 한 개의 <entry> 태그는 Map에 저장될 한 개의 <키, 값>을 표현.
        - 두 개의 자식 노드를 가지며, 각각 키와 값을 의미.
 <map>
    <entry>
        <kay><키태그>...</키태그></key>
        <값태그>...</값태그>
    </entry>
 </map>
        ● <키태그>와 <값태그>에 지정할 수 있는 태그
          - <ref> : 다른 스프링 빈 객체를 키로 사용.
          - <bean> : 임의 빈 객체를 생성해서 키로 사용.
          - <value> : 래퍼 타입이나 String을 키로 사용.
          - <list>, <map>, <props>, <set> : 컬렉션 객체를 키로 사용.
          - <null> : null 값을 키로 사용.
      ○ 예제
 <map>
    <!-- 키와 값의 타입이 각각 String과 Integer일 경우 지정.-->
    <entry>
        <key><value>1</value></key>
        <value type="java.lang.Integer">1th</value>
    </entry>
    <!-- 빈 객체를 참조할 경우 <ref> 태그를 이용하여 지정. -->
    <entry>
        <key><ref bean="protocol"></key>
        <ref bean="handler" />
    </entry>
 </map>
      ○ <entry> 태그의 속성을 이용하여 표현
        - key, key-ref, value, value-ref 속성을 이용하여 <키, 값> 쌍을 좀 더 간단히 표현.
 <!-- 위 코드와 동일 -->
 <map>
    <entry key="1" value="1th" />
    <entry key-ref="protocol" value-ref="handler" />
 </map>
        - 래퍼 타입이나 String 타입을 키나 값에 할당할 때에는 key 속성과 value 속성을 사용.
        - 빈 객체를 참조할 때에는 key-ref나 value-ref를 사용하여 설정.
      ○ 제러닉을 사용하지 않은 상태에서의 래퍼 타입의 키나 값 설정
        - key-type 속성과 value-ref 속성을 이용하여 키와 값의 타입을 지정.
 <property name="ratio">
    <map key-type="java.lang.Integer" value-type="java.lang.Double">
        <entry ... />
        ......
    </map>
 </property>
    ■ Properties 타입
      ○ 특징
        - java.util.Properties 타입의 프로퍼티 설정.
          (Properties 클래스는 환경변수나 설정 정보와 같이 상황에 따라 변경 되는 값을 저장하기 위한 용도로 사용.)
        - <props> 태그 이용.
      ○ 설정 방법
 <bean name="client" class="kame.spring.chap02.BookClient">
    <property name="config">
        <props>
            <prop key="servier">192.168.1.100</prop>
            <prop key="connectionTimeout">5000</prop>
        </props>
    </property>
 </bean>
         - 프로퍼티 이름 : "server"와 "connectionTimeout"
         - 프로퍼티의 값 : "192.168.1.100"과 ."5000"
      ○ <prop> 태그
        - 한 개의 프로퍼티를 표현.
        - 프로퍼티의 이름은 key 속성을이용하여 입력.
        - 프로퍼티의 값은 <prop>태그의 몸체 내용을 이용하여 입력.
        - 한 개의 <prop> 태그는 Properties 태그에 한 개의 프로퍼티로 저장.
          (Properties.getProperty(String name)메서드를 이용하여 프로퍼티 값을 사용.)
 public class BookClient {
    private Properties config;

    public void setConfig(Properties config) {
        this.config = config;
    }

    public void connect() {
        String serverIp = config.getProperty("servier");
        ......
    }
 }
    ■ Set 타입
      ○ 특징
        - java.util.Set 타입의 프로퍼티를 설정.
        - <set>태그를 이용.
      ○ 설정방법
 <property name="subset">
    <set value-type="java.lang.Integer">
        <value>10</value>
        <value>20</value>
        <value>30</value>
    </set>
 </property>
      ○ <set> 태그
        - 집합에 저장될 값을 <value> 태그나 <ref> 등의 태그를 이용하여 표시.
        - 래퍼 타입인 경우 <list>나 <map>의 경우처럼 value-type 속성을 이용하여 저장될 값의 타입을 명시.
          (<value>태그의 type 속성도 이용 가능.)
        ● 값을 지정할 수 있는 태그
          - <ref> :  다른 스프링 빈 객체를 값으로 사용.
          - <bean> : 임의 빈 객체를 생성해서 값으로 사용.
          - <value> : 래퍼 타입이나 String을 값으로 사용.
          - <list>, <map>, <props>, <set> : 컬렉션 객체를 값으로 사용.
          - <null> : null 값을 값으로 사용.

  □ 의존 관계 자동 설정
    ■ 빈 객체 간의 의존 관계 설정
      - <property> 태그를 이용하여 설정.
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl">
    <property name="articleDao">
        <ref bean="articleDao" />
    </property>
 </bean>

 <bean name="articleDao" class="kame.spring.chap02.MysqlArticleDao">
 </bean>
         - writeArticleService 빈 객체에서 articleDao 객체로의 하나의 의존 관계만을 포함.
    ■ 의존관계 자동 설정
      - 의존하는 빈 객체의 타입이나 이름을 이용하여 의존 객체를 자동으로 설정할 수 있는 기능 제공.
        (설정 파일의 크기를 줄일 수 있음.)
      - 자동 설정과 관련하여 별도의 설정을 하지 않으면 자동 설정을 사용하지 않게 됨.
      ○ 자동설정 방식
      ○ 특정 방식을 이용하여 의존 객체 설정
        - <bean> 태그에 autowire 속성을 값을 알맞게 지정.
 <bean id="monitor" class="kame.spring.chap02.SystemMonitor" autowire="byName" />
        ● autowire 속성
          - 기본 값 : default (default-autowire 속성의 값을 사용.)
      ○ 설정 파일에 포함된 모든 빈 객체에 대해서 특정 방식의 자동 설정 적용
        - <beans> 태그의 default-autowire 속성의 값에 설정 방식을 지정.
 <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"
     default-autowire="byName">
    ....
 </beans>
        ● default-autowire 속성
          - 기본 값 : no (자동 설정 하지 않음.)
    ■ 프로퍼티 이름을 이용한 의존 관계 자동 설정
      ○ 특징
        - byName 방식.
        - 프로퍼티 이름과 동일한 이름을 갖는 빈 객체를 프로퍼티 값으로 설정.
      ○ 설정 방법
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl
     autowire="byName" />

 <bean name="articleDao" class="kame.spring.chap02.MysqlArticleDao" />
 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />
         - WriteArticleServiceImpl 클래스가 이름이 "articleDao"인 프로퍼티를 갖고 있다면, 이름이 "articleDao"인 빈 객체가 프로퍼티의
           값으로 전달됨.
      ○ 단점
        - 코드를 리팩토링해서 프로퍼티의 이름을 변경하는 경우 기존에 올바르게 동작하던 설정 파일이 올바르게 동작하지 않을 수도
          있음.
    ■ 프로퍼티 타입을 이용한 의존 관계 자동 설정
      ○ 특징
        - byType 방식.
        - 프로퍼티의 타입과 동일한 타입을 갖는 빈 객체를 프로퍼티 값으로 설정.
      ○ 설정 방법
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="byType" />

 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />
         - articleDao 프로퍼티에 알맞은 빈 객체 설정.
      ○ 단점
        - 프로퍼티 타입과 동일한 타입의 빈 객체를 오직 1개만 설정 가능. 
          (동일한 타입의 빈 객체가 두 개 이상 존재하게 되면 스프링은 어떤 빈 객체를 사용해야 할 지 알 수 없기 때문에 예외 발생.)
    ■ 생성자 파라미터 타입을 이용한 의존 관계 자동 설정
      ○ 특징
        - constructor 방식.
        - byType 방식처럼 타입을 이용하여 값을 전달. (차이점 : 프로퍼티가 아닌 생성자의 파라미터 타입 사용.)
      ○ 설정 방법
 public class WriteArticleSerivceImpl {
    public WriteArticleServiceImpl(ArticleDao articleDao) {
        .........
    }
 }
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="constructor" />

 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />

         - WriteArticleServiceImpl(ArticleDao articleDao) 생성자의 첫 번째 파라미터에 ArticleDao 타입인 mysqlArticleDao 빈 객체가

           전달됨.
      ○ 단점
        - 생성자 파라미터 타입과 일치하는 빈 객체가 2개 이상 존재할 경우 빈 객체를 생성할 때 예외를 발생시킴.
    ■ 생성자 및 프로퍼티 타입을 이용한 자동 설정
      ○ 특징
        - autodetect 방식.
        - constructor 방식을 먼저 적용하고, constructor 방식을 적용할 수 없는 경우 byType 방식을 적용하여 의존 객체를 설정.
      ○ 설정 방법

 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="autodetect" />

 <bean name="mysqlArticleDao" class="kame.spring.chap02.MysqlArticleDao" />
      ○ 단점
        - constructor 방식과 byType 방식을 사용하므로, 동일한 타입의 빈 객체를 2개 이상 정의 할 수 없음.
    ■ 자동 설정과 직접 설정의 혼합
      ○ 특징
        - 자동 설정과 함께 <property> 태그를 이용하여 해당 프로퍼티의 값을 직접 설정.
      ○ 설정 방법
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="byName">
    <property name="eventListener" ref="emailAdaptor" />
 </bean>
      ○ 특정 프로퍼티의 값이 자동 설정에 의해 초기화되지 않게 할 경우
        - <null> 태그를 이용하여 프로퍼티의 값을 null로 설정.
 <bean name="writeArticleService" class="kame.spring.chap02.WriteArticleServiceImpl"
     autowire="byName">
    <property name="eventListener"><null/></property>
 </bean>


  □ 부모 빈을 통한 설정 재사용
    - 중복되는 설정을 갖는 빈이 다수 존재할 경우, 중복되는 설정 정보를 담고 있는 부모 빈을 정의한 뒤, 부모 빈 정보를 재사용하도록

      설정.
    ■ 설정 재사용 전

 <bean id="doorMonitor" class="kame.spring.chap02.SystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <bean id="lobbyMonitor" class="kame.spirng.chap02.SystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <bean id="roomMonitor" class="kame.spring.chap02.SystemMonitor">
    <property name="periodTime" value="20" />
    <property name="sender" ref="smsSender" />
 </bean>
         - 빈의 이름만 다를 뿐 나머지 설정은 대부분 동일.
    ■ 부모 빈으로부터 설정 정보 상속
 <bean id="commonMonitor" class="kame.spring.chap02.SystemMonitor"
     abstract="true">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <bean id="doorMonitor" parent="commonMonitor" />
 <bean id="lobbyMonitor" parent="commonMonitor" />
 <bean id="roomMonitor" parent="commonMonitor">
    <property name="periodTime" value="20" />
 </bean>

      ○ commonMonitor 빈
        - 빈 클래스를 비롯하여 프로퍼티 설정 등이 포함.
        - abstract="true" : 해당 빈 객체를 생성하지 않음.
        - 설정 정보만 존재할 뿐 실제로 객체는 생성되지 않음.
      ○ 자식 빈
        - parent 속성을 사용하여 클래스 및 프로퍼티 설정 정보를 물려받을 부모빈을 설정.
        - parent 속성을 이용하여 물려받은 설정 정보 중에서 변경하고 싶은 값이 있다면 추가로 입력.
        - 프로퍼티뿐만 아니라 클래스도 새롭게 지정 가능.
    ■ 자식 빈에 class 속성 이용하여 클래스 새롭게 지정
      - class 속성 이용하여 클래스를 새롭게 지정하면 부모 빈에서 설정한 클래스가 아닌 class 속성에 명시한 클래스를 사용하여 빈을

        생성.

 <bean id="commonMonitor" class="kame.spring.chap02.SystemMonitor"
     abstract="true">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
 </bean>

 <!-- commonMonitor 빈의 프로퍼티 정보를 사용. -->
 <bean id="extMonitor" parent="commonMonitor" class="ExtendedSystemMonitor">
    <property name="defaultResolution" value="high" />
 </bean>
 <!-- 위와 동일 -->
 <bean id="extMonitor" class="ExtendedSystemMonitor">
    <property name="periodTime" value="10" />
    <property name="sender" ref="smsSender" />
    <property name="defaultResolution" value="high" />
 </bean>


728x90

'프로그래밍 > java' 카테고리의 다른 글

poi cell Number 포맷 문자로 읽기  (0) 2016.11.04
에러코드 정리  (0) 2016.05.25
에자일 방법론  (0) 2016.03.29
java.lang.UnsupportedClassVersionError  (0) 2016.03.28
java 윤년, 평년 구분하기  (0) 2016.01.18

+ Recent posts