## 교육정리
1) Spring 프레임워크 1편
- 스프링 IoC 컨테이너 사용)
- IoC 컨테이너에 보관된 객체를 확인하기)
- IoC 컨테이너에 객체를 보관하기)
- 패키지를 탐색하여 빈을 자동 생성하기)
- IoC 컨테이너에서 객체 꺼내기)
#1 Spring 프레임워크
IoC 컨테이너)
IoC(Inversion Of Control) 컨테이너
=> bean container 라고도 부른다.
=> 번역하면 제어의 역전이라고도 한다.
=> 인스턴스의 생성과 관리를 담당한다.
=> 각 객체가 의존하는 객체(dependency)를 자동으로 주입해 준다.
"의존 객체 주입(dependency injection; DI)"이라 부른다.
그래서 "DI 컨테이너"라고도 부른다.
Spring IoC 컨테이너)
=> spring.io 사이트에서 제공하는 프레임워크이다.
=> 프로젝트에 Spring IoC 컨테이너 포함하기
mvnrepository.com 또는 central.sonatype.com에서
spring-context 로 라이브러리를 검색한다.
=> build.gradle 에 의존 라이브러리 정보를 추가한다.
=> '$ gradle eclipse'를 실행하여 라이브러리 파일을 다운로드 받고
이클립스 설정 파일을 갱신한다.
=> 이클립스에서 프로젝트 정보를 갱신한다.
ApplicationContext 인터페이스)
=> 스프링 IoC 컨테이너의 사용 규칙을 정의한 인터페이스이다.
=> 모든 스프링 IoC 컨테이너는 이 규칙에 따라 정의되어 있다.
* ApplicationContext 구현체(implements, 인터페이스를 구현한 클래스 또는 그 클래스의 인스턴스)의 종류
1) XML 파일에서 설정 정보를 읽어들이는 IoC 컨테이너
- ClassPathXmlApplicationContext : 설정 파일을 자바 CLASSPATH 경로에서 찾는다.
- FileSystemXmlApplicationContext : 설정 파일을 OS 경로에서 찾는다.
2) 자바 클래스 파일의 애노테이션에서 설정 정보를 읽어 들이는 IoC 컨테이너
- AnnotationConfigApplicationContext : 설정 정보를 자바 클래스에서 찾는다.
application-context.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 여기에 Spring Framework의 설정 정보를 기술한다. -->
</beans>
스프링 IoC 컨테이너 사용)
- Car.java
package com.eomcs.spring.ioc.ex01;
import org.springframework.stereotype.Component;
@Component
public class Car {
String model;
String maker;
int cc;
public Car() {
System.out.println("Car() 생성자 호출!");
}
@Override
public String toString() {
return "Car [model=" + model + ", maker=" + maker + ", cc=" + cc + "]";
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getMaker() {
return maker;
}
public void setMaker(String maker) {
this.maker = maker;
}
public int getCc() {
return cc;
}
public void setCc(int cc) {
this.cc = cc;
}
}
- Engine.java
package com.eomcs.spring.ioc.ex01;
import org.springframework.stereotype.Component;
@Component
public class Engine {
String maker;
int valve;
int cylinder;
public Engine() {
System.out.println("Engine() 생성자 호출됨!");
}
@Override
public String toString() {
return "Engine [maker=" + maker + ", valve=" + valve + ", cylinder=" + cylinder + "]";
}
public String getMaker() {
return maker;
}
public void setMaker(String maker) {
this.maker = maker;
}
public int getValve() {
return valve;
}
public void setValve(int valve) {
this.valve = valve;
}
public int getCylinder() {
return cylinder;
}
public void setCylinder(int cylinder) {
this.cylinder = cylinder;
}
}
- ex01)
1) 자바 CLASSPATH 에서 설정 파일을 찾는 IoC 컨테이너
=> 자바 CLASSPATH?
1) JVM을 실행할 때 -classpath 옵션으로 지정한 경로
예) $java -classpath c:\a\b;d:\xxx\yyy\zzz;c:\bb\x.jar Hello
2) 만약 -classpath 경로가 지정되어 있지 않으면,
OS에서 CLASSPATH 환경 변수로 등록한 경로
=> 파일 경로이기 때문에 패키지와 패키지 사이에는 . 대신에 /를 사용해야 한다.
// 스프링 IoC 컨테이너 사용
package com.eomcs.spring.ioc.ex01.a;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Exam01 {
public static void main(String[] args) {
ApplicationContext iocContainer = new ClassPathXmlApplicationContext(
"com/eomcs/spring/ioc/ex01/a/application-context.xml");
System.out.println("실행 완료!");
}
}
- ex02)
2) 운영체제의 파일 시스템에서 설정 파일을 찾는 IoC 컨테이너
=> 자바 classpath가 아닌 다른 폴더에 설정파일이 있을 경우 사용한다.
=> 설정 파일 경로를 지정할 때 파일 시스템 경로를 지정해야 한다.
=> 단, URL 형식으로 지정해야 한다.
=> 예) file://설정파일경로
=> URL 형식에서는 파일 시스템을 가리킬 때 접두어 'file://'를 붙인다.
// 스프링 IoC 컨테이너 사용
package com.eomcs.spring.ioc.ex01.b;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Exam01 {
public static void main(String[] args) {
ApplicationContext iocContainer = new FileSystemXmlApplicationContext(
"file:///Users/joohyunwook/Desktop/git/bitcamp-study/java_lang/app/src/main/java/com/eomcs/spring/ioc/ex01/b/application-context.xml");
System.out.println("실행 완료!");
}
}
-ex03)
AppConfig)
package com.eomcs.spring.ioc.ex01.c;
// 클래스 선언부에 애노테이션으로 스프링 설정에 관한 정보를 지정할 수 있다.
public class AppConfig {
// 필드나 메서드로 스프링 관련 설정을 수행할 수 있다.
}
3) 자바 클래스 파일의 애노테이션으로부터 설정 정보를 추출한다.
=> 자바 클래스로 설정 정보를 다루는 것을 'Java Config' 라 부른다.
=> 생성자 파라미터로 Java Config 클래스의 타입 정보를 넘긴다.
// 스프링 IoC 컨테이너 사용
package com.eomcs.spring.ioc.ex01.c;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Exam01 {
public static void main(String[] args) {
ApplicationContext iocContainer = new AnnotationConfigApplicationContext(
AppConfig.class);
System.out.println("실행 완료!");
}
}
IoC 컨테이너에 보관된 객체를 확인하기)
- ex01)
// IoC 컨테이너에 보관된 객체를 확인하기
package com.eomcs.spring.ioc.ex01.d;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;
public class Exam01 {
public static void main(String[] args) {
ApplicationContext iocContainer = new ClassPathXmlApplicationContext(
"com/eomcs/spring/ioc/ex01/d/application-context.xml");
// 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
SpringUtils.printBeanList(iocContainer);
System.out.println("실행 완료!");
}
}
AnnotationConfigApplicationContext는 애노테이션 처리에 필요한 도구를 기본 포함하고 있다.
또한 Java Config 클래스(AppConfig)의 객체도 포함한다.
- ex02)
// IoC 컨테이너에 보관된 객체를 확인하기
package com.eomcs.spring.ioc.ex01.d;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;
public class Exam02 {
public static void main(String[] args) {
ApplicationContext iocContainer = new AnnotationConfigApplicationContext(
AppConfig.class);
// 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
SpringUtils.printBeanList(iocContainer);
System.out.println("실행 완료!");
}
}
IoC 컨테이너에 객체를 보관하기)
- AppConfig)
package com.eomcs.spring.ioc.ex01.e;
import org.springframework.context.annotation.Bean;
import com.eomcs.spring.ioc.ex01.Car;
// 클래스 선언부에 애노테이션으로 스프링 설정에 관한 정보를 지정할 수 있다.
public class AppConfig {
// 객체 생성
@Bean
public Car c1() {
return new Car();
}
}
- application-context.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 객체 생성 -->
<bean id="c1" class="com.eomcs.spring.ioc.ex01.Car"/>
</beans>
- ex01)
// IoC 컨테이너에 객체를 보관하기
package com.eomcs.spring.ioc.ex01.e;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;
public class Exam01 {
public static void main(String[] args) {
ApplicationContext iocContainer = new ClassPathXmlApplicationContext(
"com/eomcs/spring/ioc/ex01/e/application-context.xml");
// 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
SpringUtils.printBeanList(iocContainer);
System.out.println("실행 완료!");
}
}
- ex02)
// IoC 컨테이너에 객체를 보관하기
package com.eomcs.spring.ioc.ex01.e;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;
public class Exam02 {
public static void main(String[] args) {
ApplicationContext iocContainer = new AnnotationConfigApplicationContext(
AppConfig.class);
// 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
SpringUtils.printBeanList(iocContainer);
System.out.println("실행 완료!");
}
}
패키지를 탐색하여 빈을 자동 생성하기)
- AppConfig)
package com.eomcs.spring.ioc.ex01.f;
import org.springframework.context.annotation.ComponentScan;
// 객체를 생성할 패키지 지정
@ComponentScan("com.eomcs.spring.ioc.ex01")
public class AppConfig {
}
- application-context.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 클래스를 찾을 패키지 지정한다.
그러면 IoC 컨테이너는 @Component 등의 애노테이션이 붙은 클래스를 찾아
인스턴스를 생성하여 보관한다. -->
<context:component-scan base-package="com.eomcs.spring.ioc.ex01"/>
</beans>
- ex01)
// 패키지를 탐색하여 빈을 자동 생성하기
package com.eomcs.spring.ioc.ex01.f;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;
public class Exam01 {
public static void main(String[] args) {
ApplicationContext iocContainer = new ClassPathXmlApplicationContext(
"com/eomcs/spring/ioc/ex01/f/application-context.xml");
// 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
SpringUtils.printBeanList(iocContainer);
System.out.println("실행 완료!");
}
}
- ex02)
// IoC 컨테이너에 객체를 보관하기 II
package com.eomcs.spring.ioc.ex01.f;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;
public class Exam02 {
public static void main(String[] args) {
ApplicationContext iocContainer = new AnnotationConfigApplicationContext(
AppConfig.class);
// 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
SpringUtils.printBeanList(iocContainer);
// 애노테이션을 처리하는 기본 도구 외에
// AppConfig에서 설정한 객체(Car)도 포함하고 있다.
System.out.println("실행 완료!");
}
}
IoC 컨테이너에서 객체 꺼내기)
- application-context.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 객체 생성 -->
<bean id="c1" class="com.eomcs.spring.ioc.ex01.Car"/>
</beans>
- ex01)
// IoC 컨테이너에서 객체 꺼내기
package com.eomcs.spring.ioc.ex01.g;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;
import com.eomcs.spring.ioc.ex01.Car;
public class Exam01 {
public static void main(String[] args) {
ApplicationContext iocContainer = new ClassPathXmlApplicationContext(//
"com/eomcs/spring/ioc/ex01/g/application-context.xml");
// 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
SpringUtils.printBeanList(iocContainer);
// 1) 객체 이름으로 꺼내기
System.out.println(iocContainer.getBean("c1"));
// 2) 객체 타입으로 꺼내기
System.out.println(iocContainer.getBean(Car.class));
System.out.println("실행 완료!");
}
}
- ex02)
// IoC 컨테이너에서 객체 꺼내기 II - 예외 발생
package com.eomcs.spring.ioc.ex01.g;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.eomcs.spring.ioc.SpringUtils;
public class Exam02 {
public static void main(String[] args) {
ApplicationContext iocContainer = new ClassPathXmlApplicationContext(//
"com/eomcs/spring/ioc/ex01/g/application-context.xml");
// 현재 IoC 컨테이너에 들어 있는 객체를 출력해 보자.
SpringUtils.printBeanList(iocContainer);
// 존재하지 않는 객체 꺼내기
System.out.println(iocContainer.getBean("c2"));
// 해당 이름의 객체가 들어 있지 않다면,
// => null을 리턴하는 것이 아니라 예외가 발생한다.
System.out.println("실행 완료!");
}
}
'[Naver Cloud Camp 7] 교육 정리' 카테고리의 다른 글
네이버 클라우드 캠프 87일차 230828 (0) | 2023.08.29 |
---|---|
네이버 클라우드 캠프 86일차 230825 (0) | 2023.08.24 |
네이버 클라우드 캠프 85일차 230824 (0) | 2023.08.23 |
네이버 클라우드 캠프 84일차 230823 (1) | 2023.08.22 |
네이버 클라우드 캠프 83일차 230822 (0) | 2023.08.22 |