본문 바로가기
[Naver Cloud Camp 7] 교육 정리

네이버 클라우드 캠프 90일차 230831

by 우기37 2023. 8. 31.

## 교육정리

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("실행 완료!");
  }
}