Transcript
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


Recommended