20
고고고고고고고고고 (ADVANCED JAVA PROGRAMMING) 고고고고고 고고고고고 2012 고 고고고고 고고고고 고고고 1

고급자바프로그래밍 (Advanced Java Programming)

  • Upload
    tovah

  • View
    43

  • Download
    0

Embed Size (px)

DESCRIPTION

고급자바프로그래밍 (Advanced Java Programming). 강원대학교 컴퓨터학부 2012 년 가을학기 담당교수 정충교. 1.4 제어의 역전 ( IoC - Inversion of Control). 애플리케이션 코드가 프레임워크에 의해 제어됨 1.4.3 제어권 이전을 통한 제어관계 역전 메인 메소드 없이 프레임워크에 의해 프로그램들이 실행됨. 1.3.3 관계설정 책임의 분리. 관계설정 책임을 담당하는 클라이언트 userDaoTest 추가 - PowerPoint PPT Presentation

Citation preview

Page 1: 고급자바프로그래밍 (Advanced Java Programming)

1

고급자바프로그래밍(ADVANCED JAVA PROGRAMMING)

강원대학교 컴퓨터학부2012 년 가을학기담당교수 정충교

Page 2: 고급자바프로그래밍 (Advanced Java Programming)

2

1.4 제어의 역전 (IoC - Inversion of Control)

애플리케이션 코드가 프레임워크에 의해 제어됨

1.4.3 제어권 이전을 통한 제어관계 역전

메인 메소드 없이 프레임워크에 의해 프로그램들이 실행됨

Page 3: 고급자바프로그래밍 (Advanced Java Programming)

3

1.3.3 관계설정 책임의 분리

• 관계설정 책임을 담당하는 클라이언트 userDaoTest 추가• 특정 ConnectionMaker 이름이 들어 있지 않은 “범용” UserDao 가 됨• 어떤 ConnectionMaker 를 사용할지 클라이언트가 결정해줌• 리스트 1-11, 리스트 1-12, 리스트 1-13• spring30-1.3.3

Page 4: 고급자바프로그래밍 (Advanced Java Programming)

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();

...

Page 5: 고급자바프로그래밍 (Advanced Java Programming)

5

Page 6: 고급자바프로그래밍 (Advanced Java Programming)

6

1.5 스프링의 IoC

1.5.1 오브젝트 팩토리를 이용한 스프링 IoC

스프링 빈 (bean)스프링에 의해 제어되는 오브젝트스프링이 만들고 관계를 부여함

빈 팩토리빈의 생성과 관계 설정을 담당

Application context빈 팩토리를 확장한 것

Page 7: 고급자바프로그래밍 (Advanced Java Programming)

7

스프링 설정ApplicationContext 가 필요로 하는 정보

어떤 bean 을 어떤 클래스로부터 생성할지오브젝트간 관계는 어떻게 설정할지

ApplicationContext 에게 정보를 제공하는 방법애노테이션이 첨가된 자바 코드xml 설정 파일

Page 8: 고급자바프로그래밍 (Advanced Java Programming)

8

ApplicationContext 에게 정보를 제공하는 방법

애노테이션이 첨가된 자바 코드

리스트 1-18

리스트 1-19

ApplicationContext context = new AnnotationConfigApplication-Context(DaoFactory.class);

UserDao dao = context.getBean("userDao", UserDao.class);

spring30-1.5.1

Page 9: 고급자바프로그래밍 (Advanced Java Programming)

9

ApplicationContext 에게 정보를 제공하는 방법

xml 설정 파일

리스트 1-40

ApplicationContext context = new GenericXmlApplicationCon-text("applicationContext.xml");

UserDao dao = context.getBean("userDao", UserDao.class);

Page 10: 고급자바프로그래밍 (Advanced Java Programming)

10

1.7 의존관계 주입 (DI – Dependency Injection)

1.7.1 IoC and DI

1.7.2 런타임 의존관계

   

클래스의 의존관계

고정된 의존관계

인터페이스를 통한 느슨한 결합을 갖는 의존관계

런 타 임 에 오 브 젝 트 간 의존관계가 결정됨

Page 11: 고급자바프로그래밍 (Advanced Java Programming)

11

의존관계 주입 (DI)

• 어떤 객체가 사용할 ( 의존할 ) 대상 객체를 런타임에 지정해 주는 작업

• 두 클래스가 인터페이스에의 의해 느슨하게 결합한다 . 클래스 코드에는 클래스간 런타임 의존관계가 나타나지 않는다 .

• 런타임 의존관계는 컨테이너나 팩토리같은 제 3 자가 결정한다 .

• 의존관계는 사용할 오브젝트 레퍼런스를 제공 ( 주입 ) 해 줌으로써 만들어진다 .

Page 12: 고급자바프로그래밍 (Advanced Java Programming)

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;

}

런타임 의존관계 주입에 의한 객체간 의존관계

Page 13: 고급자바프로그래밍 (Advanced Java Programming)

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;

}

Page 14: 고급자바프로그래밍 (Advanced Java Programming)

14

1.8.3 DataSource 인터페이스로 변환 1.8.4 프로퍼티 값 주입• ConnectionMaker 대신 javax.sql.DataSource 를 사용

• 리스트 1-41• 리스트 1-42 DataSource 를 사용하는 UserDao• 리스트 1-48 dataSource 를 bean 으로 등록하는 xml 설정

Page 15: 고급자바프로그래밍 (Advanced Java Programming)

15

1.6 싱글톤 레지스트리와 오브젝트 스코프• 스프링의 애플리케이션 컨텍스트가 생성하는 빈은 기본적으로

싱글톤임• 싱글톤 (Singleton) - 두 개 이상의 인스턴스들이 동시에 존재할 수 없는 클래스 ,

항상 한 개의 인스턴스만을 가짐 • 클래스를 작성할 때 두 개 이상의 인스턴스를 만들 수 없도록 코드를 작성할 수

있음 ( 싱클톤 클래스 )• ( 싱글톤 클래스를 작성하는 방법 - 교재 108 쪽 하단 - 109 쪽 상단 참고 )

• 스프링의 애플리케이션 컨텍스트는 빈을 만들 때 기본적으로 싱글톤으로 만듬 ( 클래스가 싱글톤 패턴에 맞춰 작성된 것이 아니라도 )• 싱글톤이 되지 않도록 설정하는 것도 가능• 엔터프라이즈 애플리케이션은 서버로 작동하므로 각 사용자 요청마다 빈을

만들면 서버 성능에 문제가 생기므로 ...

Page 16: 고급자바프로그래밍 (Advanced Java Programming)

16

• UserDao, ConnectionMaker 는 빈이다 .• User 는 빈이 아니다 .• 싱글톤인 빈을 설계할 때 인스턴스 필드 지정에 신중해야 함• 각 사용자의 요청을 처리하는 쓰레드들이 동시에 하나의 빈을

실행하므로 인스턴스 필드에 상태정보를 저장할 수 없음

Page 17: 고급자바프로그래밍 (Advanced Java Programming)

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(...);

...

}

Page 18: 고급자바프로그래밍 (Advanced Java Programming)

18

1.7.4 의존관계 주입의 응용• 기능 구현의 교환

• LocalDBConnectionMaker <--> ProductDBConnectionMaker

• 부가기능 추가• 개발 중 DB 연결 횟수를 세고 싶다 . ( 부가기능 )• Dao 에 이 기능을 추가하는 것은 좋지 않다 . • 개발 후 모두 제거해야 하므로• Dao 의 관심사항이 아니므로 (Dao 의 응집도 !)

Page 19: 고급자바프로그래밍 (Advanced Java Programming)

19

Dao 와 connectionMaker 사이에 연결횟수를 세는 ( 부가기능 ) 오브젝트를 삽입• 리스트 1-30 <----- 매우 중요 !

• 기존 런타임 오브젝트 의존관계

• CountingConnectionMaker 를 적용한 후의 오브젝트 런타임 의존관계

Page 20: 고급자바프로그래밍 (Advanced Java Programming)

20