JAKARTAPROJECT
JAKARTA TIPJSP TIPJSP 질문&답변DATABASE TIPJAVASCRIPT TIPWEBHACKING TIP기타 TIP
JSP 팁
JSP 팁
JSP 팁 게시판 입니다
Spring 빈묶기-기본묶기
kaiser
이미지 슬라이더 보기
 

Spring 컨테이너 안에서 빈들(컴포넌트)끼리 사용하거나 사용되어지는 것을 묶기라고 한다. 빈을 묶을 에는 어떤 빈들이 사용 지와 빈들을 묶기 위해서 어떻게 의존성 주입을 사용할지를 컨테이너에게 알려줘야 한다. 이때 컨테이너에게 알려 때는 xml 이용하여 알려준다.

 

간단한 샘플을 보면서 진행해 보자

여러분이 스프링 트레이닝 주식회사라는 기술교육단체와 계약된 상태라고 가정하자 스프링 트레이닝사는 수강생이 온라인으로 교과 과정을 등록할 있도록 하는 애플리케이션을 만들어 달라고 요청했다.

먼저 애플리케이션의 서비스 계층부터 만들어 보자

아래의 그림은 스프링 트레이닝 애플리케이션에서 서비스 계층을 구성하는 계층을 보여준다.

 


 

서비스 계층에는 수강생 서비스(Student Service) 교과과정 서비스 (Course Service) 라는 개의 서비스 컴포넌트가 있다.

 -.수강생 서비스(Student Service) : 수강생과 관련된 모든 것을 처리

 -.교과과정 서비스 (Course Service) : 교과과정과 관련된 모든 기능을 처리

 

지금은 어떻게 구현되어 있는지 코드를 구현 부분만 살펴보고 나중에

완전한 소스를 알아보자 궁금하면 www.acornpub.co.kr 에서 소스를 다운 받아 확인해 보세요

 

 

Student Service.java

 

public interface StudentService {

  public Student getStudent(String login);

  public void registerStudent(Student student);

  public java.util.Set getCompletedCourses(Student student);

  public String getCurrentUserId();

}

 

 

 

CourseService.java

 

 

public interface CourseService {

  public Course getCourse(int id);

  public Course getCourse(Integer id);

  public void saveCourse(Course course);

  public java.util.Set getAllCourses();

  public void enrollStudentInCourse(Course course, Student student) throws CourseException;

  public void sendCourseEnrollmentReport();

}

 

 

StudentServiceImpl

 

 

public class StudentServiceImpl implements StudentService {

  Logger LOGGER = Logger.getLogger(StudentServiceImpl.class);

 

  private StudentDao studentDao;

 

  // 생성자에 의한 주입

  public StudentServiceImpl(StudentDao dao) {

    studentDao = dao;

  }

  // setter 의한 주입

  // 참고: 소스에는 없다. 다만, 원리를 설명하기 위함.

  public setStudentDao(StudentDao dao) {

    studentDao = dao;

  }

 

 

  public Student getStudent(String login) {

    return studentDao.findById(login);

  }

 

  public void registerStudent(Student student) {

    HashSet authorities = new HashSet();

    authorities.add(new Authority("ROLE_STUDENT"));

    authorities.add(new Authority("ROLE_USER"));

    student.setAuthorities(authorities);

 

    studentDao.create(student);

  }

 

  public java.util.Set getCompletedCourses(Student student) {

    return studentDao.getCompletedCourses(student);

  }

 

  /*

   * TODO - This could be used more generically for Instructors as well.

   * But since it's only used for Students right now and because it would

   * be silly to create a UserService for this simple method, we'll just

   * put it here for now.

   */

  public String getCurrentUserId() {

    return ((SecureContext)ContextHolder.getContext()).getAuthentication().getPrincipal().toString();

  }

}

 

 

StudentServiceImpl 학생을 찾고, 생성하고 수강하는 작업등을 StudentDao 위임하여 StudentDao 데이터베이스와 상호작용하여 처리한다. StudentDao 객체의 실제 구현내용은 나중에 알아보기로 한다.

그리고 StudentDao 구현한 클래스는 StudentDaoImpl 클래스이다.

StudentDaoImpl 위의 소스에서 것과 같이 생성자와 setStudentDao() 메소드를 이용하여 StudentDao 대한 참조를 얻을 있다.

 

CourseServiceImpl.java

 

 

 

public class CourseServiceImpl implements CourseService {

 

  private static Logger LOGGER = Logger.getLogger(CourseServiceImpl.class);

  // 생성자 주입을 통한 CourseDao 설정

  public CourseServiceImpl(CourseDao dao) {

    this.courseDao = dao;

  }

 

 

  public Course getCourse(int id) {

    return getCourse(new Integer(id));

  }

 

  public Course getCourse(Integer id) {

    return courseDao.findById(id);

  }

 

  public void saveCourse(Course course) {

    courseDao.save(course);

  }

 

  public void enrollStudentInCourse(Course course,

      Student student) throws CourseException {

 

    // TODO:    enforcePrerequisites(course, student);

 

    // TODO:    Check for schedule conflicts

 

    course.getStudents().add(student);

    courseDao.save(course);

  }

 

  public Set getAllCourses() {

    return courseDao.findAll();

  }

 

  public void sendCourseEnrollmentReport() {

    Set courseList = courseDao.findAll();

 

    SimpleMailMessage message =

        new SimpleMailMessage(this.mailMessage);

 

    StringBuffer messageText = new StringBuffer();

    messageText.append("Current enrollment data is as follows:\n\n");

   

    for(Iterator iter = courseList.iterator(); iter.hasNext(); ) {

      Course course = (Course) iter.next();

      messageText.append(course.getId() + "    ");

      messageText.append(course.getName() + "    ");

      int enrollment = courseDao.getEnrollment(course);

      messageText.append(enrollment);

    }

 

    message.setText(messageText.toString());

 

    try {

      mailSender.send(message);

    } catch (MailException e) {

      LOGGER.error(e.getMessage());

    }

  }

 

  private void enforcePrerequisites(Course course,

      Student student) throws CourseException {

   

    Set completed = studentService.getCompletedCourses(student);

 

    // Check for prerequesites

    Set prereqs = course.getPrerequisites();

    for(Iterator iter = prereqs.iterator(); iter.hasNext(); ) {

      if(!completed.contains(iter.next())) {

        throw new CourseException("Prerequisites are not met.");

      }

    }

   

    // Check for scheduling clash

    for(Iterator iter = completed.iterator(); iter.hasNext(); ) {

      Course completedCourse = (Course) iter.next();

     

    }

  }

 

  // COLLABORATORS

  private CourseDao courseDao;

  public void setCourseDao(CourseDao courseDao) {

    this.courseDao = courseDao;

  }

 

  private StudentService studentService;

  public void setStudentService(StudentService service) {

    this.studentService = service;

  }

 

  private MailSender mailSender;

  public void setMailSender(MailSender mailSender) {

    this.mailSender = mailSender;

  }

 

  private SimpleMailMessage mailMessage;

  public void setMailMessage(SimpleMailMessage mailMessage) {

    this.mailMessage = mailMessage;

  }

}

 

 

CourseServiceImpl 생성자를 통해 CourseDao 참조를 있다. enrollStudentInCourse() 메소드는 수강생을 교과과정에 추가하기 전에 enforcePrerequisites() 먼저 호출한다. 만약 수강생이 선수과목을 이수하지 않았다면 enforcePrerequisites() CourseException 던질 것이며, 이를 다시 enrollStudentInCourse() 던질 것이다.

enforcePrerequisites() StudentService 참조를 사용해 수강생이 수료한 모든 과목을 얻어온다. 이는 선수과목이라는 비즈니스 요구사항을 충목시키기 위해 CourseDao 뿐만 아니라, CourseServiceImpl과도 참조한다는 의미다.

CourseServiceImpl CourseDao 생성자를 통해 얻는 것과 달리, StudentService 참조는 setStudentService() 메소드를 통해 얻는다. 이런 이유는 courseDao 이용하여 과목을 찾는데 사용되기 되고,  속성 값을 설정하지 않으면 인스턴스를 생성할수 없기때문에  private CourseDao courseDao 속성을 설정했다.

다음은 xml 빈을 묶는 것에 대해 알아 보자

 

2009-11-29 20:19:01
211.189.124.***

서현사랑~ 안녕 안녕 나의 아기별~~

첨부파일 (총 1개)
  1. 23.jpg 36.6 KB (98 다운로드)
0점 (1명)
덧글 0개 | 태그 1개 | 관련글보기
태그입력
쉽표(,)구분으로 한번에 여러 태그를 입력할수 있습니다
spring (18)
이름 비밀번호
JSP 팁
JSP 팁 게시판 입니다
! 번호 제목 글쓴이 일자 조회
114 STS Spring MVC on STS 2.8, 2.9 버전에서 프로젝트 생성시 에러발생 할 경우 1 GoodBug 2012-03-08 8,041
113 dbcp DBCP 사용시 DB정보 암호화 1 GoodBug 2012-02-08 5,555
112 스트럿츠 action alert 메시지 출력 후 페이지 이동 & 뒤로가기 예방 행복한광대 2009-01-14 11,605
111 spring spring 자동묶기 1 kaiser 2007-03-12 11,816
110 spring Spring 빈묶기- 생성자를 통한 의존성 주입 2 1 kaiser 2007-02-21 21,576
109 spring Spring 빈묶기-세터메소드를 통한 의존성 주입 1 kaiser 2007-02-21 11,879
108 spring Spring - xml로 묶기 1 kaiser 2007-02-07 12,367
spring Spring 빈묶기-기본묶기 1 kaiser 2007-02-05 8,784
106 spring spring 빈묶기-2 1 kaiser 2007-01-29 9,645
105 spring Spring 빈묶기-1 1 kaiser 2007-01-29 9,718
104 spring Spring 1차 요약 1 kaiser 2007-01-23 10,789
103 spring spring 시작하기-2 1 1 kaiser 2007-01-22 9,942
102 spring Spring 시작하기-1 4 1 kaiser 2007-01-22 11,649
101 spring Spring 서론 - spring 설치 1 1 kaiser 2007-01-19 13,327
100 clob 사용하기 kaiser 2008-08-21 7,645
99 span 글쓰기 후 사용할 protoload 1 1 고고싱 2008-05-09 7,139
98 log4sql log4sql 1 1 Aki 2008-04-30 8,371
97 숫자 세자리마다 콤마 찍기 1 곱슬대마왕 2008-03-21 8,476
96 iBatis iBatis 에서 SQL 로깅시 이뿌게 보이기 6 1 GoodBug 2007-10-26 22,577
95 log4sql요즘 많이 쓰는것 같던데.... 영이남푠 2008-10-17 8,096
copyright 2005-2018 by Unicorn