스프링 프레임워크란 ?
스프링 프레임워크(Spring Framework)는 자바 기반의 오픈소스 프레임워크로 자바 EE(Enterprise Edition)에서 요구하는 수준의 복잡한 기능들을 자바 EE를 사용하지 않고 구현하고자 시작되었습니다.
2002년 Rod Johnson이 자신의 저서 “Expert One-on-One J2EE Design and Developement”에서 제시한 코드와 아이디어를 발전시켜 오늘에 이르게 되었습니다.
스프링 프레임워크 주요 특징
스프링 프레임워크에 사용된 주요 특징은 다음과 같습니다.
- 경량 컨테이너로서 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링 컨테이너로부터 필요한 객체를 얻어올 수 있다.
- 제어의 역행(IoC : Inversion of Control)을 지원한다. 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
- 의존성 주입(DI : Dependency Injection)을 지원한다. 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
- 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원한다. 따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
일반적으로 대규모 시스템은 한번 개발하면 오랜동안 유지되면 급격한 변경 보다는 점진적으로 보완하는 형태로 시스템을 유지보수해 나갑니다.
spring 시작
초기설정
스프링 다운 받은 후
왼쪽 이부분 삭제 후 tomcat 8.5 로 바꿔준다.
window -> preferences 들어가서 나머지 이클립스랑 동일하게 그리고 저부분 tomcat 추가한다.
프로젝트 시작
위에 나와 있는 부분 누른 후 프로젝트 시작계산기 만들기.
Calculator.java
public class Calculator {
// field
// constructor
public Calculator() {
}
// method
public void add(int a, int b) {
System.out.println( a + "+" + b + "=" + (a + b) );
}
public void subtract (int a, int b) {
System.out.println( a + "-" + b + "=" + (a - b) );
}
public void multiply(int a, int b) {
System.out.println( a + "*" + b + "=" + (a * b) );
}
public void divide(int a, int b) {
System.out.println( a + "/" + b + "=" + (a / b) );
}
}
EngineerCalculator.java
field
만든 후 source 의 Generate getters setters 사용해method
를 생성한다.constructor
필수!
public class EngineerCalculator {
// field
private Calculator calculator;
private int a;
private int b;
// constructor
public EngineerCalculator() {
// bean
}
public EngineerCalculator(Calculator calculator, int a, int b) {
super();
this.calculator = calculator;
this.a = a;
this.b = b;
}
// method
public void add() {
calculator.add(a, b);
}
public void subtract() {
calculator.subtract(a, b);
}
public void multiply() {
calculator.multiply(a, b);
}
public void divide() {
calculator.divide(a, b);
}
public Calculator getCalculator() {
return calculator;
}
public void setCalculator(Calculator calculator) {
this.calculator = calculator;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
}
자바 스타일로 만들기
MainClass.java
package com.koreait.spring;
public class MainClass {
public static void main(String[] args) {
// 개발자가 직접 new를 이용해서 각종 객체(인스턴스, 빈)을 생성한다.
Calculator calculator1 = new Calculator();
Calculator calculator2 = new Calculator();
// EngineerCalculator 사용방법
// 1. 디폴트 생성자 + setter
// 2. 필드를 이용한 생성자
// 1. 디폴트 생성자 + setter
// 1) 디폴트 생성
EngineerCalculator eCalculator1 = new EngineerCalculator();
// 2) setter
eCalculator1.setA(10);
eCalculator1.setB(3);
eCalculator1.setCalculator(calculator1);
eCalculator1.add();
eCalculator1.subtract();
eCalculator1.multiply();
eCalculator1.divide();
// 2. 필드를 이용한 생성자
EngineerCalculator eCalculator2 = new EngineerCalculator(calculator2, 100, 30);
eCalculator2.add();
eCalculator2.subtract();
eCalculator2.multiply();
eCalculator2.divide();
}
}
메인클래스에서 new생성자를 통해 매개변수를 전달하고 계산내용을 실행한다.
만약 계산 값을 바꾸려면 MainClass의 set부분을 수정해줘야 한다.
Spring 스타일로 Main 만들기
★app-context.xml★ 만들기 (중요)
resources 폴더 에서 생성
app-context.xml 빈(객체, 인스턴스)을 만들어 주는 xml 파일
spring bean configuration file
디폴트 생성자 + setter
디폴트 생성자
<bean id="객체명" class="클래스명" />
디폴트 생성자 + setter
<bean id="객체명" class="클래스명>
<property name="필드명">
<value>값</value>
// 일반 타입용, 문자, 숫자 상관 없이 따옴표 없이 그냥 적어요.</property>
<property name="필드명">
<ref bean="객체명" />
// 다른 빈(bean)을 필드로 가지는 경우에 써요.</property>
</bean>
디폴트 생성자 + setter
<bean id="객체명" class="클래스명>
<property name="필드명" value="값" />
// 일반 타입용, 문자, 숫자 상관 없이 항상 따옴표를 써야 해요.<property name="필드명" ref="객체명" />
// 다른 빈(bean)을 필드로 가지는 경우에 써요.</bean>
<?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.xsd">
<!--
지금부터 아래 빈을 만들거에요.
Calculator calculator1 = new Calculator();
Calculator calculator2 = new Calculator();
-->
<bean id="calculator1" class="com.koreait.spring.Calculator" />
<bean id="calculator2" class="com.koreait.spring.Calculator" />
<!--
지금부터 아래 빈을 만들거에요.
EngineerCalculator eCalculator1 = new EngineerCalculator();
eCalculator1.setA(10);
eCalculator1.setB(3);
eCalculator1.setCalculator(calculator1);
-->
<bean id="eCalculator1" class="com.koreait.spring.EngineerCalculator">
<property name="a">
<value>10</value>
</property>
<property name="b">
<value>3</value>
</property>
<property name="calculator">
<ref bean="calculator1" />
</property>
</bean>
<!--
지금부터 아래 빈을 만들거에요.
EngineerCalculator eCalculator2 = new EngineerCalculator(calculator2, 100, 30);
-->
<bean id="eCalculator2" class="com.koreait.spring.EngineerCalculator">
<constructor-arg>
<ref bean="calculator2" />
</constructor-arg>
<constructor-arg>
<value>100</value>
</constructor-arg>
<constructor-arg>
<value>30</value>
</constructor-arg>
</bean>
</beans>
SpringMainClass.java
public class SpringMainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
// app-context.xml 에 정의된 빈(bean)을 생성하는 클래스가 있습니다.
// GenericXmlApplicationContext 클래스 입니다
// AbstractApplicationcontext는 GenericXmlApplicationContext 의 슈퍼클래스 입니다.
String resourceLocations = "classpath:app-context.xml";
AbstractApplicationContext ctx = new GenericXmlApplicationContext(resourceLocations);
// cal1과 cal2의생성을 app-context.xml 에서 처리합니다
//개발자가 직접 생성하지 않고, app-context.xml에게 빈을 요청하는 방식입니다(getBean)
// 빈의 생성 권한을 스프링 프레임워크가 가져갑니다.
// 개발자가 빈을 생성하지 않습니다.
// IoC: Inversion of Control (제어의 역전)
// getBean ( bean 태그의 id, bean 태그의 class)
Calculator cal1 = ctx.getBean("calculator1", Calculator.class); //<bean id =" calculator
cal1.add(10, 3);
cal1.subtract(10, 3);
cal1.multiply(10, 3);
cal1.divide(10, 3);
Calculator cal2 = ctx.getBean("calculator2", Calculator.class);
cal2.add(100, 30);
cal2.subtract(1000, 3);
cal2.multiply(100, 30);
cal2.divide(100, 30);
ctx.close();
}
}
자바와 스프링의 차이를 잘 알고 숙지하자