스프링의 핵심인 DI(Depnedency Injection)와 IoC(Inversion of Control)를 제공한다.
spring-aop
AOP구현 기능 제공
spring-jdbc
데이터베이스를 쉽게(적은 양의 코드)다룰 수 있는 기능 제공
spring-tx
스프링에서 제공하는 트랜잭션 관련 기능 제공
spring-webmvc
스프링에서 제공하는 컨트롤러(Controller)와 뷰(view)를 이용한 스프링MVC 구현 기능 제공
스프링 프레임워크에서 제공하는 모듈을 사용하려면, 모듈에 대한 의존설정을 개발 프로젝트에 XML 파일등을 이용해 개발자가 직접 하면된다.
1-3 스프링 컨테이너(IoC)
스프링에서 객체를 생성하고 조립하는 컨테이너(container)로, 컨테이너를 통해 생선된 객체를 빈(Bean)이라고 부른다.
1) 객체생성 및 속성 데이터 작성
2) 스프링 컨테이너에서 객체 생성 및 조립
3) 애플리케이션 구현
필요할 때마다 스프링컨테이너에서 기능을 빼서 쓰는 개념이다.sprin
(2강 개발환경설정)
3-1 프로젝트 생성
groupId와 artifactId
groupId
큰 프로젝트 단위
지하철(1~9호선)
artifactId
세부 프로젝트 단위
1호선, 2호선, 3호선...
3-2 pom.xml 작성
pom.xml
필요한 모듈을 가져오는 기능
3-3 폴더 및 pom.xml 파일의 이해(기본 폴더 디렉토리)
src/main
src/main/java
특별한 것은 없고, 앞으로 만들어지는 자바 파일들이 관리되는 곳이다.
src/main/resource
자원을 관리하는 폴더로 스프링 설정파일(XML) 또는 프로퍼티 파일 등이 관리된다.
src/test
4-1 처음해보는 스프링 프로젝트
java 객체생성 및 Bean 생성
기존 java 객체 생성
//기존 자바 객체생성 (main)
TranspotationWalk transpotationWalk = new TranspotationWalk();
transpotationWalk.move();
//TranspotationWalk
public void move(){
System.out.println("도로로 이동 합니다.");
}
Spring Bean이용 IoC생성
//XML Bean 추가
<bean id="tWalk" class ="testPjt.TranspotationWalk"/>
//main
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml");
TranspotationWalk transpotationWalk = ctx.getBean("tWalk",TranspotationWalk.class);
transpotationWalk.move();
ctx.close();
6-1 DI(Dependency Injection) 의존성 주입
배터리 일체형 : 의존성 없음 / 배터리가 떨어지면 새로 구입해야한다.(비효율)
public class ElectronicCarToy{
private Battery battery;
public ElectoincCarToy(){
battery=new NormalBattery();//객체 생성될때 new해준다.
}
}
배터리 분리형1 : 초기에는 배터리X, 사용자가 넣어줘야함(의존성 주입)
public class ElectronicCarToy{
private Battery battery;
public ElectoincCarToy(){
}
//setter
public void setBattery(Battery battery){
this.battery = battert;
}
}
배터리 분리형2 : 초기에 배터리O, 사용자가 배터리 교체(의존성 주입)
public class ElectronicCarToy{
private Battery battery;
//생성자
public ElectoincCarToy(){
this.batter=battery;
}
//setter
public void setBattery(Battery battery){
this.battery = battert;
}
}
같은 DB 사용하기(DAO 의존성 주입)
public StudentAssbler(){
studentDAO = new StudentDAO(); //DAO 생성=DB
registerService = new registerService(studentDAO);
modifyService = new ModifyService(studentDAO);
deleteService = new DeleteService(studentDAO);
selectService = new SelectService(studentDAO);
allSelectService = new AllSelectService(studentDAO);
}
studentDAO를 각각의 객체에 주입함으로써 같은 DB를 공유한다. 만약 각각의 객체에서 studentDAO를 생성했다면 각각 다른 DB를 사용하는 것이다.
상기 코드를 Spring ApplicationContext화 하겠다. IoC(제어의 역전) 사용하기
//applcationContext.xml
//studentDao Bean 생성
<bean id ="studentDao" class="ems.member.dao.StudentDao"> </bean>
//의존성 주입
<bean id ="registerService" class="ems.member.service.StudentRegisterService">
<constructor-arg ref="studentDao"> </constructor-arg>
</bean>
.
.
.
7강 다양한 의존 객체 주입
스프링의 의존 객체를 주입하는 다양한 방법
java
spring
비고
7-1 생성자를 이용한 의존 객체 주입
1) 네이밍이 중요하다 첫 글자는 무조건 소문자이다.
7-2 setter를 이용한 의존 객체 주입
1) 첫 글자는 소문자 2) setter의 set을 제외시킨다. 3) 보통 db연동에서 많이 쓰인다.(초기화)
자바의 자료형 자바의 자료형은 크게 기본 타입(primitive type)과 참조 타입(reference type)으로 나누어집니다. 대표적으로 기본 타입은 char, int, float, double, boolean 등이 있고 참조 타입은 class, interface 등이 있다.
래퍼클래스 프로그래밍을 하다보면 기본 타입의 데이터를 객체로 표현해야 하는 경우가 종종 있습니다. 이럴 때 기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스들을 래퍼 클래스(wrapper class)라고 합니다. 자바는 모든 기본타입은 값을 갖는 객체로 생성할 수 있습니다. 이런 객체를 포장 객체라고 하는데 그 이유는 기본 타입의 값을 내부로 두고 포장하기 때문입니다. 래퍼 클래스로 감싸고 있는 기본 타입의 값은 외부에서 변경할수 없습니다.
기본타입(primitive type)
래퍼 클래스(wrapper class)
byte
Byte
char
Character
int
Integer
float
Float
double
Double
log
Long
public class Wrapper_Ex
public static void main(String[] args){
Integer num = new Integer(17); //박싱
int n = num.IntValue(); //언박싱
System.out.println(n);
}
}
//자동 박싱(AutoBoxing), 자동 언박싱(AutoUnBoxing)
public class Wrapper_Ex
public static void main(String[] args){
Integer num = 17;
int n = num;
}
}
//래퍼클래스 사용 예제
public class Wrapper_Ex {
public static void main(String[] args) {
String str = "10";
String str2 = "10.5";
String str3 = "true";
byte b = Byte.parseByte(str);
int i = Integer.parseInt(str);
short s = Short.parseShort(str);
long l = Long.parseLong(str);
float f = Float.parseFloat(str2);
double d = Double.parseDouble(str2);
boolean bool = Boolean.parseBoolean(str3);
System.out.println("문자열 byte값 변환 : "+b);
System.out.println("문자열 int값 변환 : "+i);
System.out.println("문자열 short값 변환 : "+s);
System.out.println("문자열 long값 변환 : "+l);
System.out.println("문자열 float값 변환 : "+f);
System.out.println("문자열 double값 변환 : "+d);
System.out.println("문자열 boolean값 변환 : "+bool);
}
}
값 비교
public class Wrapper_Ex {
public static void main(String[] args) {
Integer num = new Integer(10); //래퍼 클래스1
Integer num2 = new Integer(10); //래퍼 클래스2
int i = 10; //기본타입
System.out.println("래퍼클래스 == 기본타입 : "+(num == i)); //true
System.out.println("래퍼클래스.equals(기본타입) : "+num.equals(i)); //true
System.out.println("래퍼클래스 == 래퍼클래스 : "+(num == num2)); //false
System.out.println("래퍼클래스.equals(래퍼클래스) : "+num.equals(num2)); //true
}
}
웹 프레임워크에는 MVC 패턴이라는 것이 있고 특정 MVC 프레임워크를 이해하고 나면 다른 MVC 프레임워크를 사용하더라도 서로 다른 문법적 차이만 이해하면 된다. 그러나 배치 프레임워크는 종류가 많지 않다. 그래서 배치 프레임워크는 분야가 조금 생소할 수 있다. job(잡)이나 Step(스텝)이 무엇인지? ItemReader와 ItemWriter가 어떻게 연관돼 있는지 Tasklet이 무엇인지? 2장에서는 위의 질문에 대한 답을 할 것이다.
잡과 스텝
ex) 은행업무 Step1 : 다른 시스템에서 수신한 거래 정보 파일을 읽어와 데이터베이스에 저장한다. Step2 : 모든 입금 정보를 계좌에 반영한다. Step3 : 모든 출금정보를 계좌에 반영한다.
각 스텝은 잡을 구성하는 독립된 작업의 단위라는 것을 알 수 있다.
스탭
테스크릿(tasklet) 기반 스텝
청크(chunk) 기반 스텝
테스크릿(tasklet) 기반 스텝
스텝이 중지될 때까지 execute 메서드가 반속해서(execute 메서드를 호출할 때마다 독립적인 트랜잭션이 얻어짐) 수행 된다.
초기화
저장 프로시저 실행
알람 전송
청크(chunk) 기반 스텝
약간 스텝의 구조가 복잡하며, 아이템 기반의 처리가 사용된다.
ItemReader(필수)
ItemProcessor(선택)
ItemWriter(필수)
ItemReader와 ItemWrier만으로 구성해 스텝을 진행 할 수도 있다.(이러한 스텝은 데이터 마이그레이션 잡에 일반적으로 사용된다.)
이 에너테이션은 배치 인프라스트럭처를 위한 대부분의 스프링 빈 정의를 제공하므로 다음과 같은 컴포넌트를 직접 포함시킬 필요는 없다
컴포넌트
설명
JobRepository
실행 중인 잡의 상태를 기록하는 데 사용됨
JobLauncher
잡을 구동하는 데 사용됨
JobExplorer
JobRepository를 사용해 읽기 전용 작업을 수행하는 데 사용됨
JobRegistry
특정한 런처 구현체를 사용할 때 잡을 찾는 용도로 사용됨
PlatformTransactionManager
잡 진행 과정에서 트랜잭션을 다루는 데 사용됨
JobBuilderFactory
잡을 생성하는 빌더
StepBuilderFactory
스텝을 생성하는 빌더
@SpringBootApplication 에너테이션의 역할
@componenetScan과 @EnableAutoConfiguration을 결합한 메타 에너테이션이다. 이 에너텡션은 데이터 소스뿐만 아니라 스프링 부트 기반의 적절한 자동 구성을 만들어 준다.
public Step step()
이 잡은 단일 스텝으로 구성되므로 간단하게 스텝이름만 지정한다. 스텝은 스프링 빈으로 구성됐으며, 이 간단한 예제에서는 두가지 요인인 이름 및 테스크릿만 필요하다. System.out.println("Hello, World")을 호출한 다음에 RepeatStatus.FINISHED를 반환한다.
고객의 마음을 바꿔 주문을 취소할 때, 아직 배송하기 전이라면 훨씬 더 저렴한 비용으로 취소할 수 있다. 고객에게 몇 시간을 더 주면서 배치로 배송을 처러하면 소매업자는 많은 돈을 절약할 수 있다.(주문/거래/배송->정산)
왜 자바로 배치를 처리하는 가?
배치 처리 개발에 자바 및 오픈소를 사용해야 하는 이유 6가지
유지 보수성
유연성
확장성
개발 리소스
지원
비용
스프링 배치 프레임워크 구조
스프링 배치는 레이어(Layer) 구조로 조립된 세 개의 티어(Tier)로 이뤄져 있다.
어플리케이션 레이어 [ 코어 / 인프라스트럭처 레이어 ]
어플리케이션 레이어
가장 바깥쪽에 위치하며, 배치 처리 구축에 사용되는 '모든 사용자 코드' 및 '구성'이 포함된다. '업무 로직 서비스' 등은 물론 '잡 구조'와 관련된 구성도 포함한다.
가장 최상위에 있는 것이 아니라 코어/인프라스트럭처를 감싸고 있음에 주목하자. (그 이유는 개발자가 개발하는 대부분의 코드가 '코어 레이어'와 함께 동작하는 어플리케이션레어 레이어 이지만 때로는 커스텀 리더(Reader)나 커스텀 라이터(Writer)와 같이 인프라스트럭처의 일부를 만들기도 하기 때문이다.)
이해가 안가지만 대충 어플리케이션 레이어는 코어 레이어랑 많이 노는데 가끔 인프라스트럭처랑도 논다. 이런 느낌
무중단 처리 또는 상시 데이터 처리
스프링 프레임 워크를 사용하면 큐(queue)에서 메시지를 읽은 뒤, 청크 단위로 배치 처리를 수행하는 과정을 끝없이 반복할 수 있다. 따라서 이러한 솔루션을 처음부터 개발하는 복잡한 상황을 이해할 필요 없이(Queue가 알아서해주기 때문에) 대량 데이터 처리량을 늘릴수 있다.
Chunk(청크) 처리란? Spring Batch에서의 Chunk란 데이터를 덩어리로 작업 할 때 각 커밋 사이에 처리되는 row의 수 이다. 즉, Chunk 지향 처리란 한 번에 하나씩 데이터를 읽어 Chunk라는 덩어리르 만든 뒤, Chunk 단위로 트랜잭션을 다루는 것을 의미한다.
- Reader에서 데이터를 하나 읽어옴 - 읽어온 데이터를 Processor에서 가공 - 가공된 데이터를 별도의 공간에 모은 뒤, Chunk 단위만큼 쌓이게 되면 Writer에 전달하고 Writer는 일괄 저장 즉, Reader와 Processor에서는 1건씩 다뤄지고 Writer에서는 Chunk 단위로 처리된다.
스프링으로 잡 정의하기
잡은 중단이나 상호작용 없이 처음부터 끝까지 실행되는 처리이다.
잡은 여러 개의 스텝이 모여 이뤄질 수 있다.
스텝이 실패했을 때 반복 실행할 수도 있고 못할 수도 있다.
잡의 플로우(flow)는 조건부일 수 있다. (예를들어 수익을 계산하는 스텝이 $1,000,000 이상의 수익을 반환할 때만 보너스 계산 스텝을 실행하는 경우)
//AccountTasklet : 커스텀 컨포넌트
@Bean
public AccountTasklet accountTasklet(){
return new AccountTasklet();
}
@Bean
public Job accountJob(){
//AccountTasklet을 감싸는 스텝하나를 생성
Step accountStep =
this.stepBuilderFactory
.get("accountStep")
.task(accountTasklet());
.build();
//스텝을 감싸는 잡을 생성
return this.jobBuilderFactory
.get("accountJob")
.start("accountStep")
.build();
}
AccountTasklet
첫 번째 Bean은 AccountTasklet이다. 커스텀 컴포넌트이다. 스텝이 동작하는 동안에 비즈니스 로직을 수행한다. 스프링배치는 AccountTasklet이 완료될 때까지 단일 메서드(execute 메서드)를 반복해서 호출하는데, 이때 각각은 새 트렌잭션으로 호출된다.
두 번째 Bean은 스프링 배치 잡이다. 이 Bean 정의 내에서는 팩토리가 제공하는 빌더를 사용해, 조금 전 정의했던 AccountTasklet을 감싸는 스텝하나를 생성한다. 그런 다음에 잡 빌더를 사용해 스텝을 감싸는 잡을 생성한다. 스프링 부트(Spring Boot는 애플리케이션 기동 시에 이 잡을 찾아내 자동으로 실행시킨다.