'Di'에 해당되는 글 2건

  1. 2014.10.14 DI;Dependency Injection - 의존성 주입 2
  2. 2014.09.11 Spring의 기본개념이해
2014. 10. 14. 19:58


사용 목적 


- 모듈간 결합도를 낮추기 위해 사용(종속성 제거

- 협업, 유지보수 용이

 


(설명)

A class B class가 있습니다. B class의 구현을 위해 A객체가 필요하다면 B class A class에 대한 Dependency(의존성)을 가진다고 말합니다.따라서 B class의 구현을 위해서는 A Bean이 필요한데 필요하다고 해서 직접 A Bean생성(new A() 방식)을 하지 않고 다른 방법을 통해 A Bean를 주입시켜 주는 것을 DI(의존성 주입)이라고 말합니다.

 

 

의존성 주입 3가지 패턴

(3 Patterns of Dependency Injection by Martin Fowler)

 

1) 생성자를 통한 주입(Injection by Constructor) : 비추

 

- A class의 생성자를 만들어 B class에 의존성을 주입

 

2) 셋터 메서드를 통한 주입(Injection by Setter method)

 

- A class(멤버)필드에 대한 setter()를 만들어 의존성 주입

 

3) 인터페이스를 통한 주입(Injection by Interface)

 

- 인터페이스에 의존성을 주입하는 추상메서드를 만들고 실행시 이 인터페이스를 

구현함으로써 의존성을 주입

 

 

 

<의존성 주입 예시>

 

BoardDAO 인터페이스

 

package dao;

import java.util.List;

import vo.Board;

 

//확장성을 휘해 BoardDAO를 인터페이스 생성

public interface BoardDAO {

         public List<Board> selectBoardList();

}//BoardDAO interface end

 

BoardDAO 인터페이스 구현 클래스

 

package dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import vo.Board;

 

//인터페이스 BoardDAO의 구현을 위한 BoardDAOImpl class

public class BoardDAOImpl implements BoardDAO {

 

// BoardDAO class SqlSession Class에 의존성을 가짐

// 1) SqlSession property 선언

// 2) SqlSession class setter()를 통해 의존성 주입

private SqlSession session;

public void setSession(SqlSession session) {

this.session = session;

}

 

//구현객체는 반드시 추상메서드를 구현해야합니다.

         public List<Board> selectBoardList(){

        

//의존성 주입을 했기 때문에 session객체를 바로 쓸 수 있습니다.

return session.selectList("board.selectBoardList");

         }; // selectBoardList()

}//BoardDAOImpl class end

 

 

BoardService 인터페이스

 

package service;

import java.util.List;

import vo.Board;

 

//BoardService interfaceTransaction 관리를 위해 만듭니다.

public interface BoardService {

public List<Board> getList();

}//BoardService interface end

 

BoardService 인터페이스 구현 클래스

 

package service;

import java.util.List;

import vo.Board;

import dao.BoardDAO;

 

//BoardService interface구현을 위한 BoardServiceImpl class

public class BoardServiceImpl implements BoardService {

 

 //BoardService BoardDAO에 대한 의존성을 가짐

          //따라서 BoardDAO Property를 선언해주고

 //setter를 통해 의존성 주입

         private BoardDAO dao;

 

 public void setDao(BoardDAO dao){

                   this.dao = dao;

 }

 

//구현객체는 반드시 추상메서드를 구현해야합니다.

 public List<Board> getList(){

   //의존성 주입을 했기 때문에 dao객체를 바로 쓸 수 있습니다.

                   return dao.selectBoardList();

 }

}//BoardServiceImpl class end


 

Tip) method명 짓는 노하우

 

- DAO SQL구문과 직접 관련되므로 메서드명에 select, update,delete,insert를 쓰면 편리함 ()selectList, selectOne

 

- Service DAO를 호출하기 때문에 굳이 SQL를 몰라도 됩니다.메서드명 규칙는 의미에 맞게 해줍니다. ()getList,getBoard,getUserInfo





크리에이티브 커먼즈 라이선스


Posted by 루피아빠
2014. 9. 11. 23:19

라이브러리와 프레임워크의 차이


프레임워크의 제어 역전의 개념이 적용되어야 한다. 애플리케이션을 동작하기 위한 기능을 적용하기 위해 개발자가 직접 애플리케이션 코드를 직접 제어한다면 이것은 라이브러리이다. , 객체가 필요할 때 그 객체를 개발자가 직접 제어하는가 알아서 필요한 객체를 만들어 주느냐(제어역전)에 따라 프레임워크와 라이브러리가 구분된다고 할 수 있다. 개발자는 프레임워크 틀안에 개발에 필요한 클래스를 등록해두고, 프레임워크가 알아서 객체의 생명주기를 관리하며 애플리케이션의 흐름을 주도하는 것이다.

 

Spring Framework 특징 

-외부링크 : 위키백과 스프링 프레임워크 정의


1) IoC Container

- 자바 객체의 생명주기를 관리(제어 역전)

 

2) POJO(Plain Old Java Object) 방식

- 가볍다

 

3) DI(Dependency Injection) : 의존성 주입

- 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 의존성을 주입함으로써 서로 연결

- 협업하는 개발자 모두 알아야하는 부분

() DAO SqlSession에 의존적입니다. Spring DAO실행 시 알아서 SqlSession을 주입해줍니다.

 

4) AOP 지원(Aspect-Oriented Programming) : 관점지향 프로그래밍

- 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리

- XML에 설정만 잘해두면 스프링이 알아서 처리

- MySQL, Oracle, CUBRID - 3가지 데이터베이스 동시처리 가능

- 설정에 관한 부분으로 개발자 1명만 알아도 협업이 가능함

(예) TX(transaction)이나 logging, security


* Transaction

쇼핑몰에서 장바구니에 담은 상품을 결제를 하면 동시에 장바구니에서 상품이 사려져야 합니다.

2가지 이벤트가 동시에 발생해야 하는 일처리가 가능하게 하는 Transaction기능을 Spring은 지원

 

5) Persistence(영속성)과 관련된 다양한 서비스를 지원

- iBatis(MyBatis) Hibernate 등 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공

 

6) high scalability(높은 확장성)

- 이미 수많은 라이브러리가 스프링에서 지원

- 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이

 

7) Spring MVC(Model-View-Controller) - Model2 방식

- 웹 프로그래밍 개발시 사용하는 방식

- DispatcherServlet이 Contoller 역할을 담당 -> 각종 요청을 적절한 서비스에 분산

- 이를 각 서비스들이 처리를 하여 결과를 생성하고 그 결과는 다양한 형식의 View 서비스들로 화면에 표시


8) Batch 지원

- 데이터 처리에 관한 프레임워크로, Job launcher, Job, Job repository로 구성

- 스케쥴링에 따른 Job을 구동하는 기능은 Quartz같은 전용 스케쥴러가 함

- 전용 스케쥴러가 일련의 연속된 Job을 실행하고 스프링 배치는 이런 일련의 단계를 조정

- 스프링 배치의 Job은 여러개의 Step으로 설정되고 각 Step의 실행순서는 배치 XML을 사용해서 쉽게 설정

 

9) 다국어처리 지원



Spring 주요 모듈


1) Core container

- Spring 프레임워크의 핵심 기능을 제공

- 코어 컨테이너의 주요 컴포넌트는 Bean-Factory(Factory 패턴의 구현)

- BeanFactory는  IoC(Inversion of Control)을 사용하여 애플리케이션의 설정 / DI(Dependency Injection)을 실제 애플리케이션 코드에서 분리


2) Context

- Spring을 프레임워크로 만든 것은 컨텍스트 모듈

- 이 모듈은 국제화된 메시지, 애플리케이션 생명주기, 유효성 검증 등을 지원

- 이메일, JNDI 접근, EJB 연계, 리모팅, 스케쥴링 등과 같은 다수의 엔터프라이즈 서비스를 추가로 제공

- 템플릿 프레임워크와 통합 지원


3) AOP(Aspect Oriented Programming)

- Spring 기반 애플리케이션에서 객체에 트랜잭션 관리 서비스를 제공

- EJB 컴포넌트에 의존하지 않고도 선언적 트랜잭션 관리를 애플리케이션과 결합 가능


4) DAO

- Spring JDBC DAO 추상 레이어는 다른 데이터베이스 벤더들의 예외 핸들링과 오류 메시지를 관리하는 중요한 예외 계층을 제공


5) ORM

- 여러 ORM 프레임워크에 플러그인 되어, Object Relational 툴 (JDO, Hibernate, iBatis SQL Map)을 제공한다. 

- Spring의 일반 트랜잭션과 DAO 예외 계층에 순응


6) Web

- 애플리케이션 컨텍스트 모듈의 상단에 구현되어, 웹 기반 애플리케이션에 컨텍스트를 제공

- 다중 요청을 핸들링하고, 요청 매개변수를 도메인 객체로 바인딩하는 작업을 수월하게 함


7) MVC

- MVC 프레임워크는 전략 인터페이스를 통해 설정가능

JSP, Velocity, Tiles, iText, POI 같은 다양한 뷰 기술을 허용



Posted by 루피아빠