자바 웹 개발 시작하기 (5주차 : 스프링...
DESCRIPTION
Java web development 05 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크) 2011. 11. 24 벌써 2년도 넘은 자료지만 그래도 필요하신분이 있을지 몰라서... (지금보니 2년사이 많은것을 배운것 같네요 ㅎㅎ)TRANSCRIPT
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
2011. 11. 24
DEVELOPMENT #2
이덕곤
§ MVC 심층학습
§ 모델
§ 데이터
§ POJO (Plain Old Java Object)
§ 스프링 MVC
§ Java쪽 유효성체크 : 스프링을 사용한 방식을 7주차에 진행합니다.
§ 한 개의 작업을 위해 DB를 여러 번 다녀오는 구조로 효율성 감소… : 하이버네이트를 사용하면서 격을 수 있는 문제입니다.(HQL로 해소가능)
§ 뭔가 잘못된 접근이나 오류가 났을 때 처리를 위해 message.jsp를 추가 했습니다. 이렇게 만드니깐 많은 부분 해결이 되더군요. : 좋은 방법입니다.
§ 하이버네이트를 사용하다 보니 필요 없는 부분도 읽게 되는 문제가… : 사실 하이버네이트는 블로그 같은 시스템과는 어울리지 않습니다. (좀더 복잡한… 비즈니스 로직이 들어가는 DW 시스템 등 에서 활용)
§ 타협하라 - Eric Evans : Domain-Driven Design (2004, Addison-Wesley) § 데이터베이스가 하나의 객체 저장소로 보여진다면 매핑 도구의 기능과는 상관없이 데이터 모델과 객체 모델이 서로
갈라지게 해서는 안 된다. 일부 객체 관계의 풍부함을 희생해서 관계 모델에 밀접하게 한다. 객체 매핑을 단순화 하는데 도움이 된다면 정규화와 같은 정형화된 관계 표준을 절충한다.
§ http://deview.naver.com/2011/track/A_06.html
§ 다시 보는 스프링 프레임워크 § 단순함에서 발견하는 아름다움
§ IoC (Inversion of Control)
§ DI (Dependency Injection)
§ AOP (Aspect Oriented Programming)
§ 중간 정리를 하는 시간… (프로젝트 범위의 설정)
§ Frame Work : 응용 프로그램 골격
§ 웹사이트가 점점 커지면서 엔터프라이즈급의 서비스가 필요하게 됨 § 자바진영에서는 EJB가 엔터프라이즈급 서비스로 각광을 받게 됨
§ 세션빈에서 Transaction 관리가 용이함
§ 컨테이너를 제공. 로깅, 분산처리, 보안 등 처리가 용이함
§ 하지만 EJB는 개발시 여러 가지 제약이 존재함(배보다 배꼽이 더 큼) § EJB스펙에 정의된 인터페이스에 따라 코드를 작성하므로 기존에 작성된
POJO를 변경해야 함
§ 컨테이너에 배포를 해야만 테스트가 가능해 개발속도가 저하됨
§ 배우기 어렵고, 설정해야 할 부분이 많음 (XML 지옥)
EJB
Non EJB
복잡한 개발 과정 (감싸고 감싸고…)
컨테이너 제공 (TX, 로깅, 분산, 보안 등)
테스트의 어려움 (상속, 또 상속…)
표준이 없다 (EJB가 표준임)
빠른 개발 속도, 테스트의 용이성
엔터프라이즈 기능을 자체 구현해야 함
§ 스프링의 탄생 § 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, 프레임워크와의 연동을 지원함
§ 반복적인 코드의 제거, 생산성 향상
§ EJB Container § EJB(세션빈, 엔티티빈, MDB)의 생성, 생성 후 초기화, 서비스 실행,
소멸에 관한 모든 권한을 가지면서 EJB의 생명주기를 관리
§ 개발자들이 직접 EJB 생성하고 서비스할 수 없다
§ Transaction, Security, EJB Pooling등의 추가적인 기능을 제공
§ IoC(또는 DI) Container § POJO의 생성, 초기화, 서비스 소멸에 관한 모든 권한을 가지면서
POJO의 생명주기를 관리
§ 개발자가 직접 생성할 수도 있지만, 모든걸 Container에게 맡김
§ Transaction, Security 추가적인 기능을 제공한다. AOP 기능을 이용하여 새로운 Container 기능을 추가하는 것이 가능
EJB Non EJB
Spring Framework
장점 장점
Light Container 구현
• EJB에 비해 배우기 쉽다.
• 빈의 설정이 쉽다(XML)
• 테스트가 용이하다.
• AOP, OOP 개발에 제약이 없다.
• 필요한 인스턴스를 스프링에서 미리 생성해 준다.
• 클래스 사이의 결합을 느슨하게 (loosely coupled)할 수 있어 클래스 간의 의존 관계가 약해진다.
장 점
§ IOC(Inversion of control : 제어권의 역전) § 객체의 생성부터 생명주기 관리까지 객체에 대한 제어권이 바뀜
§ 자바 개발 초기 : 객체 생성, 의존관계 연결 등의 제어권이 개발자에게
§ EJB 등장 : 제어권이 서블릿과 EJB를 관리하는 컨테이너에게
§ DI (Dependency Injection : 의존성 주입) § DI는 Spring 프레임워크에서 지원하는 IoC의 형태이다.
§ DI는 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해주는 것
§ 개발자들은 빈 설정 파일(저장소 관리 파일)에 의존관계가 필요하다는 정보를 추가하면 됨
§ Spring 프레임워크는 Setter Injection, Constructor Injection, Method Injection의 세가지 유형 존재
IoC
DI
IoC : Inversion of Control DI : Dependency Injection DP : Dependency Pull
DP
Constructor Injection
Setter Injection
• EJB • Spring
• Spring • PicoContainer
Method Injection
§ 구현체를 new 키워드를 사용하여 생성
§ 스펙이 바뀌거나 하면 적용이 쉽지 않고 수정할 사항도 많아짐
§ 인터페이스로 의존도는 낮아졌지만 여전히..
§ 스프링에서 DI(Dependency Injection)패턴
§ 객체 외부의 조립기(Assembler)가 각 객체의 의존관계를 설정해 줌
§ DI 사용하지 않은 코드 구현 § 테스트 하기 어려움
§ 인터페이스를 사용하여 개선 § 개선 해도 문제는 여전히 남아있음
§ new 필요함
§ DI 사용하여 코드 개선 § new 필요하지 않음
§ 종속성은 컨테이너가 알아서~
§ loose coupling
§ 스프링 컨테이너가 지원하는 핵심 개념 중 하나
§ DI는 객체 사이의 의존 관계를 객체 자신이 아닌 외부의 조립기(스프링 컨테이너)가 수행한다는 개념
§ 스프링은 설정 파일이나 어노테이션을 이용하여 객체 간의 의존 관계를 설정할 수 있다
§ 우리는 이미 계속 사용하고 있었음
§ AOP 적용하지 않고 로깅 구현. § 중복되는 코드 발생.
§ 종속성 발생.
§ AOP 사용하여 코드 개선. § 중복 제거.
§ non intrusive.
주 문
로 깅 • 일반적인 객체지향 프로그래밍 방법 • 문제가 되지 않는다.
주 문
로 깅 대 여
반 납 기타 업무
문제가 발생한다.!!!
§ 사용자 요구사항의 변화
§ 해당 업무 호출 필요가 없어진다
§ 다른 업무로 대체
§ 시점의 변화 등
§ 이름 변경
Modify
주 문
대 여
반 납
기타 업무
로깅
어느 객체에서 필요 한가? Pointcut
언제 무엇을 해야하는가? Advice
Advisor Jointpoint 추가기능 넣는 곳
Business Logic
Cross Cutting Concern • call • Return • throw
ProxyFactoryBean IOC / DI
§ Before Advice § 메소드를 실행하기 전에 어떠한 일을 추가하고 싶을 경우
§ After Advice § 메소드를 실행완료 후 어떠한 일을 추가하고 싶을 경우
§ After-retuning Advice § 메소드의 실행을 무사히 완료한 뒤에 추가할 작업을 정의
§ After-throwing Advice § 메소드에서 예외(Exception)가 발생했을 경우 특정한 일을 추가
§ Around Advice § 위의 역할을 모두 다 할 수 있는 Advice
주 문
대 여
반 납
기타업무
Business Logic
Business Logic
Cross Cutting Concern
§ 라이브러리 추가 § com.springsource.org.aopalliance-1.0.0.jar
§ com.springsource.org.apache.commons.collections-3.2.1.jar
§ com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
§ applicationContext.xml 수정 § xmlns:aop="http://www.springframework.org/schema/aop"
§ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
§ <aop:aspectj-autoproxy />
@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(); ★: " + "글 목록 보기 종료 합니다." + "]");
}
}
@Around("execution(* com.starpl.study.*.*.BoardDao.getBoardList(..))")
public Object observeService(ProceedingJoinPoint joinPoint) throws Throwable
{
Object result = null;
String runTarget = joinPoint.getTarget().getClass().getName();
String runMethod = joinPoint.getSignature().getName();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
result = joinPoint.proceed();
stopWatch.stop();
System.out.println("★ " + String.format("%06.3f", stopWatch.getTotalTimeSeconds()) + "s : [" + runTarget + "." + runMethod + "]");
return result;
}
§ @Around("execution(* com.starpl.study.*.*.BoardDao.getBoardList(..))")
§ @Before("execution( * com.starpl.study.model.dao. BoardDao.getBoardList(..))")
§ @After("execution( * com.starpl.study.model.dao. BoardDao.getBoardList(..))")
§ @Around("@annotation (org.springframework.web.bind.annotation.RequestMapping)")
§ @Around("within(@org.springframework.stereotype.Repository *) ")
§ @Around("within(@org.springframework.stereotype.Service *) ")
§ 프레임워크의 개념에 대해 이해함
§ 스프링 프레임워크의 특징을 이해 함 § IoC : 제어의 역행
§ DI : 의존성의 주입 (조립기가 필요)
§ AOP : 관점 지향 프로그래밍 (횡단 관심사 부여)
§ DI를 활용하여 프로젝트를 설계할 수 있음 § 인터페이스의 사용과 조립기를 이해함
§ AOP를 활용하여 프로젝트를 설계할 수 있음 § 로깅 처리를 이해하고 구현할 수 있음
§ 간단한 게시판을 만들어보자! (특히 DB 고민)
§ DataBase : MySQL, DBCP
§ 하이버네이트
§ 기초 쿼리(CRUD)
§ 예외처리
§ Transaction(TX)
§ 과제 : 게시판 기능 추가
§ http://en.wikipedia.org/wiki/Dependency_Injection
§ http://en.wikipedia.org/wiki/Aspect-oriented_programming
§ http://wiki.dev.daewoobrenic.co.kr/mediawiki/index.php/Spring_Overall_Quick_View
§ http://wiki.dev.daewoobrenic.co.kr/mediawiki/index.php/%EC%8A%A4%ED%94%84%EB%A7%81_%ED%95%B5%EC%8B%AC_%EA%B0%9C%EB%85%90_-_Ioc
§ http://wiki.dev.daewoobrenic.co.kr/mediawiki/index.php/%EC%8A%A4%ED%94%84%EB%A7%81_%ED%95%B5%EC%8B%AC_%EA%B0%9C%EB%85%90_-_Aop
§ http://blog.java2game.com/241
§ http://en.wikipedia.org/wiki/Convention_over_Configuration