🐢 꼬부기 LV.1 | 개념•기초/💧물대포(핵심개념)

Spring 프레임워크 기초 사용과 에러 발생 해결

서화 2026. 1. 13. 23:17

BeanFactory 와 인터페이스를 사용하여 다형성과 디자인 패턴 복습

지난번에 인터페이스 연습했던 자판기로 복습해보려고한다

public class client {

	public static void main(String[] args) {
		
		BeanFactory factory = new BeanFactory();//새로운 객체저장소 만들기
		Vending vending = (Vending)factory.getBean("사이다");
		//빈에 저장된 호출 하기위해 문자열로 이름 지정 = 빈팩토리에서 수행
		
		vending.insertMoney(); // 자판기에 넣은 돈
		vending.selectMenu();  // 고른 음료
		vending.outputDrink(); // 자판기에서 음료 나감
		vending.returnMoney(); // 잔돈 거스르기

	}
}

클라이언트 실행후 나오는 콘솔화면으로 빈 팩토리를 사용하여 문자열만 변경하여 원하는 값을 출력할수 있다

이미 각 음료파일에는 인터페이스가 상속이 되어있는 상태에서 디자인 패턴만 연결한 상태라 가능했다

BeanFactory에 두가지의 음료를 지정해 문자열로 입력 받아서 객체이름으로 반환할수 있게 설정해두었다

public class BeanFactory {
	public Object getBean(String beanName) {
		//인자로 문자열을 받고 반환값으로 객체 이름을 반환한다
		if(beanName.equals("콜라")) {
			return new Coke();
		}
		else if(beanName.equals("사이다")) {
			return new Soda();
		}
		return null;
	}

}
//문자열만 바꿔 원하는값을 출력하기 위한 객체들을 담아서 관리한다

클라이언트에서 지정되있지 않은 환타를 넣어보았을때 생긴 문제이다 

이문제는  주어가 없어서 생긴 문제로 해당음료파일을 만들고 빈팩토리에 추가해주면 문제없이 잘나올것이다

원하는 값을 출력할때 다른 방법을 사용할수도 있다 바로 메인에 있는 문자열 배열을 이용해 출력하는 방법이다

public class client {

	public static void main(String[] args) {
		
		BeanFactory factory = new BeanFactory();//새로운 객체저장소 만들기
		Vending vending = (Vending)factory.getBean(args[0]);
        //런 컨피큐레이션 사용하여 문자열 배열 형태로 지정할수 있음

실행 버튼옆 화살표를 눌러 RUN Configurations를 실행시킨다음 Arguments에서 문자열 순서대로 적어주고 Run을 누르면 배열의 형태에서 값을 출력할수 있다

현재 배열의 인덱스의 0번인 콜라가 콘솔에 출력되었다

스프링 프레임 워크 예제 맛보기

위에서 사용했던 코드를 그대로 test04 패키지로 가져온다

스프링 컨테이너를 동작시키기 위해

//1.스프링 컨테이너를 동작시킴
AbstractApplicationContext factory = new GenericXmlApplicationContext("");

해당 코드를 추가해준다

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

스프링 프레임워크 사용을 위해 가져와야한다

실행을 시키면 아래의 사진에 보이는 에러가 뜬다

Spring 컨테이너가 XML 설정 파일 자체를 정상적인 XML로 읽지 못했다는 에러이다

스프링 컨테이너가 동작하기 위해서 xml 설정파일이 필요하다 현재 코드에는 xml부분이 비어있기 때문에 이부분에 xml 파일이름을 추가해주었다

AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");

xml 파일의 이름을 넣고 실행을 시키면 이런 에러가 발생한다

이 에러는 이 에러는 Spring이 XML 설정 파일을 찾지 못했거나, 찾았더라도 읽을 수 없을 때 발생한다. 현재 xml 파일을 만들지 않고 실행했기때문에 못찾는게 당연한다

이제 "applicationContext.xml" 설정파일을 만들러 가보겠다 

파일 만들때 빨간줄이 뜬다면 윈도우 → 프리퍼런스 →XML(와일드 웹 디벨로퍼)에서 항목을 모두 체크하면 빨간줄이 사라진다

이렇게 xml 파일을 만들고 실행하면

이런 에러를 만날수 있다 이 에러는 Spring 컨테이너에 해당 이름(id)의 Bean 정의가 존재하지 않는다는 에러다

여기서 스프링 컨테이너의 동작순서를 보고 가자면

  1. 클라언트가 스프링 컨테이너의 설정파일을 로드
  2. 스프링 컨테이너 동작
  3. 객체 요청 = 룩업
  4. 객체반환 → 사용 → 종료

의 흐름으로 진행된다

지금 문제는 3번 빈에 요청할 객체가 .xml파일에 없기때문에 발생했다 이 에러를 해결하기 위해 .xml에 빈클래스를 설정해보겟다  

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

   

</beans>

빈은 클래스와 아이디를 가지고 있어서 원하는것을 지정할수 있다 

//빈 클래스와 아이디를 지정
<bean class="test04.Coke" id="coca" />
<bean class="test04.Soda" id="sevenstar" />

.xml설정을 마치고 나서 클라이언트에서 객체를 요청하면

Vending vending = (Vending)factory.getBean("coca");
//2.LooKup = 스프링 컨테이너에게 객체를 요청함

문제 없이 잘 출력 되는것을 볼수있다

그러나 콘솔에서 콜라와 사이다 각각의 객체가 생성된것을 볼수 있는데 여기서 xml의 구동 방식에 대해서 살펴볼 필요가 있다

xml은 프리로딩 방식으로 즉시 로딩이라고도 하는데 일단 실행되면 객체 사용 여부에 상관없이 일단 만들고 기다린다

그래서 콜라객체 사이다객체가 둘다 콘솔에 출력된것이다 따라서 굳이 사용할 필요가 없을 때는 즉시로딩을 해제하는 방식을 사용할수 있는데 

<bean class="test04.Soda" id="sevenstar" lazy init=true/>

즉시로딩을 해제하면 이렇게 콜라객체 생성만 출력된다 사이다를 출력하고 싶다면 객체요청을 사이다로 변경하면 그때 xml파일이 실행된다

여기서 변수명을 다르게 객체를 요청해도 객체는 한번만 생성되는데 이는 스프링 컨테이너가 싱글톤을 유지하고 있기 때문이다

Vending vending = (Vending)factory.getBean("coca");
Vending vending1 = (Vending) factory.getBean("coca");
Vending vending2 = (Vending) factory.getBean("coca");

xml 설정파일에 스코프를 프로토타입으로 주면 

<bean class="test04.Coke" id="coca" scope="prototype"/>

요청한 만큼 객체를 생성한다

스프링 컨테너를 닫을 때는 클로즈 넣어주고 종료한다 

//3.스프링 컨테이너 종료
factory.close();