Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

wintertreey 님의 블로그

스프링의 기본개념, Constructor Injection 본문

Spring

스프링의 기본개념, Constructor Injection

wintertreey 2024. 7. 3. 19:55

이 개념들을 완전히 지금 다 이해할수는 없을 것이다. 간단히 의미정도만 확인하고 넘어가자. 

 

스프링 vs 스프링 부트

Spring은 스프링 프레임워크의 핵심 모듈을 모아서 만든 프레임워크 Spring에서는 개발자가 직접 설정 파일을 작성하여 스프링 컨테이너를 구성하고, 필요한 빈 객체를 등록하고, 빈 객체 간의 의존성을 설정해야 한다. Spring은 특정한 구성을 위해 추가적인 라이브러리와 설정이 필요.

반면, Spring Boot는 스프링 프레임워크를 보다 쉽게 사용할 수 있도록 만든 프레임워크. Spring Boot에서는 개발자가 설정 파일을 작성할 필요 없이, 프로젝트의 설정과 라이브러리 의존성을 자동으로 처리해주는 기능을 제공. 또한, Spring Boot는 실행 가능한 JAR 파일을 만들 수 있다.

 

 Spring은 개발자가 직접 설정 파일을 작성하고, 빈 객체를 등록하고, 빈 객체 간의 의존성을 설정하는 것을 요구.

반면, Spring Boot는 개발자가 보다 쉽게 스프링을 사용할 수 있도록 설정과 의존성 처리 등을 자동으로 처리.

Spring은 스프링 프레임워크를 보다 세밀하게 제어하고자 하는 경우에, Spring Boot는 빠르고 간단하게 스프링 애플리케이션을 개발하고자 하는 경우에 사용된다.

 

IoC

IoC는 Inversion of Control을 줄인 표현. 직역하면 제어의 역전.

다른 객체를 직접 생성하거나 제어하는 것이 아니라 외부에서 관리하는 객체를 가져와 사용하는 것.

제어의 역전을 적용하면 객체를 외부에서 관리하게 되고, 실제로 사용할 때에는 외부에서 제공해주는 객체를 받아오게 된다. 스프링에서는 제어의 역전 개념을 중요한 컨셉으로 삼고 있으며, 방금까지 설명한 내용에서 외부(=객체를 관리하고 관리하는 주체)를 “스프링 컨테이너”라고 한다.

 

DI

앞에서 설명한 것처럼 스프링에서는 객체들을 관리하기 위해 제어의 역전을 사용한다. 그리고 제어의 역전을 구현하기 위해 사용하는 방법이 DI.

DI는 Dependency Injection를 줄인 표현이고, 직역하면 의존성 주입이다. 어떤 클래스가 다른 클래스에 의존한다는 뜻.

 

출처 https://shinsunyoung.tistory.com/133

 


DI - constructor injection

연습

spr3di_ex class diagram

키보드로 상품명, 수량, 단가 넣고

결과는 상품명: XXX -> 금액: XXX 와 같은 형식으로 출력하시오. 

 

 

pom.xml 먼저 정리해주기.

 

SangpumInter.java 인터페이스 만들기

package pack.model;

public interface SangpumInter {
	// 보통 여러개의 파생클래스가 있다. 수업시간에는 간단히 한개만.
	int calcMoney(String sang, int su, int dan);
	
}

 

SangpumImpl.java 인터페이스를 구현할 클라스 생성

package pack.model;

public class SangpumImpl implements SangpumInter{ //implement= 구현하다
	
	@Override
	public int calcMoney(String sang, int su, int dan) {
		int re= su * dan;
		return re;
		
		// spr3di 처럼 배열로 해도 됨. 
		/*
		 * public String[] calcMoney(String sang, int su, int dan) {
		String rs[] = new String[2];
		
		rs[0] = sang;
		rs[1] = Integer.toString(su * dan);
		
		return rs;
		 */
	}
	
}

 

 

MyInter.java 인터페이스 생성

package pack.controller;

public interface MyInter { //여러개의 요청서비스
	void inputData(); //입력따로
	void showData(); // 출력따로 
	
}

 

 

MyImpl.java 인터페이스를 구현하는 클래스

SangpumInter 인터페이스를 구현한 객체를 주입받아 사용하며, 사용자로부터 입력을 받아 계산하고 결과를 출력하는 기능을 제공. 이를 통해 클래스 간의 결합도를 낮추고 유연성을 확보할 수 있다. >>> 다형성!

package pack.controller;

import java.util.Scanner;

import pack.model.SangpumInter;

public class MyImpl implements MyInter{ //extends sangpumImpl하면 이거하나만 쓸수있다. 
	//그러나 implements MyInter하면 다 할수있다. 심지어 다중도 됨.
	private SangpumInter inter; //SangpumInter 타입의 인터페이스 변수
	//클래스를 선언해주면, 해당 클래스하나만 가. 다양하게 다 쓰고싶어서 클래스가아닌 인터페이스를 선언.
	private int re;
	private String sang;
	//private String rs[];
	
	
	public MyImpl(SangpumInter inter) {
		this.inter = inter; // 인터페이스 다형성
	}
	
	@Override
	public void inputData() {// 스캐너를 통해 입력한 값들을 MoneyInter타입의 클래스이용해 계산
		try {
			Scanner sc = new Scanner(System.in);
			System.out.println("상품명 입력: ");
			sang = sc.next();
			//String sang = sc.next();
			System.out.println("수량 입력: ");
			int su = sc.nextInt();
			System.out.println("단가 입력: ");
			int dan = sc.nextInt();
			re= inter.calcMoney(sang, su, dan);
			//rs= inter.calcMoney(sang, su, dan);
		} catch (Exception e) {
			System.out.println("inputData err: "+ e.getMessage());
		}
		
	}
	@Override
	public void showData() {
		System.out.println("상품명은 "+sang+ " -> 금액은 "+ re);
		//System.out.println("상품명: " + rs[0] + "\n" + "금액은: " +  rs[1] + "원");

	}
	
}

 

 

init.xml

이 파일은 스프링에서 의존성 주입(Dependency Injection, DI)설정을 정의하는 xml 설정 파일이다. 

<?xml version="1.0" encoding="UTF-8"?>
<!-- 모든 설정을 자바코드로 부터 분리, 외부화한다. 혹은 annotation을 사용해 자바코드내에서 DI 설정을 할 수도 있다. -->
<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">

 

xml 선언해주고, 스프링의 beans 네임스페이스와 XML 스키마 위치를 정의한다.

<!-- DI 중 Constructor Injection. 외부에서 만든 생성자 주입하기. -->
<bean id="myImpl" class="pack.controller.MyImpl"> 
    <constructor-arg>
        <ref bean="sangpumImpl" />
    </constructor-arg>
</bean>

<bean id="sangpumImpl" class="pack.model.SangpumImpl" />

 

 

<bean> 요소를 사용하여 스프링 빈(bean)을 정의.

id 속성은 각 빈의 고유 식별자를 나타내며, class 속성은 해당 빈의 클래스를 지정해준다.

 

myImpl 빈은 MyImpl 클래스의 객체를 생성하고, 생성자 주입을 통해 sangpumImpl 빈을 참조. 이를 통해 MyImpl 클래스의 생성자가 SangpumImpl 객체를 인자로 받을 수 있다.

sangpumImpl 빈은 SangpumImpl 클래스의 객체를 생성. 

 

<constructor-arg> 생성자 인자를 설정

 myImpl 빈이 MyImpl 클래스의 생성자를 호출할 때, SangpumImpl 객체를 주입하여 생성하는 방식.

 

 

마지막 Main.java

package pack.controller;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("init.xml");
		
		MyInter myInter = (MyInter)context.getBean("myImpl");
		myInter.inputData();
		myInter.showData();
	}

}

 

콘솔출력창

 

 

추가적으로 다른 코드도 보고싶다면 깃허브를 참고하자.

https://github.com/yoonah0327/spring_source

 

GitHub - yoonah0327/spring_source

Contribute to yoonah0327/spring_source development by creating an account on GitHub.

github.com

 

 


https://www.inflearn.com/blogs/3315

 

spring 과 springBoot의 차이점 - 고승조님의 블로그 - 인프런 | 커뮤니티

spring 과 springBoot의 차이점 - Spring과 Spring Boot는 모두 스프링 프레임워크를 기반으로 한 자바 웹 개발 프레임워크입니다. 둘 간에는 몇 가지 차이점이 있습니다.Spring은 스프링 프레임워크의 핵심

www.inflearn.com

https://shinsunyoung.tistory.com/133

 

스프링의 콘셉트(IoC, DI, AOP, PSA) 쉽게 이해하기

❕ 들어가며 이번 글에서는 스프링의 중요한 콘셉트인 IoC(제어의 역전), DI(의존성 주입), AOP(관점 지향 프로그래밍), PSA(이식 가능한 서비스 추상화)에 대해 알아보겠습니다. 💡 이 글을 읽게 됨

shinsunyoung.tistory.com

 

 

https://innovation123.tistory.com/167

 

[Spring / 스프링 부트 핵심 가이드] 제어의 역전(IoC, DI, AOP)

스프링 프레임워크(Spring Framework) 스프링 프레임워크(이하 스프링)는 Java에서 가장 많이 사용하는 프레임워크다. 스프링은 Java 언어로 엔터프라이즈급 개발을 편리하게 만들어주는 '오픈소스 경

innovation123.tistory.com

 

https://goddaehee.tistory.com/156

 

[Spring] 스프링(Spring) 정의 및 특징 정리

[Spring] 스프링(Spring) 정의 및 특징 정리 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ 스프링(Spring) 정의, 스프링 특징 ] 입니다. : ) 스프링프레임워크(Spring Framework) - 자바 플랫폼을 위한 오픈소스

goddaehee.tistory.com