강의 3 - 강원대학교

Report
1
고급자바프로그래밍
(ADVANCED JAVA PROGRAMMING)
강원대학교 컴퓨터학부
2012년 가을학기
담당교수 정충교
2
1.4 제어의 역전
(IoC - Inversion of Control)
애플리케이션 코드가 프레임워크에 의해 제어됨
1.4.3 제어권 이전을 통한 제어관계 역전
메인 메소드 없이 프레임워크에 의해 프로그램들이 실행됨
3
1.3.3 관계설정 책임의 분리
• 관계설정 책임을 담당하는 클라이언트 userDaoTest 추가
• 특정 ConnectionMaker 이름이 들어 있지 않은 “범용” UserDao가
됨
• 어떤 ConnectionMaker를 사용할지 클라이언트가 결정해줌
• 리스트 1-11, 리스트 1-12, 리스트 1-13
• spring30-1.3.3
4
1.4.1 오브젝트 팩토리
클라이언트 기능 중 테스트 기능과 관계설정 기능을 분리
public class UserDaoFactory {
public UserDao userDao() {
UserDao dao = new UserDao(connectionMaker());
return dao;
}
public ConnectionMaker connectionMaker() {
ConnectionMaker connectionMaker = new DConnectionMaker();
return connectionMaker;
}
}
public class UserDaoTest {
public static void main(String[] args)
throws ClassNotFoundException, SQLException {
UserDao dao = new UserDaoFactory().userDao();
...
5
6
1.5 스프링의 IoC
1.5.1 오브젝트 팩토리를 이용한 스프링 IoC
스프링 빈 (bean)
스프링에 의해 제어되는 오브젝트
스프링이 만들고 관계를 부여함
빈 팩토리
빈의 생성과 관계 설정을 담당
Application context
빈 팩토리를 확장한 것
7
스프링 설정
ApplicationContext가 필요로 하는 정보
어떤 bean을 어떤 클래스로부터 생성할지
오브젝트간 관계는 어떻게 설정할지
ApplicationContext에게 정보를 제공하는 방법
애노테이션이 첨가된 자바 코드
xml 설정 파일
8
ApplicationContext에게 정보를 제공하는 방법
애노테이션이 첨가된 자바 코드
리스트 1-18
리스트 1-19
ApplicationContext context = new
AnnotationConfigApplicationContext(DaoFactory.class);
UserDao dao = context.getBean("userDao", UserDao.class);
spring30-1.5.1
9
ApplicationContext에게 정보를 제공하는 방법
xml 설정 파일
리스트 1-40
ApplicationContext context = new
GenericXmlApplicationContext("applicationContext.xml");
UserDao dao = context.getBean("userDao", UserDao.class);
10
1.7 의존관계 주입
(DI – Dependency Injection)
1.7.1 IoC and DI
1.7.2 런타임 의존관계
인터페이스를 통한
느슨한 결합을 갖는 의존관
계
클래스의 의존관계
고정된 의존관계
런타임에 오브젝트간 의존
관계가 결정됨
11
의존관계 주입 (DI)
• 어떤 객체가 사용할 (의존할) 대상 객체를 런타임에 지정해
주는 작업
• 두 클래스가 인터페이스에의 의해 느슨하게 결합한다. 클래스 코드
에는 클래스간 런타임 의존관계가 나타나지 않는다.
• 런타임 의존관계는 컨테이너나 팩토리같은 제 3자가 결정한다.
• 의존관계는 사용할 오브젝트 레퍼런스를 제공(주입)해 줌으로써 만
들어진다.
12
제 3자가 런타임에 UserDao 객체에게 ConnectionMaker 객체를 주입(DI)하
려면 UserDao의 코드가 아래와 같은 생성자를 갖거나 setter 메소드를 가져야
함
public class UserDao {
private ConnectionMaker connectionMaker;
public ConnectionMaker(ConnectionMaker connectionMaker) {
this.connectionMaker = connectionMaker;
}
public void setConnectionMaker(ConnectionMaker simpleConnectionMaker) {
this.connectionMaker = simpleConnectionMaker;
}
런타임 의존관계 주입에 의한 객체간 의존관계
13
1.8 XML을 이용한 설정
<beans>
<bean id="myConnectionMaker"
class="springbook.user.dao.DConnectionMaker">
</bean>
<bean id="userDao" class="springbook.user.dao.UserDao">
<property name="connectionMaker"
ref="myConnectionMaker" />
</bean>
</beans>
public class UserDao {
private ConnectionMaker connectionMaker;
public void setConnectionMaker(ConnectionMaker connectionMaker) {
this.connectionMaker = connectionMaker;
}
14
1.8.3 DataSource 인터페이스로 변환
1.8.4 프로퍼티 값 주입
• ConnectionMaker 대신 javax.sql.DataSource를 사용
• 리스트 1-41
• 리스트 1-42 DataSource를 사용하는 UserDao
• 리스트 1-48 dataSource를 bean으로 등록하는 xml 설정
15
1.6 싱글톤 레지스트리와 오브젝트 스코프
• 스프링의 애플리케이션 컨텍스트가 생성하는 빈은 기본적
으로 싱글톤임
• 싱글톤 (Singleton) - 두 개 이상의 인스턴스들이 동시에 존재할 수 없는 클
래스, 항상 한 개의 인스턴스만을 가짐
• 클래스를 작성할 때 두 개 이상의 인스턴스를 만들 수 없도록 코드를 작성할
수 있음 (싱클톤 클래스)
• (싱글톤 클래스를 작성하는 방법 - 교재 108쪽 하단 - 109쪽 상단 참고)
• 스프링의 애플리케이션 컨텍스트는 빈을 만들 때 기본적으
로 싱글톤으로 만듬 (클래스가 싱글톤 패턴에 맞춰 작성된
것이 아니라도)
• 싱글톤이 되지 않도록 설정하는 것도 가능
• 엔터프라이즈 애플리케이션은 서버로 작동하므로 각 사용자 요청마다 빈을
만들면 서버 성능에 문제가 생기므로...
16
• UserDao, ConnectionMaker는 빈이다.
• User는 빈이 아니다.
• 싱글톤인 빈을 설계할 때 인스턴스 필드 지정에 신중해야
함
• 각 사용자의 요청을 처리하는 쓰레드들이 동시에 하나의
빈을 실행하므로 인스턴스 필드에 상태정보를 저장할 수
없음
17
잘 못된 예
public class UserDao {
private DataSource dataSource;
private Connection c;
private User user;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public User get(String id) throws SQLException {
User user = new User();
Connection c = this.dataSource.getConnection();
PreparedStatement ps = c.prepareStatement(...);
...
}
18
1.7.4 의존관계 주입의 응용
• 기능 구현의 교환
• LocalDBConnectionMaker <--> ProductDBConnectionMaker
• 부가기능 추가
• 개발 중 DB 연결 횟수를 세고 싶다. (부가기능)
• Dao에 이 기능을 추가하는 것은 좋지 않다.
•
개발 후 모두 제거해야 하므로
•
Dao의 관심사항이 아니므로 (Dao의 응집도!)
19
Dao와 connectionMaker 사이에
연결횟수를 세는 (부가기능) 오브젝트를 삽입
• 리스트 1-30 <----- 매우 중요!
• 기존 런타임 오브젝트 의존관계
• CountingConnectionMaker를 적용한 후의 오브젝트 런타임 의존관계
20
끝

similar documents