SlideShare una empresa de Scribd logo
1 de 40
Spring Framework & MyBatis
스프링 프레임워크 & 마이바티스 강의
탑크리에듀 교육센터
1. 스프링 프레임워크 개요
2. Spring IoC & DI
2.1 Ioc Container
2.1.1 Ioc Container
2.1.2 Bean Factory, Application Context
2.1.3 Lzay-Loading, Pre-Loading
CONTENTS
1. 스프링 프레임워크 개요
2. Spring IoC & DI
2.2 Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
2.3 Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입)
2.4 DI와 관련된 어노테이션
2.4.1 Auto-Scanning Component (Stereotyping Annotations), @Component,
@Repository, @Service, @Controller, @Rest Controller
2.4.2 Context Configuration Annotations (@Scope, @Autowired, @Resource,
@Inject, @Required, @Named, @Order, @Post Construct ,@PreDestroy)
Chapter 2
Spring IoC & DI
~2-4
2. Spring IoC & DI
 마틴 파울러는 2004년의 글에서 제어의 어떤 측면이 역행되는 것인지에 대한 의문을 제기하고
의존하는 객체를 역행적으로 취득하는 것이라는 결론을 내렸다. 그는 그와 같은 정의에 기초
하여 제어 역행이라는 용어에 좀더 참신한 ‘의존성 주입(DI, dependency injection)’이라는 이름
을 지어줬다.
 모든 어플리케이션은 비즈니스 로직을 수행하기 위해 서로 협업하는 둘 또는 그 이상의 클래스
들로 이뤄진다. 전통적으로 각 객체는 협업할 객체의 참조를 취득해야 하는 책임이 있다. 이것
이 의존성이다. 이는 결합도가 높으며 테스트하기 어려운 코드를 만들어 낸다.
 IoC를 적용함으로써 객체들은 시스템 내의 각 객체를 조정하는 어떤 외부의 존재에 의해 생성
시점에서 의존성을 부여 받는데, 의존성이 객체로 주입(inject)된다는 말이다. 따라서 IoC는 한
객체가 협업해야 하는 다른 객체의 참조를 취득하는 방법에 대한 제어의 역행이라는 의미를 갖
는다.
 일반적으로 IoC는 의존성주입(DI), 의존성 룩업(DL) 두 개의 하위부류로 나눌 수 있으며 일반적
으로 DI를 이야기 할 때는 IoC를 가리키지만 IoC를 이야기 할 때는 DI를 가리키는 것은 아니다.
DI도 여러 종류(세터주입, 생성자 주입, 메소드 주입)가 있지만 DL의 경우도 의존성 풀과 컨텍
스트화 된 의존성 룩업(CDL) 두 종류가 있다.
2. Spring IoC & DI
2-1. Ioc Container
2-1-1. Ioc Container 분류
 DL(Dependency Lookup)
모든 IoC 컨테이너는 각 컨테이너에서 관리해야 하는 객체들을 관리하기 위한 별도
의 저장소를 가진다.Bean에 접근하기 위하여 컨테이너에서 제공하는 API를 이용하여
사용하고자 하는 Bean을 Lookup 하는 것으로 컨테이너 API와 의존관계를 많이 가지
면 가질수록 어플리케이션 컨테이너에 종속되는 단점이 있다.
2. Spring IoC & DI
2-1. Ioc Container
2-1-1. Ioc Container 분류
 의존성 풀(Dependency Pull)
IoC 타입 중 가장 익숙한 타입으로 필요할
때 마다 레지스트리에서 의존성을 가지고
온다. EJB의 경우 JNDI API를 통해 EJB
컴포넌트를 룩업 한다.
 컨텍스트화 된 의존성 룩업
(Contextualized Dependency Lookup)
컨테이너는 내부 WAS(톰 캣, JBOSS등)나
스프링 프레임워크에서 제공 한다.
2. Spring IoC & DI
2-1. Ioc Container
2-1-1. Ioc Container 분류
 Inject vs Lookup
어떤 IoC 방식을 사용할지는 별로 어렵지 않다. 스프링의 경우 초기 빈 Lookup을 제외하면 의존성
이 항상 Injection 형태의 IoC를 사용하게 된다. 대부분의 환경에서 DI를 사용해서 모든 객체를 연
결할 수는 없으며 초기 컴포넌트에 접근 시 DL을 사용해야 하는 경우가 많다. 예를 들어 일반 자바
APP에서는 main에서 스프링 컨테이너를 부트스트랩하고 ApplicationContext 인터페이스를 통해
의존객체를 가져와야 한다. 즉 스프링에서는 DI를 사용할 수 있으면 사용하고 그렇지 못한 경우라
면 DL을 사용하면 된다.
의존성 풀 방식의 코드는 레지스트리에 대한 참조를 가지고 있어야 하고 레지스트리와 연동해서
의존성 객체를 가지고 와야 한다. 또한 CDL을 사용시 특정 인터페이스를 구현해야 하고 모든 의존
성을 직접 가지고 와야 한다. 하지만 의존성 주입(Dependency Injection)을 사용하면 적절한 생성
자, 메소드, 세터 등을 통해 의존성을 주입 받기만 하면 된다.
2. Spring IoC & DI
2-1. Ioc Container
2-1-2. Bean Factory, Application Context 분류
 Bean Factory
• 스프링의 의존성 주입의 핵심 인터페이스
• Bean의 생성과 소멸 담당(의존성과 생명주기 및 관리 담당), 객체를 관리하는 고급 설정 기법
제공
• DI 지원 기능만 필요하다면 BeanFactory 인터페이스를 이용해 스프링 DI 컨테이너와 직접 연
동할 수 있다. 이 경우 애플리케이션은 BeanFactory 인터페이스를 구현한 클래스의 인터페이
스를 생성하고 이 인스턴스에 빈과 의존성 설정 정보를 저장해야 한다.
• BeanFactory를 프로그래밍적으로 설정할 수도 있지만 대부분 설정 파일을 통해 외부에서 설정
하는 방식을 사용한다.
• 스프링에서 기본적으로 제공하는 두 개의 메인 Bean Factory는 Bean Definition Registry를 구
현하고 있다. Properties Bean Definition Reader는 프로퍼티 파일에서 Bean정의를 읽고 Xml
Bean Definition Reader는 XML 파일에서 Bean정의를 읽는다.
2. Spring IoC & DI
 Application Context
• Bean Factory의 모든 기능 제공(Bean Factory 인터페이스를 상속)
• 권장하는 방식으로 스프링 DI 뿐 아니라 트랜잭션, AOP 서비스, 국제화를 위한 메시지 소스, 애플리케이션
이벤트 처리
• Spring Framework2.5 이상부터 Application Context 설정시 자바 어노테이션을 지원
• XML ? Annotation 방식 : XML 설정 방식을 쓰면 모든 설정을 자바코드로 부터 외부 XML에 둠
어노테이션 방식의 경우 자바코드 내에서 DI 설정을 정의 둘 동시에 사용되는 경우 XML 설정 이
우선 주로 데이터소스, 트랜잭션매니저, JMX, JMS 커넥션 팩토리등 애플리케이션
• 인프라 스트럭처에는 XML 파일에 저장하고 DI 설정은 어노테이션에서 정의.
• Context 시작 시 모든 Singleton Bean을 미리 로딩(preloading) 시킴-> 초기에 설정 및 환경에 대한 에러
발견 가능함
• 다수의 Application Context 구현 클래스 제공, 다양한 Resource 로딩 방법 제공
(XmlWebApplicationContext,FileSystemXmlApplicationContext,ClassPathXmlApplicationContext)
• Spring의 AOP기능, 메시지 자원 핸들링, 이벤트 위임, 웹 어플리케이션에서 사용하기 위한 Web Application
Context와 같은 특정 어플리케이션 컨텍스트를 이용한 통합과 같은 다른 기능을 추가 제공한다
2-1. Ioc Container
2-1-2. Bean Factory, Application Context 분류
2. Spring IoC & DI
스프링에서 자바 빈을 로딩하는 방법은 BeanFactory를 이용 하는 방법과 ApplicationContext 를 이용하는
두 가지 방법이 있다.
 Lazy-Loading설정 파일
메소드나 클래스가 요청을 받는 시점에 자바 빈의 인스턴스를 만들고 로딩하는 방법이다.
BeanFactory factory = new XmlBeanFactory( new InputStreamResource(
new FileInputStream(“ojc.xml"))); // 1
OracleJavaComm ojc = (OracleJavaComm) factory.getBean("oracleJavaBean"); // 2
1번에서 Bean Factory 컨테이너에 의해 ojc.xml 파일이 로드 되더라도 어떠한 빈도 인스턴스화 되지 않고 2번에서 oracle
Java Bean이 요청을 받는 시점에 인스턴스화 되고 로드 된다. 즉 getBean 메소드 호출 시 빈이 로드 된다.
2-1. Ioc Container
2-1-3. Lzay-Loading, Pre-Loading
2. Spring IoC & DI
 Pre-loading파일
모든 빈들이 Application Context 컨테이너에 의해 설정파일이 로드 될 때 인스턴스로 만들어지고 로드 된다.
ApplicationContext context = new ClassPathXmlApplicationContext("ojc.xml"); // 1
OracleJavaComm ojc = (OracleJavaComm) factory.getBean("oracleJavaBean"); // 2
1번에서 모든 싱글 톤 빈들이 인스턴스화 된다. 그러므로 빈이 여러 개라면 시간이 소요될 것이다. 2번에서는 미리 컨테이
너에서 만들어진 빈들이 클라이언트로 리턴 된다.
스프링 설정파일에 여러 개의 자바 빈이 정의되었다고 모두 자주 사용되는 것은 아닐 수 있다. 모두 자주 사용되지 않을 수
도 있으니 이러한 경우라면 요청이 있을 때 자바 빈을 인스턴스로 만드는 것이 좋을 것이다. 물론 모두 자주 사용되는 빈이
라면 한번에 로드 하는 것도 좋은 방법이다.
2-1. Ioc Container
2-1-3. Lzay-Loading, Pre-Loading
2. Spring IoC & DI
“오라클자바몰”이라는 회사를 만들어서 내가 잘아는 분야인 차를 팔기로 정했다.
차량의 구매는 현대자동차와 하고, 현대자동차에 돈을 지불하고 차를 받기로 했다.
STS
New  Project  Spring Legacy Project
Project Name : carmaker
Simple Projects : Simple Spring Maven
프로젝트 생성 후
- 프로젝트 루트아래의 pom.xml 파일을 오픈 후 스프링 버전을 4.2.0으로 변경
- src/main/java아래에서 edu.biz.ioc 패키지 생성
<!-- Spring -->
<spring-framework.version>4.2.0.RELEASE</spring-framework.version>
2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
2. Spring IoC & DI
2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
2. Spring IoC & DI
2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
 [Money.java]
package edu.biz.ioc;
public class Money {
private int amount;
public Money() {}
public Money(int amt) {
this.amount = amt;
}
public int getAmount() {
return this.amount;
}
public void setAmount(int amt) {
this.amount = amt;
}
}
 [Car.java]
package edu.biz.ioc;
public class Car{
private String name;
public Car(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setName(String
name) {
this.name = name;
}
}
 [HyundaiMaker.java]
package edu.biz.ioc;
public class HyundaiMaker {
public HyundaiMaker () { } //
생성자
public Car sell(Money money) {
System.out.println("I sold a
car.");
Car car = new Car(“Sonata”);
return car;
}
}
2. Spring IoC & DI
2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
 [src/main/rtesources/ioc.xml] : Project에서 마우스 우측버튼 ->new -> other -> Spring ->Spring Bean Configuration File
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
<!—아래 부분만 코딩 하세요 
<bean id="orderManager" class="edu.biz.ioc.OrderManager"/>
</beans>
2. Spring IoC & DI
2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
 [OrderManagerApp.java]
package edu.biz.ioc;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.*;
import org.springframework.core.io.*;
public class OrderManagerApp {
public static void main(String[] args) {
BeanFactory factory =
new XmlBeanFactory(new FileSystemResource(“src/main/resources/ioc.xml"));
OrderManager manager = (OrderManager)
factory.getBean("orderManager");
manager.order();
}
}
2. Spring IoC & DI
2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
위 예제에서
 Order Manager와 Hyundai Maker는 서로 떼어 놓을 방법이 없다. 이 두 클래스는
정적으로 결합(coupling)되어 있다
 하나의 버그를 고치면 그 결과 다른 새로운 버그가 생성되는 ‘두더지잡기(whack-
a-mole)’ 버그를 만든다.
 다른 한편으로 완벽하게 분리된 코드는 아무일 도 못한다.
자바에서 결합 도를 떨어뜨리는 일반적인 방법은 구현을 인터페이스 뒤로 숨기는 인
터페이스 기반 프로그래밍을 하는 것이다. 이를 통해 클라이언트 클래스에 영향을 주
지 않고도 쉽게 구현 클래스가 교체 될 수 있도록 할 수 있다.
2. Spring IoC & DI
2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
 [CarMaker.java]
package edu.biz.ioc;
public interface CarMaker {
/** 돈을 받고 차를 판다. */
public Car sell(Money
money) ;
}
 [HyundaiMaker.java를
인터페이스를 구현하도록
수정]
package edu.biz.ioc;
public class HyundaiMaker implements
CarMaker{
public HyundaiMaker() { }
public Car sell(Money money) {
System.out.println("I sold a car.");
Car car = new Car("Sonata");
return car;
}
}
 [OrderManager.java 수정]
package edu.biz.ioc;
public class OrderManager {
//만약 인터페이스를 사용하지 않는다면
HyundaiMaker 다른 메이커로 교체된다
//면 아래의 private CarMaker maker를 포함
하여 소스코드가 수정되어야 하지만
//인터페이스를 사용한다면 new
HyundaiMaker () 부분만 수정하면 된다.
private CarMaker maker; //인터페이스 타입
public OrderManager() {
//인터페이스기반이므로 추후
DaewooMaker()로 수정 용이.
this.maker = new HyundaiMaker();}
public void order() {
Car car = this.maker.sell(new Money(1000));
}
}
2. Spring IoC & DI
2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
수정된 코드에 대한 검토
 인터페이스 기반이므로 new HyundaiMaker 부분은 쉽
게 다른 메이커로 변경 가능하지만 여전히
HyundaiMaker를 new 하고 있음. 강한 의존관계
 자주 변경되는 구상클래스(Concrete class)에 의존하지
말라.
 어떤 클래스를 상속받아야 한다면 , 기반 클래스를 추
상 클래스 또는 인터페이스로 만들어서 구현하라.
 어떤 클래스의 참조를 가져야 한다면 참조 대상이 되는
클래스를 추상 클래스, 인터페이스로 정의하라.
 인터페이스를 만들어서 이 인터페이스에 의존하라.
DIP(Dependency Inversion Principle)
2. Spring IoC & DI
2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
 [DaewooMaker.java]
package edu.biz.ioc;
public class DaewooMaker
implements CarMaker {
public DaewooMaker () { }
public Car sell(Money money) {
System.out.println("I sold a car.");
Car car = new Car(“Tosca”);
return car;
}
}
 [OrderManager.java 수정]
package edu.biz.ioc;
public class OrderManager {
private CarMaker maker;
public OrderManager(String name) {
this.maker = new DaewooMaker();
}
public void order() {
Car car = this.maker.sell(new
Money(1000));
}
}
 [OrderManager.java 수정]
public class OrderManager {
private String name;
private CarMaker maker;
public OrderManager() { }
public void order() {
Car car = this.maker.sell(new Money(1000));
}
//setter 메소드를 통해 CarMaker 타입 객체를
주입 받는다.
public void setMaker(CarMaker maker) {
this.maker = maker;
}
}
실행결과를 확인하여 Daewoo Maker로 바뀐 것
을 확인하자.
인스턴스를 생성하는 방법의 문제를 해결하기
위해 스프링 프레임워크의 세터주입을 이용하자.
2. Spring IoC & DI
2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
 [ioc.xml 수정]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
<beans>
<bean id="hyundaiMaker" class=" edu.biz.ioc.HyundaiMaker"/>
<bean id=“daewooMaker" class=" edu.biz.ioc.DaewooMaker"/>
<bean id="orderManager"
class="edu.biz.ioc.OrderManager">
<!-- 세터 주입을 의미 -->
<property name="maker">
<!-- 이부분을 수정하면 소스수정 없이 maker 교체 가능 -->
<ref bean="hyundaiMaker"/>
</property>
</bean>
</beans>
Order Manager App 실행 후 결과 확인하자.
2. Spring IoC & DI
2-3. Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입)
 [Money.java]
package edu.biz.ioc4;
import org.springframework.stereotype.Component;
@Component("money") // DTO같은 컴포넌트
클래스임을 의미, @Named와 동일
public class Money {
private int amount;
public Money() {
}
public Money(int amt) {
this.amount = amt;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
}
2-2 에서 작성한 예제를 어노테이션 기반으로 변경 해보자.
 [Car.java]
package edu.biz.ioc4;
import org.springframework.stereotype.Component;
@Component("car")
public class Car {
private String name;
public Car() {
}
public Car(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2. Spring IoC & DI
2-3. Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입)
 [CarMaker.java]
package edu.biz.ioc4;
public interface CarMaker {
//돈을 받고 차를 판다
public Car sell(Money money) ;
}
2-2 에서 작성한 예제를 어노테이션 기반으로 변경 해보자.
 [HyundaiMaker.java]
package edu.biz.ioc4;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("hyundai") //@Named와 동일, 서비스계층의 클래스임을 의미
public class HyundaiMaker implements CarMaker{
@Autowired //@Inject와 동일
private Car car;
public Car sell(Money money) {
System.out.println("I sold a Sonata.");
car.setName("Sonata");
return car;
}
}
2. Spring IoC & DI
2-3. Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입)
 [DaewooMaker.java]
package edu.biz.ioc4;
import
org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service(“daewoo")
public class DaewooMaker implements CarMaker{
@Autowired
private Car car;
public Car sell(Money money) {
System.out.println("I sold
a Tosca.");
car.setName(“Tosca");
return car;
}
}
2-2 에서 작성한 예제를 어노테이션 기반으로 변경 해보자.
 [OrderManager.java]
package edu.biz.ioc4;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service("orderManager")
public class OrderManager {
private String name;
@Autowired // TYPE이 CarMaker 인것 찾아 자동 주입,
여러 개인 경우 Qualifier로 지정
@Qualifier("daewoo")
private CarMaker maker;
@Autowired // TYPE이 Money 인 것을 찾아 자동 주입
private Money money;
public OrderManager() {
}
public void order() {
money.setAmount(1000);
Car car = this.maker.sell(money);
}
}
2. Spring IoC & DI
2-3. Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입)
 [ioc4.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
<beans>
<context:annotation-config/>  생략가능!! 
<context:component-scan base-package="edu.biz.ioc4"/>
</beans>
2-2 에서 작성한 예제를 어노테이션 기반으로 변경 해보자.
2. Spring IoC & DI
2-3. Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입)
 [OrderManagerApp.java]
package edu.biz.ioc4;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class OrderManagerApp {
public static void main(String[] args) {
ApplicationContext factory = new
ClassPathXmlApplicationContext("classpath:ioc4.xml");
OrderManager manager = (OrderManager)
factory.getBean("orderManager");
manager.order();
}
}
2-2 에서 작성한 예제를 어노테이션 기반으로 변경 해보자.
실행 후 결과를 확인하자.
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
 [수정된 OrderManagerApp.java]
package edu.biz.ioc4;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Service;
@Service
public class OrderManagerApp {
//생성자가 아닌 직접 autowiring은 불가, static변수는 autowiring 안된다.
static OrderManager orderManager;
@Autowired
public OrderManagerApp(OrderManager orderManager) {
OrderManagerApp.orderManager = orderManager;
}
public static void main(String[] args) {
ApplicationContext factory =
new ClassPathXmlApplicationContext("classpath:ioc4.xml");
//OrderManager manager = (OrderManager)
factory.getBean("orderManager");
orderManager.order();
}
}
실행 후 결과를 확인하자.
2. Spring IoC & DI
: 스프링 컨테이너는 base-package의 클래스를 검색해서 자동으로 자바 빈으로 등록하는 데 이에 해당하는 것이
@Component, @Repository, @Service, @Contoroller, @RestController 어노테이션이다.
자동스캔을 위해서는 <context:component-scan base-package="onj.edu.spring" /> 과 같이 base-package를
기술하며, 패키지가 여럿인 경우 콤마로 구분하여 기술한다.
2-4. DI와 관련된 어노테이션
2-4-1. Auto-Scanning Component (Stereotyping Annotations), @Component,
@Repository, @Service, @Controller, @Rest Controller
 @Component
일반적인 용도의 컴포넌트들을 표시하는 기본 스테레오 타입, 멤버변수와 getter, setter만 가지고 있는 DTO
같은 컴포넌트를 지칭한다. 스프링이 @Component 붙은 자바 클래스를 클래스패스 경로에서 자동으로 찾아
Application Context안에 이름을 부여하고 빈으로 등록한다. 빈의 기본 Scope는 songleton이며 @Scope
어노테이션으로 변경 가능하다.
----------------------------------------------------------------------------------------------------------------------
@Component
//하나의 Bean 정의에 대해서 다수의 객체가 존재하며 생략하면 Singleton으로 생성된다.
@Scope("prototype")
public class Student {
.....
}
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
2-4-1. Auto-Scanning Component (Stereotyping Annotations), @Component,
@Repository, @Service, @Controller, @Rest Controller
 @Repository
퍼시스턴스 레이어의 DAO컴포넌트에 부여하는 어노테이션, @Compone의 역할과 유사하며 DAO 메소드가
던지는 예외(Unckecked Exception)를 스프링의 DataAccessException으로 변환한다.
----------------------------------------------------------------------------------------------------------------------
@Repository
public class EmpRepositoryImpl implements EmpRepository {
.....
}
 @Service
비즈니스 로직을 담고 있는 서비스 레이어의 서비스 컴포넌트를 가리키며 @Component 어노테이션과
동작은 같지만 서비스 계층의 클래스들은 @Service 어노테이션을 부여하는 것이 코드 가독성이 좋다.
----------------------------------------------------------------------------------------------------------------------
@Service
public class EmpServiceImpl implements EmpService {
.....
@Autowired
EmpRepository empRepository;
}
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
2-4-1. Auto-Scanning Component (Stereotyping Annotations), @Component,
@Repository, @Service, @Controller, @Rest Controller
 @Controller
프레젠테이션 레이어의 컨트롤러 컴포넌트
----------------------------------------------------------------------------------------------------------------------
@Repository
public class EmpRepositoryImpl implements EmpRepository {
.....
}
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
 @Scope
일반적으로 @Component, @Service, @Repository 등으로 자동 스캐닝 한 자바 빈은 싱글 톤 형태로 하나만
생성하는데 이를 변경하려면 @Scope 어노테이션을 사용하면 된다. 즉 빈의 범위를 설정한다.
----------------------------------------------------------------------------------------------------------------------
singleton – IoC 컨테이너당 하나의 빈을 리턴
prototype – 요구가 있을 때 마다 새로운 빈을 만들어 리턴
request - HTTP request 객체당 하나의 빈을 리턴
session - HTTP session 당 하나의 빈을 리턴
globalSession - 전체 모든 세션에 대해 하나의 빈을 리턴
@Component
@Scope("prototype") //요구시마다 하나의 새로운 빈을 리턴
class Ojc {
……
}
<bean id="ojc" class="oraclejava.edu.Ojc" scope="prototype"/>
2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource,
@Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)
빈을 주입 받는 경우 아래의 어노테이션이 사용 가능하다.
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
 @Autowired
Spring Framework에 종속적인 어노테이션 이다.
빈의 id, name로 아무거나 맞으면 적용(Type Driven Injection)
여러개의 빈이 검색될 경우 @Qualifier(name="xxx") 어노테이션으로 구분한다.
기본적으로 @Autowired된 속성은 모두 빈이 주입되어야 한다. (주입될 빈이 없는 경우가 있다면
required=false로 하면 오류는 발생하지 않는다.)
멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능
2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource,
@Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)
 @Resource
Spring2.5 이상에서 사용가능하며 Spring Framework에 비종속적으로 권장하는 방식이다.
빈의 name으로 주입될 빈을 찾는다.
멤버변수, setter 메소드에 적용가능
사용하기 위해서는 jsr250-api.jar가 클래스패스에 추가되야 한다.
[MAVEN 설정]
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
 @Inject
Spring3.0 이상에서 사용가능 하다.
특정 Framework에 종속되지 않은 어플리케이션을 구성하기 위해서는 @Inject를 사용할 것을 권장한다.
JSR.330 라이브러리인 javax.inject-x.x.x.jar 파일이 추가되어야 한다.
멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능하다.
[MAVEN 설정]
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource,
@Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource,
@Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)
 @Required
Setter 메소드 위에 기술하여 필수 프로퍼티를 설정하는 용도로 사용된다.
-----------------------------------------------------------------------------------------------------------------------
package day1;
public class Emp {
private String ename;
@Required
public void setEname(String ename) { this.ename = ename; }
public String getEname() { return this.ename; }
}
XML설정에서(Beans.xml)…
<context:annotation-config/>
<bean id="emp" class="day1.Emp">
<!-- 아래 프로퍼티를 설정하지 않으면 오류 -->
<!-- <property ename="ename" value="홍길동" /> -->
</bean>
main에서…
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
Emp emp = (Student) context.getBean("emp");
System.out.println(“Ename : " + emp.getEname() );
오류메시지  Property 'ename' is required for bean 'emp'
@Required 어노테이션이 사용되기 위해서는 RequiredAnnotationBeanPostProcessor 클래스를 빈으로 등록하거나
<context:annotation-config> 설정을 추가하면 된다.
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource,
@Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)
 @Named
JSR-330의 어노테이션이며 Spring의 @Component, @Qualifier와 동일하다.
-----------------------------------------------------------------------------------------------------------------------
@Repository @Named
public class EmpDAO { … } public class EmpDAO { … }
@Service @Named
public class EmpService { … } public class EmpService { … }
@Component @Named
public class EmpVO { … } public class EmpVO { … }
@Autowired
public void setEmp(@Qualifier(“programmer") Emp emp) { … }
 아래와 동일
@Inject
public void setEmp(@Named(“programmer") Emp emp) { … }
[MAVEN 설정]
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource,
@Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource,
@Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)
 @Order
Spring4에서 새로 소개된
@Order 어노테이션은 같
은 타입의 빈이 컬렉션(List
등)에 Autowired 될 때 그
순서를 지정한다. (* 낮은
숫자가 우선순위가 높다)
-----------------------
먼저 @Order를 사용하지
않은 예제를 작성해 보자.
(스프링 버전은 4이상으로)
[Emp.java]
package ojc;
public interface Emp {
public void work();
}
[Programmer.java]
package ojc;
import org.springframework.stereotype.Service;
@Service
public class Programmer implements Emp {
public void work() {
System.out.println("Programmer
Working...");
}
}
[Designer.java]
package ojc;
import org.springframework.stereotype.Service;
@Service
public class Designer implements Emp {
public void work() {
System.out.println("Designer
Working...");
}
}
[OrderTest.java]
@Service
public class OrderTest {
@Autowired
List<Emp> emps;
public static void main(String[] args) {
ApplicationContext context = new
ClassPathXmlApplicationContext("order.xml");
OrderTest test = (OrderTest)
context.getBean("orderTest");
for(Emp e : test.emps) {
e.work();
}
}
}
[/src/main/resources/order.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context
"
xsi:schemaLocation="http://www.springframework.org/schema/b
eans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<context:component-scan base-package="ojc"/>
</beans>
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource,
@Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)
: OrderTest를 실행하면 다음과 같이 결과가 나타난다.(Designer가 List에 먼저 주입됨)
[실행 결과]
Designer Working...
Programmer Working...
그러나 emps 리스트에 주입되는 빈에 순서가 정의되지 않는다. 이때 주입되는 순서를 주기 위해
@Order를 사용하면 된다. 물론 XML설정을 이용하여 Programmer, Designer를 빈으로 등록해 놓
고 List<Emp> emps의 setter를 이용하여 Collection 형태로 빈을 주입한다면 기술된 빈의 순서대
로 List에 들어가게 된다. 앞 예제를 수정해 보자.
[Designer.java]
@Service
@Order(value=2)
public class Designer implements Emp { … }
[Programmer.java]
@Service
@Order(value=1)
public class Programmer implements Emp
{ … }
이제는 Programmer가 우선순위가 높아 먼저 출력될 것이다.
2. Spring IoC & DI
2-4. DI와 관련된 어노테이션
2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource,
@Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)
 @PostConstruct
객체가 생성된 후 별도의 초기화 작업을 위해 실
행하는 메소드를 선언한다.
CommonAnnotationBeanPostProcessor 클래스
를 빈으로 등록시키거나 <context:annotation-
config>
태그를 사용하면 된다.
----------------------------------------------------------
 @PreDestroy
스프링 컨테이너에서 객체(빈)를 제거하기 전에
해야할 작업이 있다면 메소드위에 사용하는 어노
테이션 이다. 이 어노테이션을 사용하기 위해서
는 CommonAnnotationBeanPostProcessor 클래
스를 빈으로 등록하거나 <context:annotation-
config> 태그를 사용하면 된다.
<--------------------------------------------------------
class Hello {
String name = null;
Hello(String name) {
this.name = name;
}
@PostConstruct
public initObj() {
if (name == null) {
name = "홍길동";
}
}
}
Any Questions ?
THANK YOU
FOR YOUR ATTENTION
무료국비지원교육 / 구로자바학원 _ 탑크리에듀 교육센터
http://www.topcredu.co.kr

Más contenido relacionado

La actualidad más candente

Angular 2 rc5 조사
Angular 2 rc5 조사Angular 2 rc5 조사
Angular 2 rc5 조사Rjs Ryu
 
Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Jin wook
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료Hyosang Hong
 
Java8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJava8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJay Lee
 
Angular2를 위한 컴포넌트 분석과 개발
Angular2를 위한 컴포넌트 분석과 개발Angular2를 위한 컴포넌트 분석과 개발
Angular2를 위한 컴포넌트 분석과 개발Jin wook
 
아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring framework아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring frameworkHaeil Yi
 
(추천자마린교육)Xamarin.android에서 안드로이드 자바 라이브러리 바인딩 하는 방법_EmbeddedJar, 자바 JAR 파일을 자...
(추천자마린교육)Xamarin.android에서 안드로이드 자바 라이브러리 바인딩 하는 방법_EmbeddedJar, 자바 JAR 파일을 자...(추천자마린교육)Xamarin.android에서 안드로이드 자바 라이브러리 바인딩 하는 방법_EmbeddedJar, 자바 JAR 파일을 자...
(추천자마린교육)Xamarin.android에서 안드로이드 자바 라이브러리 바인딩 하는 방법_EmbeddedJar, 자바 JAR 파일을 자...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍NAVER D2
 
[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기YoungSu Son
 
Angular2를 위한 타입스크립트
Angular2를 위한 타입스크립트Angular2를 위한 타입스크립트
Angular2를 위한 타입스크립트Jin wook
 
01.실행환경 실습교재(공통기반)
01.실행환경 실습교재(공통기반)01.실행환경 실습교재(공통기반)
01.실행환경 실습교재(공통기반)Hankyo
 
06.실행환경 실습교재(easy company,문제)
06.실행환경 실습교재(easy company,문제)06.실행환경 실습교재(easy company,문제)
06.실행환경 실습교재(easy company,문제)Hankyo
 
세미나 Spring mybatis
세미나 Spring mybatis세미나 Spring mybatis
세미나 Spring mybatisSomang Jeong
 

La actualidad más candente (19)

8.Spring DI_3
8.Spring DI_38.Spring DI_3
8.Spring DI_3
 
1.스프링프레임워크 개요
1.스프링프레임워크 개요1.스프링프레임워크 개요
1.스프링프레임워크 개요
 
Spring boot
Spring bootSpring boot
Spring boot
 
Angular2 NgModule
Angular2   NgModuleAngular2   NgModule
Angular2 NgModule
 
Angular 2 rc5 조사
Angular 2 rc5 조사Angular 2 rc5 조사
Angular 2 rc5 조사
 
Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(자바교육/스프링교육/스프링프레임워크교육/마이바티스교육추천)#2.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
 
Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료
 
Java8 - Oracle Korea Magazine
Java8 - Oracle Korea MagazineJava8 - Oracle Korea Magazine
Java8 - Oracle Korea Magazine
 
Angular2를 위한 컴포넌트 분석과 개발
Angular2를 위한 컴포넌트 분석과 개발Angular2를 위한 컴포넌트 분석과 개발
Angular2를 위한 컴포넌트 분석과 개발
 
아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring framework아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring framework
 
(추천자마린교육)Xamarin.android에서 안드로이드 자바 라이브러리 바인딩 하는 방법_EmbeddedJar, 자바 JAR 파일을 자...
(추천자마린교육)Xamarin.android에서 안드로이드 자바 라이브러리 바인딩 하는 방법_EmbeddedJar, 자바 JAR 파일을 자...(추천자마린교육)Xamarin.android에서 안드로이드 자바 라이브러리 바인딩 하는 방법_EmbeddedJar, 자바 JAR 파일을 자...
(추천자마린교육)Xamarin.android에서 안드로이드 자바 라이브러리 바인딩 하는 방법_EmbeddedJar, 자바 JAR 파일을 자...
 
[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍[112] 실전 스위프트 프로그래밍
[112] 실전 스위프트 프로그래밍
 
[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기
 
Angular2를 위한 타입스크립트
Angular2를 위한 타입스크립트Angular2를 위한 타입스크립트
Angular2를 위한 타입스크립트
 
01.실행환경 실습교재(공통기반)
01.실행환경 실습교재(공통기반)01.실행환경 실습교재(공통기반)
01.실행환경 실습교재(공통기반)
 
06.실행환경 실습교재(easy company,문제)
06.실행환경 실습교재(easy company,문제)06.실행환경 실습교재(easy company,문제)
06.실행환경 실습교재(easy company,문제)
 
세미나 Spring mybatis
세미나 Spring mybatis세미나 Spring mybatis
세미나 Spring mybatis
 

Destacado

스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천탑크리에듀(구로디지털단지역3번출구 2분거리)
 
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#15.SQL초보에서 Schema Objects까지_국비지원IT학원/구로IT학원/실무교육학원/SQL교육/오라클교육
#15.SQL초보에서 Schema Objects까지_국비지원IT학원/구로IT학원/실무교육학원/SQL교육/오라클교육#15.SQL초보에서 Schema Objects까지_국비지원IT학원/구로IT학원/실무교육학원/SQL교육/오라클교육
#15.SQL초보에서 Schema Objects까지_국비지원IT학원/구로IT학원/실무교육학원/SQL교육/오라클교육탑크리에듀(구로디지털단지역3번출구 2분거리)
 
오라클강의/자바강의/닷넷강의/자마린교육/아두이노교육학원추천_#13.SQL초보에서 Schema Objects까지
오라클강의/자바강의/닷넷강의/자마린교육/아두이노교육학원추천_#13.SQL초보에서 Schema Objects까지오라클강의/자바강의/닷넷강의/자마린교육/아두이노교육학원추천_#13.SQL초보에서 Schema Objects까지
오라클강의/자바강의/닷넷강의/자마린교육/아두이노교육학원추천_#13.SQL초보에서 Schema Objects까지탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#12.SQL초보에서 schema Objects까지(구로IT학원/IT실무교육학원/국비지원IT교육학원/오라클교육/자바교육/닷넷교육학원추천)
#12.SQL초보에서 schema Objects까지(구로IT학원/IT실무교육학원/국비지원IT교육학원/오라클교육/자바교육/닷넷교육학원추천)#12.SQL초보에서 schema Objects까지(구로IT학원/IT실무교육학원/국비지원IT교육학원/오라클교육/자바교육/닷넷교육학원추천)
#12.SQL초보에서 schema Objects까지(구로IT학원/IT실무교육학원/국비지원IT교육학원/오라클교육/자바교육/닷넷교육학원추천)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스/ 구로오라클학원/ 구로자바학원/ 자바학원/ 오라클학원/ 구...
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스/ 구로오라클학원/ 구로자바학원/ 자바학원/ 오라클학원/ 구...Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스/ 구로오라클학원/ 구로자바학원/ 자바학원/ 오라클학원/ 구...
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스/ 구로오라클학원/ 구로자바학원/ 자바학원/ 오라클학원/ 구...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역탑크리에듀(구로디지털단지역3번출구 2분거리)
 

Destacado (13)

스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
스프링프레임워크 & 마이바티스 무.료 강의자료 제공 (Spring IoC & DI)_ 구로자바학원/구로오라클학원/구로IT학원
 
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천
#23.SQL초보에서 Schema Objects까지_SQL기초교육/오라클교육/국비지원환급교육/재직자교육/구로IT학원추천
 
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스  ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에...
 
[구로국비지원IT학원/재직자환급/오라클교육/SQL기초]#21.SQL초보에서 Schema Objects까지
[구로국비지원IT학원/재직자환급/오라클교육/SQL기초]#21.SQL초보에서 Schema Objects까지[구로국비지원IT학원/재직자환급/오라클교육/SQL기초]#21.SQL초보에서 Schema Objects까지
[구로국비지원IT학원/재직자환급/오라클교육/SQL기초]#21.SQL초보에서 Schema Objects까지
 
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지
[오라클교육/닷넷교육/자바교육/SQL기초/스프링학원/국비지원학원/자마린교육]#16.SQL초보에서 Schema Objects까지
 
#17.SQL초보에서 Schema Objects까지_오라클교육/SQL기초교육/구로IT학원/구로디짙털단지역
#17.SQL초보에서 Schema Objects까지_오라클교육/SQL기초교육/구로IT학원/구로디짙털단지역#17.SQL초보에서 Schema Objects까지_오라클교육/SQL기초교육/구로IT학원/구로디짙털단지역
#17.SQL초보에서 Schema Objects까지_오라클교육/SQL기초교육/구로IT학원/구로디짙털단지역
 
(JPA 엔티티 매니저)JPA 기초강좌, 엔티티 매니저. 엔티티 매니저팩토리
(JPA 엔티티 매니저)JPA 기초강좌, 엔티티 매니저. 엔티티 매니저팩토리(JPA 엔티티 매니저)JPA 기초강좌, 엔티티 매니저. 엔티티 매니저팩토리
(JPA 엔티티 매니저)JPA 기초강좌, 엔티티 매니저. 엔티티 매니저팩토리
 
#15.SQL초보에서 Schema Objects까지_국비지원IT학원/구로IT학원/실무교육학원/SQL교육/오라클교육
#15.SQL초보에서 Schema Objects까지_국비지원IT학원/구로IT학원/실무교육학원/SQL교육/오라클교육#15.SQL초보에서 Schema Objects까지_국비지원IT학원/구로IT학원/실무교육학원/SQL교육/오라클교육
#15.SQL초보에서 Schema Objects까지_국비지원IT학원/구로IT학원/실무교육학원/SQL교육/오라클교육
 
오라클강의/자바강의/닷넷강의/자마린교육/아두이노교육학원추천_#13.SQL초보에서 Schema Objects까지
오라클강의/자바강의/닷넷강의/자마린교육/아두이노교육학원추천_#13.SQL초보에서 Schema Objects까지오라클강의/자바강의/닷넷강의/자마린교육/아두이노교육학원추천_#13.SQL초보에서 Schema Objects까지
오라클강의/자바강의/닷넷강의/자마린교육/아두이노교육학원추천_#13.SQL초보에서 Schema Objects까지
 
#12.SQL초보에서 schema Objects까지(구로IT학원/IT실무교육학원/국비지원IT교육학원/오라클교육/자바교육/닷넷교육학원추천)
#12.SQL초보에서 schema Objects까지(구로IT학원/IT실무교육학원/국비지원IT교육학원/오라클교육/자바교육/닷넷교육학원추천)#12.SQL초보에서 schema Objects까지(구로IT학원/IT실무교육학원/국비지원IT교육학원/오라클교육/자바교육/닷넷교육학원추천)
#12.SQL초보에서 schema Objects까지(구로IT학원/IT실무교육학원/국비지원IT교육학원/오라클교육/자바교육/닷넷교육학원추천)
 
IT실무교육학원/자바학원/오라클학원/SQL기초학원추천_#11.SQL초보에서 Schema Objects까지
IT실무교육학원/자바학원/오라클학원/SQL기초학원추천_#11.SQL초보에서 Schema Objects까지IT실무교육학원/자바학원/오라클학원/SQL기초학원추천_#11.SQL초보에서 Schema Objects까지
IT실무교육학원/자바학원/오라클학원/SQL기초학원추천_#11.SQL초보에서 Schema Objects까지
 
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스/ 구로오라클학원/ 구로자바학원/ 자바학원/ 오라클학원/ 구...
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스/ 구로오라클학원/ 구로자바학원/ 자바학원/ 오라클학원/ 구...Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스/ 구로오라클학원/ 구로자바학원/ 자바학원/ 오라클학원/ 구...
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스/ 구로오라클학원/ 구로자바학원/ 자바학원/ 오라클학원/ 구...
 
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역
Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 /구로오라클학원/ 구로자바학원/ 구로디지털단지역
 

Similar a NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에듀, IT학원, 국비지원교육, 재직자환급교육

Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료Hyosang Hong
 
우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈용근 권
 
코틀린 멀티플랫폼, 미지와의 조우
코틀린 멀티플랫폼, 미지와의 조우코틀린 멀티플랫폼, 미지와의 조우
코틀린 멀티플랫폼, 미지와의 조우Arawn Park
 
스프링 스터디 1장
스프링 스터디 1장스프링 스터디 1장
스프링 스터디 1장Seongchan Kang
 
Unity Auto Build iOS
Unity Auto Build iOSUnity Auto Build iOS
Unity Auto Build iOSGiseok Lee
 
Data-binding AngularJS
Data-binding AngularJSData-binding AngularJS
Data-binding AngularJSEunYoung Kim
 
[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DIAnselmKim
 
Tomcat monitoring using_javamelody
Tomcat monitoring using_javamelodyTomcat monitoring using_javamelody
Tomcat monitoring using_javamelody중선 곽
 
Spring vs. spring boot
Spring vs. spring bootSpring vs. spring boot
Spring vs. spring bootChloeChoi23
 
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for AppspressoKTH, 케이티하이텔
 
Internship backend
Internship backendInternship backend
Internship backendYein Sim
 
Kotlin 2.0을 통해 알아보는 코틀린의 미래
Kotlin 2.0을 통해 알아보는 코틀린의 미래Kotlin 2.0을 통해 알아보는 코틀린의 미래
Kotlin 2.0을 통해 알아보는 코틀린의 미래Leonardo YongUk Kim
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게Sungju Jin
 
Spring IoC
Spring IoCSpring IoC
Spring IoCSuan Lee
 
[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core Ji-Woong Choi
 
Spring@mvc웹호스팅
Spring@mvc웹호스팅Spring@mvc웹호스팅
Spring@mvc웹호스팅J.H Ahn
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodedpTablo
 

Similar a NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에듀, IT학원, 국비지원교육, 재직자환급교육 (20)

Spring 교육 자료
Spring 교육 자료Spring 교육 자료
Spring 교육 자료
 
우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈우아한테크세미나-우아한멀티모듈
우아한테크세미나-우아한멀티모듈
 
코틀린 멀티플랫폼, 미지와의 조우
코틀린 멀티플랫폼, 미지와의 조우코틀린 멀티플랫폼, 미지와의 조우
코틀린 멀티플랫폼, 미지와의 조우
 
J2 Ee
J2 EeJ2 Ee
J2 Ee
 
스프링 스터디 1장
스프링 스터디 1장스프링 스터디 1장
스프링 스터디 1장
 
Unity Auto Build iOS
Unity Auto Build iOSUnity Auto Build iOS
Unity Auto Build iOS
 
Data-binding AngularJS
Data-binding AngularJSData-binding AngularJS
Data-binding AngularJS
 
Springmvc
SpringmvcSpringmvc
Springmvc
 
[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI
 
Tomcat monitoring using_javamelody
Tomcat monitoring using_javamelodyTomcat monitoring using_javamelody
Tomcat monitoring using_javamelody
 
Spring vs. spring boot
Spring vs. spring bootSpring vs. spring boot
Spring vs. spring boot
 
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso[H3 2012] Bridge over troubled water : make plug-in for Appspresso
[H3 2012] Bridge over troubled water : make plug-in for Appspresso
 
Internship backend
Internship backendInternship backend
Internship backend
 
2015 oce specification
2015 oce specification2015 oce specification
2015 oce specification
 
Kotlin 2.0을 통해 알아보는 코틀린의 미래
Kotlin 2.0을 통해 알아보는 코틀린의 미래Kotlin 2.0을 통해 알아보는 코틀린의 미래
Kotlin 2.0을 통해 알아보는 코틀린의 미래
 
반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게반복적인 작업이 싫은 안드로이드 개발자에게
반복적인 작업이 싫은 안드로이드 개발자에게
 
Spring IoC
Spring IoCSpring IoC
Spring IoC
 
[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core
 
Spring@mvc웹호스팅
Spring@mvc웹호스팅Spring@mvc웹호스팅
Spring@mvc웹호스팅
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCode
 

Más de 탑크리에듀(구로디지털단지역3번출구 2분거리)

[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]탑크리에듀(구로디지털단지역3번출구 2분거리)
 
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]탑크리에듀(구로디지털단지역3번출구 2분거리)
 

Más de 탑크리에듀(구로디지털단지역3번출구 2분거리) (20)

자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
자마린.안드로이드 기본 내장레이아웃(Built-In List Item Layouts)
 
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
 
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
자마린 iOS 멀티화면 컨트롤러_네비게이션 컨트롤러, 루트 뷰 컨트롤러
 
[IT교육/IT학원]Develope를 위한 IT실무교육
[IT교육/IT학원]Develope를 위한 IT실무교육[IT교육/IT학원]Develope를 위한 IT실무교육
[IT교육/IT학원]Develope를 위한 IT실무교육
 
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
[아이오닉학원]아이오닉 하이브리드 앱 개발 과정(아이오닉2로 동적 모바일 앱 만들기)
 
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
[뷰제이에스학원]뷰제이에스(Vue.js) 프로그래밍 입문(프로그레시브 자바스크립트 프레임워크)
 
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
[씨샵학원/씨샵교육]C#, 윈폼, 네트워크, ado.net 실무프로젝트 과정
 
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
[정보처리기사자격증학원]정보처리기사 취득 양성과정(국비무료 자격증과정)
 
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
[wpf학원,wpf교육]닷넷, c#기반 wpf 프로그래밍 인터페이스구현 재직자 향상과정
 
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
(WPF교육)ListBox와 Linq 쿼리를 이용한 간단한 데이터바인딩, 새창 띄우기, 이벤트 및 델리게이트를 통한 메인윈도우의 ListB...
 
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
[자마린교육/자마린실습]자바,스프링프레임워크(스프링부트) RESTful 웹서비스 구현 실습,자마린에서 스프링 웹서비스를 호출하고 응답 JS...
 
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios 3.3.5 추가적인 사항
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios  3.3.5 추가적인 사항[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios  3.3.5 추가적인 사항
[구로자마린학원/자마린강좌/자마린교육]3. xamarin.ios 3.3.5 추가적인 사항
 
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
3. xamarin.i os 3.3 xamarin.ios helloworld 자세히 살펴보기 3.4.4 view controllers an...
 
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
5. 서브 쿼리(sub query) 5.1 서브 쿼리(sub query) 개요 5.2 단일행 서브쿼리(single row sub query)
 
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld(단일 뷰) 실습[...
 
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
(닷넷,자마린,아이폰실습)Xamarin.iOS HelloWorld 실습_멀티화면,화면전환_Xamarin교육/Xamarin강좌
 
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
C#기초에서 윈도우, 스마트폰 앱개발 과정(c#.net, ado.net, win form, wpf, 자마린)_자마린학원_씨샵교육_WPF학원...
 
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
자바, 웹 기초와 스프링 프레임워크 & 마이바티스 재직자 향상과정(자바학원/자바교육/자바기업출강]
 
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
3. xamarin.i os 3.1 xamarin.ios 설치, 개발환경 3.2 xamarin.ios helloworld_자마린학원_자마린...
 
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
3. 안드로이드 애플리케이션 구성요소 3.2인텐트 part01(안드로이드학원/안드로이드교육/안드로이드강좌/안드로이드기업출강]
 

NCS기반 Spring Framework & MyBatis_ 스프링프레임워크 & 마이바티스 ☆무료강의자료 제공/ 구로오라클학원, 탑크리에듀, IT학원, 국비지원교육, 재직자환급교육

  • 1. Spring Framework & MyBatis 스프링 프레임워크 & 마이바티스 강의 탑크리에듀 교육센터
  • 2. 1. 스프링 프레임워크 개요 2. Spring IoC & DI 2.1 Ioc Container 2.1.1 Ioc Container 2.1.2 Bean Factory, Application Context 2.1.3 Lzay-Loading, Pre-Loading CONTENTS 1. 스프링 프레임워크 개요 2. Spring IoC & DI 2.2 Spring Ioc 실습(XML 기반, 인터페이스, 세터주입) 2.3 Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입) 2.4 DI와 관련된 어노테이션 2.4.1 Auto-Scanning Component (Stereotyping Annotations), @Component, @Repository, @Service, @Controller, @Rest Controller 2.4.2 Context Configuration Annotations (@Scope, @Autowired, @Resource, @Inject, @Required, @Named, @Order, @Post Construct ,@PreDestroy)
  • 4. 2. Spring IoC & DI  마틴 파울러는 2004년의 글에서 제어의 어떤 측면이 역행되는 것인지에 대한 의문을 제기하고 의존하는 객체를 역행적으로 취득하는 것이라는 결론을 내렸다. 그는 그와 같은 정의에 기초 하여 제어 역행이라는 용어에 좀더 참신한 ‘의존성 주입(DI, dependency injection)’이라는 이름 을 지어줬다.  모든 어플리케이션은 비즈니스 로직을 수행하기 위해 서로 협업하는 둘 또는 그 이상의 클래스 들로 이뤄진다. 전통적으로 각 객체는 협업할 객체의 참조를 취득해야 하는 책임이 있다. 이것 이 의존성이다. 이는 결합도가 높으며 테스트하기 어려운 코드를 만들어 낸다.  IoC를 적용함으로써 객체들은 시스템 내의 각 객체를 조정하는 어떤 외부의 존재에 의해 생성 시점에서 의존성을 부여 받는데, 의존성이 객체로 주입(inject)된다는 말이다. 따라서 IoC는 한 객체가 협업해야 하는 다른 객체의 참조를 취득하는 방법에 대한 제어의 역행이라는 의미를 갖 는다.  일반적으로 IoC는 의존성주입(DI), 의존성 룩업(DL) 두 개의 하위부류로 나눌 수 있으며 일반적 으로 DI를 이야기 할 때는 IoC를 가리키지만 IoC를 이야기 할 때는 DI를 가리키는 것은 아니다. DI도 여러 종류(세터주입, 생성자 주입, 메소드 주입)가 있지만 DL의 경우도 의존성 풀과 컨텍 스트화 된 의존성 룩업(CDL) 두 종류가 있다.
  • 5. 2. Spring IoC & DI 2-1. Ioc Container 2-1-1. Ioc Container 분류  DL(Dependency Lookup) 모든 IoC 컨테이너는 각 컨테이너에서 관리해야 하는 객체들을 관리하기 위한 별도 의 저장소를 가진다.Bean에 접근하기 위하여 컨테이너에서 제공하는 API를 이용하여 사용하고자 하는 Bean을 Lookup 하는 것으로 컨테이너 API와 의존관계를 많이 가지 면 가질수록 어플리케이션 컨테이너에 종속되는 단점이 있다.
  • 6. 2. Spring IoC & DI 2-1. Ioc Container 2-1-1. Ioc Container 분류  의존성 풀(Dependency Pull) IoC 타입 중 가장 익숙한 타입으로 필요할 때 마다 레지스트리에서 의존성을 가지고 온다. EJB의 경우 JNDI API를 통해 EJB 컴포넌트를 룩업 한다.  컨텍스트화 된 의존성 룩업 (Contextualized Dependency Lookup) 컨테이너는 내부 WAS(톰 캣, JBOSS등)나 스프링 프레임워크에서 제공 한다.
  • 7. 2. Spring IoC & DI 2-1. Ioc Container 2-1-1. Ioc Container 분류  Inject vs Lookup 어떤 IoC 방식을 사용할지는 별로 어렵지 않다. 스프링의 경우 초기 빈 Lookup을 제외하면 의존성 이 항상 Injection 형태의 IoC를 사용하게 된다. 대부분의 환경에서 DI를 사용해서 모든 객체를 연 결할 수는 없으며 초기 컴포넌트에 접근 시 DL을 사용해야 하는 경우가 많다. 예를 들어 일반 자바 APP에서는 main에서 스프링 컨테이너를 부트스트랩하고 ApplicationContext 인터페이스를 통해 의존객체를 가져와야 한다. 즉 스프링에서는 DI를 사용할 수 있으면 사용하고 그렇지 못한 경우라 면 DL을 사용하면 된다. 의존성 풀 방식의 코드는 레지스트리에 대한 참조를 가지고 있어야 하고 레지스트리와 연동해서 의존성 객체를 가지고 와야 한다. 또한 CDL을 사용시 특정 인터페이스를 구현해야 하고 모든 의존 성을 직접 가지고 와야 한다. 하지만 의존성 주입(Dependency Injection)을 사용하면 적절한 생성 자, 메소드, 세터 등을 통해 의존성을 주입 받기만 하면 된다.
  • 8. 2. Spring IoC & DI 2-1. Ioc Container 2-1-2. Bean Factory, Application Context 분류  Bean Factory • 스프링의 의존성 주입의 핵심 인터페이스 • Bean의 생성과 소멸 담당(의존성과 생명주기 및 관리 담당), 객체를 관리하는 고급 설정 기법 제공 • DI 지원 기능만 필요하다면 BeanFactory 인터페이스를 이용해 스프링 DI 컨테이너와 직접 연 동할 수 있다. 이 경우 애플리케이션은 BeanFactory 인터페이스를 구현한 클래스의 인터페이 스를 생성하고 이 인스턴스에 빈과 의존성 설정 정보를 저장해야 한다. • BeanFactory를 프로그래밍적으로 설정할 수도 있지만 대부분 설정 파일을 통해 외부에서 설정 하는 방식을 사용한다. • 스프링에서 기본적으로 제공하는 두 개의 메인 Bean Factory는 Bean Definition Registry를 구 현하고 있다. Properties Bean Definition Reader는 프로퍼티 파일에서 Bean정의를 읽고 Xml Bean Definition Reader는 XML 파일에서 Bean정의를 읽는다.
  • 9. 2. Spring IoC & DI  Application Context • Bean Factory의 모든 기능 제공(Bean Factory 인터페이스를 상속) • 권장하는 방식으로 스프링 DI 뿐 아니라 트랜잭션, AOP 서비스, 국제화를 위한 메시지 소스, 애플리케이션 이벤트 처리 • Spring Framework2.5 이상부터 Application Context 설정시 자바 어노테이션을 지원 • XML ? Annotation 방식 : XML 설정 방식을 쓰면 모든 설정을 자바코드로 부터 외부 XML에 둠 어노테이션 방식의 경우 자바코드 내에서 DI 설정을 정의 둘 동시에 사용되는 경우 XML 설정 이 우선 주로 데이터소스, 트랜잭션매니저, JMX, JMS 커넥션 팩토리등 애플리케이션 • 인프라 스트럭처에는 XML 파일에 저장하고 DI 설정은 어노테이션에서 정의. • Context 시작 시 모든 Singleton Bean을 미리 로딩(preloading) 시킴-> 초기에 설정 및 환경에 대한 에러 발견 가능함 • 다수의 Application Context 구현 클래스 제공, 다양한 Resource 로딩 방법 제공 (XmlWebApplicationContext,FileSystemXmlApplicationContext,ClassPathXmlApplicationContext) • Spring의 AOP기능, 메시지 자원 핸들링, 이벤트 위임, 웹 어플리케이션에서 사용하기 위한 Web Application Context와 같은 특정 어플리케이션 컨텍스트를 이용한 통합과 같은 다른 기능을 추가 제공한다 2-1. Ioc Container 2-1-2. Bean Factory, Application Context 분류
  • 10. 2. Spring IoC & DI 스프링에서 자바 빈을 로딩하는 방법은 BeanFactory를 이용 하는 방법과 ApplicationContext 를 이용하는 두 가지 방법이 있다.  Lazy-Loading설정 파일 메소드나 클래스가 요청을 받는 시점에 자바 빈의 인스턴스를 만들고 로딩하는 방법이다. BeanFactory factory = new XmlBeanFactory( new InputStreamResource( new FileInputStream(“ojc.xml"))); // 1 OracleJavaComm ojc = (OracleJavaComm) factory.getBean("oracleJavaBean"); // 2 1번에서 Bean Factory 컨테이너에 의해 ojc.xml 파일이 로드 되더라도 어떠한 빈도 인스턴스화 되지 않고 2번에서 oracle Java Bean이 요청을 받는 시점에 인스턴스화 되고 로드 된다. 즉 getBean 메소드 호출 시 빈이 로드 된다. 2-1. Ioc Container 2-1-3. Lzay-Loading, Pre-Loading
  • 11. 2. Spring IoC & DI  Pre-loading파일 모든 빈들이 Application Context 컨테이너에 의해 설정파일이 로드 될 때 인스턴스로 만들어지고 로드 된다. ApplicationContext context = new ClassPathXmlApplicationContext("ojc.xml"); // 1 OracleJavaComm ojc = (OracleJavaComm) factory.getBean("oracleJavaBean"); // 2 1번에서 모든 싱글 톤 빈들이 인스턴스화 된다. 그러므로 빈이 여러 개라면 시간이 소요될 것이다. 2번에서는 미리 컨테이 너에서 만들어진 빈들이 클라이언트로 리턴 된다. 스프링 설정파일에 여러 개의 자바 빈이 정의되었다고 모두 자주 사용되는 것은 아닐 수 있다. 모두 자주 사용되지 않을 수 도 있으니 이러한 경우라면 요청이 있을 때 자바 빈을 인스턴스로 만드는 것이 좋을 것이다. 물론 모두 자주 사용되는 빈이 라면 한번에 로드 하는 것도 좋은 방법이다. 2-1. Ioc Container 2-1-3. Lzay-Loading, Pre-Loading
  • 12. 2. Spring IoC & DI “오라클자바몰”이라는 회사를 만들어서 내가 잘아는 분야인 차를 팔기로 정했다. 차량의 구매는 현대자동차와 하고, 현대자동차에 돈을 지불하고 차를 받기로 했다. STS New  Project  Spring Legacy Project Project Name : carmaker Simple Projects : Simple Spring Maven 프로젝트 생성 후 - 프로젝트 루트아래의 pom.xml 파일을 오픈 후 스프링 버전을 4.2.0으로 변경 - src/main/java아래에서 edu.biz.ioc 패키지 생성 <!-- Spring --> <spring-framework.version>4.2.0.RELEASE</spring-framework.version> 2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
  • 13. 2. Spring IoC & DI 2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
  • 14. 2. Spring IoC & DI 2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)  [Money.java] package edu.biz.ioc; public class Money { private int amount; public Money() {} public Money(int amt) { this.amount = amt; } public int getAmount() { return this.amount; } public void setAmount(int amt) { this.amount = amt; } }  [Car.java] package edu.biz.ioc; public class Car{ private String name; public Car(String name) { this.name = name; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } }  [HyundaiMaker.java] package edu.biz.ioc; public class HyundaiMaker { public HyundaiMaker () { } // 생성자 public Car sell(Money money) { System.out.println("I sold a car."); Car car = new Car(“Sonata”); return car; } }
  • 15. 2. Spring IoC & DI 2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)  [src/main/rtesources/ioc.xml] : Project에서 마우스 우측버튼 ->new -> other -> Spring ->Spring Bean Configuration File <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"> <!—아래 부분만 코딩 하세요  <bean id="orderManager" class="edu.biz.ioc.OrderManager"/> </beans>
  • 16. 2. Spring IoC & DI 2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)  [OrderManagerApp.java] package edu.biz.ioc; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.*; import org.springframework.core.io.*; public class OrderManagerApp { public static void main(String[] args) { BeanFactory factory = new XmlBeanFactory(new FileSystemResource(“src/main/resources/ioc.xml")); OrderManager manager = (OrderManager) factory.getBean("orderManager"); manager.order(); } }
  • 17. 2. Spring IoC & DI 2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입) 위 예제에서  Order Manager와 Hyundai Maker는 서로 떼어 놓을 방법이 없다. 이 두 클래스는 정적으로 결합(coupling)되어 있다  하나의 버그를 고치면 그 결과 다른 새로운 버그가 생성되는 ‘두더지잡기(whack- a-mole)’ 버그를 만든다.  다른 한편으로 완벽하게 분리된 코드는 아무일 도 못한다. 자바에서 결합 도를 떨어뜨리는 일반적인 방법은 구현을 인터페이스 뒤로 숨기는 인 터페이스 기반 프로그래밍을 하는 것이다. 이를 통해 클라이언트 클래스에 영향을 주 지 않고도 쉽게 구현 클래스가 교체 될 수 있도록 할 수 있다.
  • 18. 2. Spring IoC & DI 2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)  [CarMaker.java] package edu.biz.ioc; public interface CarMaker { /** 돈을 받고 차를 판다. */ public Car sell(Money money) ; }  [HyundaiMaker.java를 인터페이스를 구현하도록 수정] package edu.biz.ioc; public class HyundaiMaker implements CarMaker{ public HyundaiMaker() { } public Car sell(Money money) { System.out.println("I sold a car."); Car car = new Car("Sonata"); return car; } }  [OrderManager.java 수정] package edu.biz.ioc; public class OrderManager { //만약 인터페이스를 사용하지 않는다면 HyundaiMaker 다른 메이커로 교체된다 //면 아래의 private CarMaker maker를 포함 하여 소스코드가 수정되어야 하지만 //인터페이스를 사용한다면 new HyundaiMaker () 부분만 수정하면 된다. private CarMaker maker; //인터페이스 타입 public OrderManager() { //인터페이스기반이므로 추후 DaewooMaker()로 수정 용이. this.maker = new HyundaiMaker();} public void order() { Car car = this.maker.sell(new Money(1000)); } }
  • 19. 2. Spring IoC & DI 2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입) 수정된 코드에 대한 검토  인터페이스 기반이므로 new HyundaiMaker 부분은 쉽 게 다른 메이커로 변경 가능하지만 여전히 HyundaiMaker를 new 하고 있음. 강한 의존관계  자주 변경되는 구상클래스(Concrete class)에 의존하지 말라.  어떤 클래스를 상속받아야 한다면 , 기반 클래스를 추 상 클래스 또는 인터페이스로 만들어서 구현하라.  어떤 클래스의 참조를 가져야 한다면 참조 대상이 되는 클래스를 추상 클래스, 인터페이스로 정의하라.  인터페이스를 만들어서 이 인터페이스에 의존하라. DIP(Dependency Inversion Principle)
  • 20. 2. Spring IoC & DI 2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)  [DaewooMaker.java] package edu.biz.ioc; public class DaewooMaker implements CarMaker { public DaewooMaker () { } public Car sell(Money money) { System.out.println("I sold a car."); Car car = new Car(“Tosca”); return car; } }  [OrderManager.java 수정] package edu.biz.ioc; public class OrderManager { private CarMaker maker; public OrderManager(String name) { this.maker = new DaewooMaker(); } public void order() { Car car = this.maker.sell(new Money(1000)); } }  [OrderManager.java 수정] public class OrderManager { private String name; private CarMaker maker; public OrderManager() { } public void order() { Car car = this.maker.sell(new Money(1000)); } //setter 메소드를 통해 CarMaker 타입 객체를 주입 받는다. public void setMaker(CarMaker maker) { this.maker = maker; } } 실행결과를 확인하여 Daewoo Maker로 바뀐 것 을 확인하자. 인스턴스를 생성하는 방법의 문제를 해결하기 위해 스프링 프레임워크의 세터주입을 이용하자.
  • 21. 2. Spring IoC & DI 2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)  [ioc.xml 수정] <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"> <beans> <bean id="hyundaiMaker" class=" edu.biz.ioc.HyundaiMaker"/> <bean id=“daewooMaker" class=" edu.biz.ioc.DaewooMaker"/> <bean id="orderManager" class="edu.biz.ioc.OrderManager"> <!-- 세터 주입을 의미 --> <property name="maker"> <!-- 이부분을 수정하면 소스수정 없이 maker 교체 가능 --> <ref bean="hyundaiMaker"/> </property> </bean> </beans> Order Manager App 실행 후 결과 확인하자.
  • 22. 2. Spring IoC & DI 2-3. Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입)  [Money.java] package edu.biz.ioc4; import org.springframework.stereotype.Component; @Component("money") // DTO같은 컴포넌트 클래스임을 의미, @Named와 동일 public class Money { private int amount; public Money() { } public Money(int amt) { this.amount = amt; } public int getAmount() { return amount; } public void setAmount(int amount) { this.amount = amount; } } 2-2 에서 작성한 예제를 어노테이션 기반으로 변경 해보자.  [Car.java] package edu.biz.ioc4; import org.springframework.stereotype.Component; @Component("car") public class Car { private String name; public Car() { } public Car(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
  • 23. 2. Spring IoC & DI 2-3. Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입)  [CarMaker.java] package edu.biz.ioc4; public interface CarMaker { //돈을 받고 차를 판다 public Car sell(Money money) ; } 2-2 에서 작성한 예제를 어노테이션 기반으로 변경 해보자.  [HyundaiMaker.java] package edu.biz.ioc4; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service("hyundai") //@Named와 동일, 서비스계층의 클래스임을 의미 public class HyundaiMaker implements CarMaker{ @Autowired //@Inject와 동일 private Car car; public Car sell(Money money) { System.out.println("I sold a Sonata."); car.setName("Sonata"); return car; } }
  • 24. 2. Spring IoC & DI 2-3. Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입)  [DaewooMaker.java] package edu.biz.ioc4; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service(“daewoo") public class DaewooMaker implements CarMaker{ @Autowired private Car car; public Car sell(Money money) { System.out.println("I sold a Tosca."); car.setName(“Tosca"); return car; } } 2-2 에서 작성한 예제를 어노테이션 기반으로 변경 해보자.  [OrderManager.java] package edu.biz.ioc4; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @Service("orderManager") public class OrderManager { private String name; @Autowired // TYPE이 CarMaker 인것 찾아 자동 주입, 여러 개인 경우 Qualifier로 지정 @Qualifier("daewoo") private CarMaker maker; @Autowired // TYPE이 Money 인 것을 찾아 자동 주입 private Money money; public OrderManager() { } public void order() { money.setAmount(1000); Car car = this.maker.sell(money); } }
  • 25. 2. Spring IoC & DI 2-3. Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입)  [ioc4.xml] <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"> <beans> <context:annotation-config/>  생략가능!!  <context:component-scan base-package="edu.biz.ioc4"/> </beans> 2-2 에서 작성한 예제를 어노테이션 기반으로 변경 해보자.
  • 26. 2. Spring IoC & DI 2-3. Spring Ioc 실습(어노테이션기반, 인터페이스, 세터주입)  [OrderManagerApp.java] package edu.biz.ioc4; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class OrderManagerApp { public static void main(String[] args) { ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:ioc4.xml"); OrderManager manager = (OrderManager) factory.getBean("orderManager"); manager.order(); } } 2-2 에서 작성한 예제를 어노테이션 기반으로 변경 해보자. 실행 후 결과를 확인하자.
  • 27. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션  [수정된 OrderManagerApp.java] package edu.biz.ioc4; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.stereotype.Service; @Service public class OrderManagerApp { //생성자가 아닌 직접 autowiring은 불가, static변수는 autowiring 안된다. static OrderManager orderManager; @Autowired public OrderManagerApp(OrderManager orderManager) { OrderManagerApp.orderManager = orderManager; } public static void main(String[] args) { ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:ioc4.xml"); //OrderManager manager = (OrderManager) factory.getBean("orderManager"); orderManager.order(); } } 실행 후 결과를 확인하자.
  • 28. 2. Spring IoC & DI : 스프링 컨테이너는 base-package의 클래스를 검색해서 자동으로 자바 빈으로 등록하는 데 이에 해당하는 것이 @Component, @Repository, @Service, @Contoroller, @RestController 어노테이션이다. 자동스캔을 위해서는 <context:component-scan base-package="onj.edu.spring" /> 과 같이 base-package를 기술하며, 패키지가 여럿인 경우 콤마로 구분하여 기술한다. 2-4. DI와 관련된 어노테이션 2-4-1. Auto-Scanning Component (Stereotyping Annotations), @Component, @Repository, @Service, @Controller, @Rest Controller  @Component 일반적인 용도의 컴포넌트들을 표시하는 기본 스테레오 타입, 멤버변수와 getter, setter만 가지고 있는 DTO 같은 컴포넌트를 지칭한다. 스프링이 @Component 붙은 자바 클래스를 클래스패스 경로에서 자동으로 찾아 Application Context안에 이름을 부여하고 빈으로 등록한다. 빈의 기본 Scope는 songleton이며 @Scope 어노테이션으로 변경 가능하다. ---------------------------------------------------------------------------------------------------------------------- @Component //하나의 Bean 정의에 대해서 다수의 객체가 존재하며 생략하면 Singleton으로 생성된다. @Scope("prototype") public class Student { ..... }
  • 29. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션 2-4-1. Auto-Scanning Component (Stereotyping Annotations), @Component, @Repository, @Service, @Controller, @Rest Controller  @Repository 퍼시스턴스 레이어의 DAO컴포넌트에 부여하는 어노테이션, @Compone의 역할과 유사하며 DAO 메소드가 던지는 예외(Unckecked Exception)를 스프링의 DataAccessException으로 변환한다. ---------------------------------------------------------------------------------------------------------------------- @Repository public class EmpRepositoryImpl implements EmpRepository { ..... }  @Service 비즈니스 로직을 담고 있는 서비스 레이어의 서비스 컴포넌트를 가리키며 @Component 어노테이션과 동작은 같지만 서비스 계층의 클래스들은 @Service 어노테이션을 부여하는 것이 코드 가독성이 좋다. ---------------------------------------------------------------------------------------------------------------------- @Service public class EmpServiceImpl implements EmpService { ..... @Autowired EmpRepository empRepository; }
  • 30. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션 2-4-1. Auto-Scanning Component (Stereotyping Annotations), @Component, @Repository, @Service, @Controller, @Rest Controller  @Controller 프레젠테이션 레이어의 컨트롤러 컴포넌트 ---------------------------------------------------------------------------------------------------------------------- @Repository public class EmpRepositoryImpl implements EmpRepository { ..... }
  • 31. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션  @Scope 일반적으로 @Component, @Service, @Repository 등으로 자동 스캐닝 한 자바 빈은 싱글 톤 형태로 하나만 생성하는데 이를 변경하려면 @Scope 어노테이션을 사용하면 된다. 즉 빈의 범위를 설정한다. ---------------------------------------------------------------------------------------------------------------------- singleton – IoC 컨테이너당 하나의 빈을 리턴 prototype – 요구가 있을 때 마다 새로운 빈을 만들어 리턴 request - HTTP request 객체당 하나의 빈을 리턴 session - HTTP session 당 하나의 빈을 리턴 globalSession - 전체 모든 세션에 대해 하나의 빈을 리턴 @Component @Scope("prototype") //요구시마다 하나의 새로운 빈을 리턴 class Ojc { …… } <bean id="ojc" class="oraclejava.edu.Ojc" scope="prototype"/> 2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource, @Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy) 빈을 주입 받는 경우 아래의 어노테이션이 사용 가능하다.
  • 32. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션  @Autowired Spring Framework에 종속적인 어노테이션 이다. 빈의 id, name로 아무거나 맞으면 적용(Type Driven Injection) 여러개의 빈이 검색될 경우 @Qualifier(name="xxx") 어노테이션으로 구분한다. 기본적으로 @Autowired된 속성은 모두 빈이 주입되어야 한다. (주입될 빈이 없는 경우가 있다면 required=false로 하면 오류는 발생하지 않는다.) 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능 2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource, @Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)  @Resource Spring2.5 이상에서 사용가능하며 Spring Framework에 비종속적으로 권장하는 방식이다. 빈의 name으로 주입될 빈을 찾는다. 멤버변수, setter 메소드에 적용가능 사용하기 위해서는 jsr250-api.jar가 클래스패스에 추가되야 한다. [MAVEN 설정] <dependency> <groupId>javax.annotation</groupId> <artifactId>jsr250-api</artifactId> <version>1.0</version> </dependency>
  • 33. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션  @Inject Spring3.0 이상에서 사용가능 하다. 특정 Framework에 종속되지 않은 어플리케이션을 구성하기 위해서는 @Inject를 사용할 것을 권장한다. JSR.330 라이브러리인 javax.inject-x.x.x.jar 파일이 추가되어야 한다. 멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능하다. [MAVEN 설정] <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> 2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource, @Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)
  • 34. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션 2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource, @Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)  @Required Setter 메소드 위에 기술하여 필수 프로퍼티를 설정하는 용도로 사용된다. ----------------------------------------------------------------------------------------------------------------------- package day1; public class Emp { private String ename; @Required public void setEname(String ename) { this.ename = ename; } public String getEname() { return this.ename; } } XML설정에서(Beans.xml)… <context:annotation-config/> <bean id="emp" class="day1.Emp"> <!-- 아래 프로퍼티를 설정하지 않으면 오류 --> <!-- <property ename="ename" value="홍길동" /> --> </bean> main에서… ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); Emp emp = (Student) context.getBean("emp"); System.out.println(“Ename : " + emp.getEname() ); 오류메시지  Property 'ename' is required for bean 'emp' @Required 어노테이션이 사용되기 위해서는 RequiredAnnotationBeanPostProcessor 클래스를 빈으로 등록하거나 <context:annotation-config> 설정을 추가하면 된다.
  • 35. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션 2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource, @Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)  @Named JSR-330의 어노테이션이며 Spring의 @Component, @Qualifier와 동일하다. ----------------------------------------------------------------------------------------------------------------------- @Repository @Named public class EmpDAO { … } public class EmpDAO { … } @Service @Named public class EmpService { … } public class EmpService { … } @Component @Named public class EmpVO { … } public class EmpVO { … } @Autowired public void setEmp(@Qualifier(“programmer") Emp emp) { … }  아래와 동일 @Inject public void setEmp(@Named(“programmer") Emp emp) { … } [MAVEN 설정] <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>
  • 36. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션 2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource, @Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)
  • 37. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션 2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource, @Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)  @Order Spring4에서 새로 소개된 @Order 어노테이션은 같 은 타입의 빈이 컬렉션(List 등)에 Autowired 될 때 그 순서를 지정한다. (* 낮은 숫자가 우선순위가 높다) ----------------------- 먼저 @Order를 사용하지 않은 예제를 작성해 보자. (스프링 버전은 4이상으로) [Emp.java] package ojc; public interface Emp { public void work(); } [Programmer.java] package ojc; import org.springframework.stereotype.Service; @Service public class Programmer implements Emp { public void work() { System.out.println("Programmer Working..."); } } [Designer.java] package ojc; import org.springframework.stereotype.Service; @Service public class Designer implements Emp { public void work() { System.out.println("Designer Working..."); } } [OrderTest.java] @Service public class OrderTest { @Autowired List<Emp> emps; public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("order.xml"); OrderTest test = (OrderTest) context.getBean("orderTest"); for(Emp e : test.emps) { e.work(); } } } [/src/main/resources/order.xml] <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context " xsi:schemaLocation="http://www.springframework.org/schema/b eans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <context:component-scan base-package="ojc"/> </beans>
  • 38. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션 2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource, @Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy) : OrderTest를 실행하면 다음과 같이 결과가 나타난다.(Designer가 List에 먼저 주입됨) [실행 결과] Designer Working... Programmer Working... 그러나 emps 리스트에 주입되는 빈에 순서가 정의되지 않는다. 이때 주입되는 순서를 주기 위해 @Order를 사용하면 된다. 물론 XML설정을 이용하여 Programmer, Designer를 빈으로 등록해 놓 고 List<Emp> emps의 setter를 이용하여 Collection 형태로 빈을 주입한다면 기술된 빈의 순서대 로 List에 들어가게 된다. 앞 예제를 수정해 보자. [Designer.java] @Service @Order(value=2) public class Designer implements Emp { … } [Programmer.java] @Service @Order(value=1) public class Programmer implements Emp { … } 이제는 Programmer가 우선순위가 높아 먼저 출력될 것이다.
  • 39. 2. Spring IoC & DI 2-4. DI와 관련된 어노테이션 2-4-2. Context Configuration Annotations (@Scope, @Autowired, @Resource, @Inject, @Required, @Named, @Order, @PostConstruct, @PreDestroy)  @PostConstruct 객체가 생성된 후 별도의 초기화 작업을 위해 실 행하는 메소드를 선언한다. CommonAnnotationBeanPostProcessor 클래스 를 빈으로 등록시키거나 <context:annotation- config> 태그를 사용하면 된다. ----------------------------------------------------------  @PreDestroy 스프링 컨테이너에서 객체(빈)를 제거하기 전에 해야할 작업이 있다면 메소드위에 사용하는 어노 테이션 이다. 이 어노테이션을 사용하기 위해서 는 CommonAnnotationBeanPostProcessor 클래 스를 빈으로 등록하거나 <context:annotation- config> 태그를 사용하면 된다. <-------------------------------------------------------- class Hello { String name = null; Hello(String name) { this.name = name; } @PostConstruct public initObj() { if (name == null) { name = "홍길동"; } } }
  • 40. Any Questions ? THANK YOU FOR YOUR ATTENTION 무료국비지원교육 / 구로자바학원 _ 탑크리에듀 교육센터 http://www.topcredu.co.kr