자바 웹 개발 시작하기 (5주차 : 스프링...

31
자바 개발 시작하기 (5주차 : 스프링 프래임워크) 2011. 11. 24 DEVELOPMENT #2 이덕곤

Upload: dk-lee

Post on 20-Dec-2014

1.669 views

Category:

Technology


3 download

DESCRIPTION

Java web development 05 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크) 2011. 11. 24 벌써 2년도 넘은 자료지만 그래도 필요하신분이 있을지 몰라서... (지금보니 2년사이 많은것을 배운것 같네요 ㅎㅎ)

TRANSCRIPT

Page 1: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

2011. 11. 24

DEVELOPMENT #2

이덕곤

Page 2: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  MVC 심층학습

§  모델

§  데이터

§  POJO (Plain Old Java Object)

§  스프링 MVC

Page 3: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  Java쪽 유효성체크 : 스프링을 사용한 방식을 7주차에 진행합니다.

§  한 개의 작업을 위해 DB를 여러 번 다녀오는 구조로 효율성 감소… : 하이버네이트를 사용하면서 격을 수 있는 문제입니다.(HQL로 해소가능)

§  뭔가 잘못된 접근이나 오류가 났을 때 처리를 위해 message.jsp를 추가 했습니다. 이렇게 만드니깐 많은 부분 해결이 되더군요. : 좋은 방법입니다.

§  하이버네이트를 사용하다 보니 필요 없는 부분도 읽게 되는 문제가… : 사실 하이버네이트는 블로그 같은 시스템과는 어울리지 않습니다. (좀더 복잡한… 비즈니스 로직이 들어가는 DW 시스템 등 에서 활용)

§  타협하라 - Eric Evans : Domain-Driven Design (2004, Addison-Wesley) §  데이터베이스가 하나의 객체 저장소로 보여진다면 매핑 도구의 기능과는 상관없이 데이터 모델과 객체 모델이 서로

갈라지게 해서는 안 된다. 일부 객체 관계의 풍부함을 희생해서 관계 모델에 밀접하게 한다. 객체 매핑을 단순화 하는데 도움이 된다면 정규화와 같은 정형화된 관계 표준을 절충한다.

§  http://deview.naver.com/2011/track/A_06.html

Page 4: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  다시 보는 스프링 프레임워크 §  단순함에서 발견하는 아름다움

§  IoC (Inversion of Control)

§  DI (Dependency Injection)

§  AOP (Aspect Oriented Programming)

§  중간 정리를 하는 시간… (프로젝트 범위의 설정)

Page 5: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  Frame Work : 응용 프로그램 골격

§  웹사이트가 점점 커지면서 엔터프라이즈급의 서비스가 필요하게 됨 §  자바진영에서는 EJB가 엔터프라이즈급 서비스로 각광을 받게 됨

§  세션빈에서 Transaction 관리가 용이함

§  컨테이너를 제공. 로깅, 분산처리, 보안 등 처리가 용이함

§  하지만 EJB는 개발시 여러 가지 제약이 존재함(배보다 배꼽이 더 큼) §  EJB스펙에 정의된 인터페이스에 따라 코드를 작성하므로 기존에 작성된

POJO를 변경해야 함

§  컨테이너에 배포를 해야만 테스트가 가능해 개발속도가 저하됨

§  배우기 어렵고, 설정해야 할 부분이 많음 (XML 지옥)

Page 6: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

EJB

Non EJB

복잡한 개발 과정 (감싸고 감싸고…)

컨테이너 제공 (TX, 로깅, 분산, 보안 등)

테스트의 어려움 (상속, 또 상속…)

표준이 없다 (EJB가 표준임)

빠른 개발 속도, 테스트의 용이성

엔터프라이즈 기능을 자체 구현해야 함

Page 7: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  스프링의 탄생 §  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, 프레임워크와의 연동을 지원함

§  반복적인 코드의 제거, 생산성 향상

Page 8: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  EJB Container §  EJB(세션빈, 엔티티빈, MDB)의 생성, 생성 후 초기화, 서비스 실행,

소멸에 관한 모든 권한을 가지면서 EJB의 생명주기를 관리

§  개발자들이 직접 EJB 생성하고 서비스할 수 없다

§  Transaction, Security, EJB Pooling등의 추가적인 기능을 제공

§  IoC(또는 DI) Container §  POJO의 생성, 초기화, 서비스 소멸에 관한 모든 권한을 가지면서

POJO의 생명주기를 관리

§  개발자가 직접 생성할 수도 있지만, 모든걸 Container에게 맡김

§  Transaction, Security 추가적인 기능을 제공한다. AOP 기능을 이용하여 새로운 Container 기능을 추가하는 것이 가능

Page 9: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

EJB Non EJB

Spring Framework

장점 장점

Light Container 구현

• EJB에 비해 배우기 쉽다.

• 빈의 설정이 쉽다(XML)

• 테스트가 용이하다.

• AOP, OOP 개발에 제약이 없다.

• 필요한 인스턴스를 스프링에서 미리 생성해 준다.

• 클래스 사이의 결합을 느슨하게 (loosely coupled)할 수 있어 클래스 간의 의존 관계가 약해진다.

장 점

Page 10: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
Page 11: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  IOC(Inversion of control : 제어권의 역전) §  객체의 생성부터 생명주기 관리까지 객체에 대한 제어권이 바뀜

§  자바 개발 초기 : 객체 생성, 의존관계 연결 등의 제어권이 개발자에게

§  EJB 등장 : 제어권이 서블릿과 EJB를 관리하는 컨테이너에게

§  DI (Dependency Injection : 의존성 주입) §  DI는 Spring 프레임워크에서 지원하는 IoC의 형태이다.

§  DI는 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해주는 것

§  개발자들은 빈 설정 파일(저장소 관리 파일)에 의존관계가 필요하다는 정보를 추가하면 됨

§  Spring 프레임워크는 Setter Injection, Constructor Injection, Method Injection의 세가지 유형 존재

Page 12: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

IoC

DI

IoC : Inversion of Control DI : Dependency Injection DP : Dependency Pull

DP

Constructor Injection

Setter Injection

•  EJB •  Spring

•  Spring •  PicoContainer

Method Injection

Page 13: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  구현체를 new 키워드를 사용하여 생성

§  스펙이 바뀌거나 하면 적용이 쉽지 않고 수정할 사항도 많아짐

Page 14: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  인터페이스로 의존도는 낮아졌지만 여전히..

Page 15: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  스프링에서 DI(Dependency Injection)패턴

§  객체 외부의 조립기(Assembler)가 각 객체의 의존관계를 설정해 줌

Page 16: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  DI 사용하지 않은 코드 구현 §  테스트 하기 어려움

§  인터페이스를 사용하여 개선 §  개선 해도 문제는 여전히 남아있음

§  new 필요함

§  DI 사용하여 코드 개선 §  new 필요하지 않음

§  종속성은 컨테이너가 알아서~

§  loose coupling

Page 17: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  스프링 컨테이너가 지원하는 핵심 개념 중 하나

§  DI는 객체 사이의 의존 관계를 객체 자신이 아닌 외부의 조립기(스프링 컨테이너)가 수행한다는 개념

§  스프링은 설정 파일이나 어노테이션을 이용하여 객체 간의 의존 관계를 설정할 수 있다

§  우리는 이미 계속 사용하고 있었음

Page 18: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  AOP 적용하지 않고 로깅 구현. §  중복되는 코드 발생.

§  종속성 발생.

§  AOP 사용하여 코드 개선. §  중복 제거.

§  non intrusive.

Page 19: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

주 문

로 깅 •  일반적인 객체지향 프로그래밍 방법 •  문제가 되지 않는다.

주 문

로 깅 대 여

반 납 기타 업무

문제가 발생한다.!!!

Page 20: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  사용자 요구사항의 변화

§  해당 업무 호출 필요가 없어진다

§  다른 업무로 대체

§  시점의 변화 등

§  이름 변경

Modify

Page 21: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

주 문

대 여

반 납

기타 업무

로깅

어느 객체에서 필요 한가? Pointcut

언제 무엇을 해야하는가? Advice

Advisor Jointpoint 추가기능 넣는 곳

Business Logic

Cross Cutting Concern • call • Return • throw

ProxyFactoryBean IOC / DI

Page 22: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  Before Advice §  메소드를 실행하기 전에 어떠한 일을 추가하고 싶을 경우

§  After Advice §  메소드를 실행완료 후 어떠한 일을 추가하고 싶을 경우

§  After-retuning Advice §  메소드의 실행을 무사히 완료한 뒤에 추가할 작업을 정의

§  After-throwing Advice §  메소드에서 예외(Exception)가 발생했을 경우 특정한 일을 추가

§  Around Advice §  위의 역할을 모두 다 할 수 있는 Advice

Page 23: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

주 문

대 여

반 납

기타업무

Business Logic

Business Logic

Cross Cutting Concern

Page 24: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  라이브러리 추가 §  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 />

Page 25: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

@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(); ★: " + "글 목록 보기 종료 합니다." + "]");

}

}

Page 26: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

@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;

}

Page 27: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  @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 *) ")

Page 28: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  프레임워크의 개념에 대해 이해함

§  스프링 프레임워크의 특징을 이해 함 §  IoC : 제어의 역행

§  DI : 의존성의 주입 (조립기가 필요)

§  AOP : 관점 지향 프로그래밍 (횡단 관심사 부여)

§  DI를 활용하여 프로젝트를 설계할 수 있음 §  인터페이스의 사용과 조립기를 이해함

§  AOP를 활용하여 프로젝트를 설계할 수 있음 §  로깅 처리를 이해하고 구현할 수 있음

Page 29: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  간단한 게시판을 만들어보자! (특히 DB 고민)

§  DataBase : MySQL, DBCP

§  하이버네이트

§  기초 쿼리(CRUD)

§  예외처리

§  Transaction(TX)

§  과제 : 게시판 기능 추가

Page 30: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)

§  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

Page 31: 자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)