1. 자바 웹 개발 시작하기
(5주차 : 스프링 프래임워크)
2011. 11. 24
DEVELOPMENT #2
이덕곤
2. § MVC 심층학습
§ 모델
§ 데이터
§ POJO (Plain Old Java Object)
§ 스프링 MVC
3. § Java쪽 유효성체크 : 스프링을 사용한 방식을 7주차에 진행합니다.
§ 한 개의 작업을 위해 DB를 여러 번 다녀오는 구조로 효율성 감소…
: 하이버네이트를 사용하면서 격을 수 있는 문제입니다.(HQL로 해소가능)
§ 뭔가 잘못된 접근이나 오류가 났을 때 처리를 위해 message.jsp를 추가
했습니다. 이렇게 만드니깐 많은 부분 해결이 되더군요. : 좋은 방법입니다.
§ 하이버네이트를 사용하다 보니 필요 없는 부분도 읽게 되는 문제가…
: 사실 하이버네이트는 블로그 같은 시스템과는 어울리지 않습니다.
(좀더 복잡한… 비즈니스 로직이 들어가는 DW 시스템 등 에서 활용)
§ 타협하라 - Eric Evans : Domain-Driven Design (2004, Addison-Wesley)
§
데이터베이스가 하나의 객체 저장소로 보여진다면 매핑 도구의 기능과는 상관없이 데이터 모델과 객체 모델이 서로
갈라지게 해서는 안 된다. 일부 객체 관계의 풍부함을 희생해서 관계 모델에 밀접하게 한다. 객체 매핑을 단순화
하는데 도움이 된다면 정규화와 같은 정형화된 관계 표준을 절충한다.
§ http://deview.naver.com/2011/track/A_06.html
4. § 다시 보는 스프링
프레임워크
§ 단순함에서 발견하는 아름다움
§ IoC (Inversion of Control)
§ DI (Dependency Injection)
§ AOP (Aspect Oriented Programming)
§ 중간 정리를 하는 시간… (프로젝트 범위의 설정)
5. § Frame Work : 응용 프로그램 골격
§ 웹사이트가 점점 커지면서 엔터프라이즈급의 서비스가 필요하게 됨
§ 자바진영에서는 EJB가 엔터프라이즈급 서비스로 각광을 받게 됨
§ 세션빈에서 Transaction 관리가 용이함
§ 컨테이너를 제공. 로깅, 분산처리, 보안 등 처리가 용이함
§ 하지만 EJB는 개발시 여러 가지 제약이 존재함(배보다 배꼽이 더 큼)
§ EJB스펙에 정의된 인터페이스에 따라 코드를 작성하므로 기존에 작성된
POJO를 변경해야 함
§ 컨테이너에 배포를 해야만 테스트가 가능해 개발속도가 저하됨
§ 배우기 어렵고, 설정해야 할 부분이 많음 (XML 지옥)
6. EJB
복잡한 개발 과정 (감싸고 감싸고…)
테스트의 어려움 (상속, 또 상속…)
컨테이너 제공 (TX, 로깅, 분산, 보안 등)
Non EJB
표준이 없다 (EJB가 표준임)
엔터프라이즈 기능을 자체 구현해야 함
빠른 개발 속도, 테스트의 용이성
7. § 스프링의 탄생
§ Rod Johnson : Expert One-on-One J2EE Development without EJB
§ EJB를 사용하지 않고 엔터프라이즈 어플리케이션을 개발하는 방법소개
§ Spring is a lightweight dependency injection and
aspect-oriented container and framework.
§ 매우 경량 프레임워크로 엔터프라이즈 서비스를 쉽게 구축
§ 의존성 주입(Dependency Injection)을 통한 유연한 (느슨한 결합)
§ 관점지향 프로그래밍(Aspect oriented Programming) 지원
§ 평범한 자바빈으로(POJO) 프로그래밍 모델 가능
§ 다양한 API, 프레임워크와의 연동을 지원함
§ 반복적인 코드의 제거, 생산성 향상
8. § EJB Container
§ EJB(세션빈, 엔티티빈, MDB)의 생성, 생성 후 초기화, 서비스 실행,
소멸에 관한 모든 권한을 가지면서 EJB의 생명주기를 관리
§ 개발자들이 직접 EJB 생성하고 서비스할 수 없다
§ Transaction, Security, EJB Pooling등의 추가적인 기능을 제공
§ IoC(또는 DI) Container
§ POJO의 생성, 초기화, 서비스 소멸에 관한 모든 권한을 가지면서
POJO의 생명주기를 관리
§ 개발자가 직접 생성할 수도 있지만, 모든걸 Container에게 맡김
§ Transaction, Security 추가적인 기능을 제공한다. AOP 기능을
이용하여 새로운 Container 기능을 추가하는 것이 가능
9. Non EJB
EJB
장점
장점
Spring Framework
Light Container 구현
• EJB에 비해 배우기 쉽다.
• 빈의 설정이 쉽다(XML)
• 테스트가 용이하다.
• AOP, OOP 개발에 제약이 없다.
장점
• 필요한 인스턴스를 스프링에서
미리 생성해 준다.
• 클래스 사이의 결합을 느슨하게
(loosely coupled)할 수 있어
클래스 간의 의존 관계가 약해진다.
11. § IOC(Inversion of control : 제어권의 역전)
§ 객체의 생성부터 생명주기 관리까지 객체에 대한 제어권이 바뀜
§ 자바 개발 초기 : 객체 생성, 의존관계 연결 등의 제어권이 개발자에게
§ EJB 등장 : 제어권이 서블릿과 EJB를 관리하는 컨테이너에게
§ DI (Dependency Injection : 의존성 주입)
§ DI는 Spring 프레임워크에서 지원하는 IoC의 형태이다.
§ DI는 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가
자동적으로 연결해주는 것
§ 개발자들은 빈 설정 파일(저장소 관리 파일)에 의존관계가 필요하다는
정보를 추가하면 됨
§ Spring 프레임워크는 Setter Injection, Constructor Injection, Method
Injection의 세가지 유형 존재
12. • EJB
• Spring
IoC : Inversion of Control
DI : Dependency Injection
DP : Dependency Pull
DP
IoC
Setter Injection
DI
Constructor Injection
• Spring
• PicoContainer
Method Injection
13. § 구현체를 new 키워드를 사용하여 생성
§ 스펙이 바뀌거나 하면
적용이 쉽지 않고
수정할 사항도 많아짐
16. § DI 사용하지 않은 코드 구현
§ 테스트 하기 어려움
§ 인터페이스를 사용하여 개선
§ 개선 해도 문제는 여전히 남아있음
§ new 필요함
§ DI 사용하여 코드 개선
§ new 필요하지 않음
§ 종속성은 컨테이너가 알아서~
§ loose coupling
17. § 스프링 컨테이너가 지원하는 핵심 개념 중 하나
§ DI는 객체 사이의 의존 관계를 객체 자신이 아닌
외부의 조립기(스프링 컨테이너)가 수행한다는
개념
§ 스프링은 설정 파일이나 어노테이션을 이용하여
객체 간의 의존 관계를 설정할 수 있다
§ 우리는 이미 계속 사용하고 있었음
18. § AOP 적용하지 않고 로깅 구현.
§ 중복되는 코드 발생.
§ 종속성 발생.
§ AOP 사용하여 코드 개선.
§ 중복 제거.
§ non intrusive.
19. 주 문
로깅
• 일반적인 객체지향 프로그래밍 방법
• 문제가 되지 않는다.
문제가 발생한다.!!!
주 문
로깅
대 여
반 납
기타 업무
20. § 사용자 요구사항의 변화
§ 해당 업무 호출 필요가 없어진다
§ 다른 업무로 대체
§ 시점의 변화 등
§ 이름 변경
Modify
21. Business Logic
주 문
대 여
• call
• Return Jointpoint Cross
• throw 추가기능 넣는 곳
로깅
Cutting Concern
Advisor
어느 객체에서 필요 한가?
Pointcut
반 납
언제 무엇을 해야하는가?
Advice
기타 업무
IOC / DI
ProxyFactoryBean
22. § Before Advice
§ 메소드를 실행하기 전에 어떠한 일을 추가하고 싶을 경우
§ After Advice
§ 메소드를 실행완료 후 어떠한 일을 추가하고 싶을 경우
§ After-retuning Advice
§ 메소드의 실행을 무사히 완료한 뒤에 추가할 작업을 정의
§ After-throwing Advice
§ 메소드에서 예외(Exception)가 발생했을 경우 특정한 일을 추가
§ Around Advice
§ 위의 역할을 모두 다 할 수 있는 Advice
25. @Aspect
@Component
public class BoardAop
{
@Before("execution(* com.starpl.study.model.dao.BoardDao.getBoardList(..))")
public void beforeGetBoardList() throws Throwable {
System.out.println("[List(); ★: " + "글 목록 보기 시작 합니다." + "]");
}
@After("execution(* com.starpl.study.model.dao.BoardDao.getBoardList(..))")
public void afterGetBoardList() throws Throwable {
System.out.println("[List(); ★: " + "글 목록 보기 종료 합니다." + "]");
}
}
28. § 프레임워크의 개념에 대해 이해함
§ 스프링 프레임워크의 특징을 이해 함
§ IoC : 제어의 역행
§ DI : 의존성의 주입 (조립기가 필요)
§ AOP : 관점 지향 프로그래밍 (횡단 관심사 부여)
§ DI를 활용하여 프로젝트를 설계할 수 있음
§ 인터페이스의 사용과 조립기를 이해함
§ AOP를 활용하여 프로젝트를 설계할 수 있음
§ 로깅 처리를 이해하고 구현할 수 있음
29. § 간단한 게시판을 만들어보자! (특히 DB 고민)
§ DataBase : MySQL, DBCP
§ 하이버네이트
§ 기초 쿼리(CRUD)
§ 예외처리
§ Transaction(TX)
§ 과제 : 게시판 기능 추가