[필기정리] Day107-2 - Spring Framework, DI 등

Web/Spring

2020. 11. 24. 17:06

# 용어 설명

- Framework(프레임워크) : 클래스 + 라이브러리

모듈화를 하는 이유 중 하나인 재사용성을 큰 그룹 단위로 묶어준 것

 

- Spring(스프링) : Java/JSP 기반의 웹 프레임워크(오픈소스 프레임워크)

+ 주요특징

① POJO(Plain Old Java Object) 방식

    POJO는 Java EE를 사용하면서 해당 플랫폼에 종속되어 있는 무거운 객체들을 만드는 것에

   반발하며 나타난 용어다. 별도의 프레임워크 없이 Java EE를 사용할 때에 비해

    특정 인터페이스를 직접 구현하거나 상속받을 필요가 없어

    기존 라이브러리를 지원하기가 용이하고, 객체가 가볍다.

 

② 관점 지향 프로그래밍(Aspect Oriented Programming, AOP)

    로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할 수 있다.

    AspectJ를 포함하여 사용할 수 있고, 스프링에서 지원하는 실행에 조합하는 방식도 지원한다.

 

 

 의존성 주입(Dependency Injection, DI)

DI 설명 이미지

 

DI 설명 이미지

   프로그래밍에서 구성요소 간의 의존 관계가 소스코드 내부가 아닌 외부에서 설정을 통해 정의되는 방식이다.

   코드 재사용을 높여 소스코드를 다양한 곳에 사용할 수 있으며 모듈간의 결합도도 낮출 수 있다.

   계층, 서비스 간에 의존성이 존재하는 경우 스프링 프레임워크가 서로 연결시켜준다.

 

[DI] Dependency Injection이란 무엇일까?

Dependency Injection, 의존성 주입이 무엇이고 어떤 이점이 있는지 예시를 통해 정리한 글입니다.

velog.io

 

 

④ 제어 반전(Inversion of Control, IoC)

    전통적인 프로그래밍에서는 개발자가 작성한 프로그램이 외부 라이브러리의 코드를 호출해서 이용했다.

    제어 반전은 이와 반대로 외부 라이브러리 코드가 개발자의 코드를 호출하게 된다.

    즉, 제어권이 프레임워크에게 있어 필요에 따라 스프링 프레임워크가 사용자의 코드를 호출한다.

 

⑤ 생명주기 관리

    스프링 프레임워크는 Java 객체의 생성, 소멸을 직접 관리하며 필요한 객체만 사용할 수 있다.

 

# Spring Project 만드는 방법

1. Package Explorer에서 우클릭 후 new - other 를 선택합니다.

 

2. "spring"을 입력한 후 Spring Legacy Project를 선택한 뒤 Next를 클릭하세요.

 

3. 아래와 같이 사용하실 프로젝트명을 입력한 후 Spring MVC Project를 선택한 뒤 Next를 클릭합니다.

 

4. 사용하실 패키지명을 입력한 뒤 Finish 버튼을 클릭하면 됩니다.

 

# 서버 키는 방법

1. 해당 프로젝트 선택 후 우클릭 - Run As - Run on Server을 클릭합니다.

 

2. Finish 버튼을 클릭합니다.

 

3. 서버가 정상적으로 구동되었을 때 아래와 같이 확인이 가능합니다.

 

Q. Calculator클래스와 MyCalculator 클래스를 Spring Bean Configuration File을 이용하여 생성하자.

    (xml을 이용하여 객체 생성)

    그리고 main 메소드가 있는 클래스를 만들고 거기서 사칙연산을 해보자.

- Calculator.java

package com.tistory.coderbear;

public class Calculator {
	public void addition(int f, int s) {
		System.out.println("addition()");
		int result = f + s;
		System.out.println(f + " + " + s + " = " + result);
	}
	
	public void subtraction(int f, int s) {
		System.out.println("subtraction()");
		int result = f - s;
		System.out.println(f + " - " + s + " = " + result);
	}
	
	public void multiplication(int f, int s) {
		System.out.println("multiplication()");
		int result = f * s;
		System.out.println(f + " * " + s + " = " + result);
	}
	
	public void division(int f, int s) {
		System.out.println("division()");
		int result = f / s;
		System.out.println(f + " / " + s + " = " + result);
	}
}

- MyCalculator.java

package com.tistory.coderbear;

public class MyCalculator {
	private Calculator calculator; // 멤버변수이자 참조변수
	private int firstNum; // 멤버변수 선언
	private int secondNum; // 멤버변수 선언
	
	public MyCalculator() {

	}

	public void add() {
		calculator.addition(firstNum, secondNum);
	}
	
	public void sub() {
		calculator.subtraction(firstNum, secondNum);
	}
	
	public void mul() {
		calculator.multiplication(firstNum, secondNum);
	}
	
	public void div() {
		calculator.division(firstNum, secondNum);
	}
	
	public void setCalculator(Calculator calculator) { // 세터 메소드로 초기화
		this.calculator = calculator;
	}
	
	public void setFirstNum(int firstNum) {
		this.firstNum = firstNum;
	}
	
	public void setSecondNum(int secondNum) {
		this.secondNum = secondNum;
	}
}

 

A.

- applicationContext.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.xsd">

	<bean id="calculator" class="com.tistory.coderbear.Calculator"/> // id=참조변수명 class=패키지명
    <bean id="myCalculator" class="com.tistory.coderbear.MyCalculator">	
        <property name="calculator"> // <- private Calculator calculator 의미
			<ref bean="calculator"></ref> 
		</property>
		<property name="firstNum" value="10"/>
		<property name="secondNum" value="2"></property>
	</bean>
</beans>

+ 자바로 동일하게 표현했을 때

<?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">

   	com.tistory.coderbear.Calculator calculator = new com.tistory.coderbear.Calculator();
	com.tistory.coderbear.MyCalculator Mycalculator = new com.tistory.coderbear.MyCalculator();
    myCalculator.setCalculator(calculator);
   	myCalculator.setFirstNum(10);
   	myCalculator.setSecondNum(2);    
	</bean>
</beans>

- MainClass.java

package com.tistory.coderbear;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class MainClass {
	public static void main(String[] args) {
				
		String configLocation = "applicationContext.xml";
		AbstractApplicationContext factory = new GenericXmlApplicationContext(configLocation);
        // 스프링 컨테이너 생성
		MyCalculator myCalculator = (MyCalculator)factory.getBean("myCalculator");
        // 스프링 컨테이너에서 컴포넌트 가져옴 ( applicationContext.xml에서 만든 myCalculator 가져오는 것)
		myCalculator.add(); // 결과 : 10 + 2 = 12
		myCalculator.sub(); // 결과 : 10 - 2 = 8
		myCalculator.mul(); // 결과 : 10 * 2 = 20
		myCalculator.div(); // 결과 : 10 / 2 = 5
		
		factory.close();
	}
}

+ 자바로 동일하게 표현했을 때

MyCalculator myCalculator = new MyCalculator();
myCalculator.setCalculator(new Calculator());
		
myCalculator.setFirstNum(10);
myCalculator.setSecondNum(2);
		
myCalculator.add();
myCalculator.sub();
myCalculator.mul();
myCalculator.div();	
728x90