SPRING January 06, 2021

spring-01

Words count 10k Reading time 9 mins.

스프링 프레임워크란 ?

스프링 프레임워크(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

  1. 디폴트 생성자 + setter

    1. 디폴트 생성자
      <bean id="객체명" class="클래스명" />

    2. 디폴트 생성자 + setter
      <bean id="객체명" class="클래스명>
      <property name="필드명">
      <value>값</value> // 일반 타입용, 문자, 숫자 상관 없이 따옴표 없이 그냥 적어요.
      </property>
      <property name="필드명">
      <ref bean="객체명" /> // 다른 빈(bean)을 필드로 가지는 경우에 써요.
      </property>
      </bean>

    3. 디폴트 생성자 + 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();
    }

}

자바와 스프링의 차이를 잘 알고 숙지하자

0%