스프링 프레임워크란 ?
스프링 프레임워크(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();
    }
}
자바와 스프링의 차이를 잘 알고 숙지하자