Spring

스프링 부트 - 의존 주입

Clearing 2022. 10. 25. 09:05
728x90

의존 주입은

1) new를 직접 수행해서 바로 사용 (강한 결합)

2) 미리 만들어진 객체를 할당받아서 사용 => DI 의존성 주입 (약한 결합)

- 객체를 생성해주며 라이프사이클(생명주기)을 관리하고 의존 주입을 해준다 == 컨테이너 -> IoC

 

유지보수 용이 == 낮은 결합도, 높은 응집도

 

[의존 주입 방법]

1) .xml

2) 자바 코드 작성

3) @

 

@을 이용한 의존 주입 예시 1

각각의 예시 클래스들은 미리 작성해 둠

package com.kim.springboot.test;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration // 스프링 컨테이너의 설정 파일 역할
public class Config {
	// 설정 파일
	
	@Bean // 객체화 공식
	public Leader leaderA() {
		// Setter 주입
		Leader leader1 = new Leader();
		leader1.setName("티모");
		leader1.setMember(new MemberA());
		return leader1;
	}
	
	@Bean(name="kim")
	public Leader leaderB() {
		return new Leader("아리",new MemberA());
	}
	
	@Bean
	public MemberA memberA() {
		return new MemberA();
	}
	
	@Bean
	public MemberB memberB() {
		return new MemberB();
	}
}

 

위의 설정 파일을 사용하는 메인 클래스

(@SpringBootApplication 사용 안 함)

package com.kim.springboot;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;

import com.kim.springboot.test.Config;
import com.kim.springboot.test.Leader;
import com.kim.springboot.test.Member;

//@SpringBootApplication
public class TestApplication {

	public static void main(String[] args) {
	//	SpringApplication.run(TestApplication.class, args);
		
		// 1. IoC 제공해줄 스프링 컨테이너 생성하기
		ApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);
		// 싱글톤으로 객체 생성 및 관리됨
		
		// 2. @Bean 등록한 객체 사용해보기
		Leader leader1 = (Leader) ac.getBean("leaderA");
		leader1.hello();
		// @Configuration으로 해당 파일이 설정파일이라는것을 인식 생성되어 있는 클래스들을 Config파일에 설정 
		// -> @Bean으로 컨테이너에 의해 각 클래스들 객체화
		// -> Config 설정 파일에서 설정한 내용들이 ac에 주입 
		// -> ac에서 객체화된 leaderA를 가져와 leader1에 주입 
		
		Leader leader2 = (Leader) ac.getBean("kim");
		leader2.hello();
		//
		
		Member member = ac.getBean("memberB",Member.class);
		member.hello("main에서 작성");
		//
		
	}

}

ApplicationContext ac = new AnnotationConfigApplicationContext(???);
=> 디자인 패턴 중 하나의 예시

 

=====================================================================================

 

예시 2 설정 파일 대신 실행될 컨트롤러

package com.kim.springboot.test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class TestController {
	@Autowired
	Leader leader1;
	@Autowired
	Leader leader2;
	@Autowired
	@Qualifier("memberB")
	Member member;
	
	@RequestMapping("/")
	public @ResponseBody String root() {
		leader1.hello();
		leader1.setMember(member);
		leader1.hello();
		
		if(leader1 == leader2) {
			System.out.println("동일한 객체입니다.");
		}
		else {
			System.out.println("동일하지 않습니다.");
		}
		
		return "루트(표지) 페이지";
	}
}

 

@SpringBootApplication 사용

package com.kim.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Test02Application {

	public static void main(String[] args) {
		SpringApplication.run(Test02Application.class, args); // 내장된 톰캣 실행
		// 1. main 메서드 실행
		// 2. @SpringBootApplication의 영향으로 @ 스캔 및 등록
		// 3. 10번 라인에 의해 내장 톰캣 실행
		// 4. ApplicationContext 생성 == 스프링 컨테이너 실행
		//		-> URL로 요청 입력시 RequestMapping에 의해 작성한 메서드가 호출되는 방식
	}

}

 

 - @SpringBootApplication
Bean(객체)들을 생성할 때, 싱글톤을 유지할 수 있도록 설정 및 관리
각각의 객체들이 생성되면 용이한 순간을 추측하여 메모리를 관리
.jar 파일들도 생성 및 설정 관리
@ 지정된 클래스를 스캔해서 Bean 등록 관리

728x90

'Spring' 카테고리의 다른 글

스프링 부트 - MyBatis 연동  (0) 2022.12.04
스프링 부트 - Validator 검증  (0) 2022.10.26
스프링 부트 설치 및 시작  (0) 2022.10.24
Spring Ajax를 사용한 정렬  (1) 2022.10.07
Mybatis 프레임워크 스프링 연동  (0) 2022.10.05