고급자바프로그래밍 (Advanced Java Programming)
description
Transcript of 고급자바프로그래밍 (Advanced Java Programming)
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 AnnotationConfigApplication-Context(DaoFactory.class);
UserDao dao = context.getBean("userDao", UserDao.class);
spring30-1.5.1
9
ApplicationContext 에게 정보를 제공하는 방법
xml 설정 파일
리스트 1-40
ApplicationContext context = new GenericXmlApplicationCon-text("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
끝