spring방식과 spring이 아닌방식
spring에서는 인터페이스를 사용하지만 spring이 아닌 방식에서는 사용하지 않고 만들어보고 비교해보고자 한다.
spring이 아닌방식으로 객체생성 및 호출
객체를 생성하는 이유는 호출을 하기 위한 목적도 있다.
사용자로 부터 값을 입력받고 출력하고자 하는 클래스인 Message1,Message2를 만들어보면
Message1
package Kim;
//사용자로부터 값을 입력->출력
public class Message1 {
void sayHello(String name) {
System.out.println("안녕하세요"+name+"씨!");
}
}
-----------------------------------------------------
Message2
package Kim;
//사용자로부터 값을 입력->출력
public class Message2 {
void sayHello(String name) {
System.out.println("반가워요!"+name+"님!");
}
}
다음과 같이 만든 후
출력을 할수있는 메인 클래스인 AppMain 클래스에
sayHello()호출하기위해서 message1의 객체를 생성한다.
public class AppMain {
public static void main(String[] args) {
Message1 me=new Message1();
me.sayHello("홍길동");
}
}
걀과= 안녕하세요홍길동씨!
근데 만약 Message1이 아니라 Message2였다면? 그래서 Message2를 호출하여 출력하고싶다면?
public class AppMain {
public static void main(String[] args) {
Message2 me=new Message2();
me.sayHello("홍길동");
}
}
결과= 반가워요홍길동님!
이런식으로 일일히 Massage2로 바꿔줘야한다.
하지만 spring방식은 다르다 어떻게 다른지 정리해보고자
한다.
spring방식
위에 정리한 spring이 아닌 방식은 의존성이 커서 수정하기 위해서는 다른 클래스들도 줄줄이 수정해야한다.
따라서 결합도가 높고 유지보수가 어렵다.
하지만 spring방식은 인터페이스를 사용하며 처리방식을 xml파일로 설정(명세서)하여 xml안에 관련된 클래스 객체를 미리 만들어서 설계해놓고 사용한다.
즉 수정을 하거나 위의 예시같은 변경사항이 있을땐 xml에서만 간단히 수정 가능하다.
MessageInter 라는 인터 페이스를 만들고 이 인터페이스를 상속하는 클래스들을 만든다.
MessageInter
//업무상 필요로하는 클래스를 분석->공통으로 사용할 메서드선언
public interface MessageInter {
void sayHello(String name);//추상메서드
}
---------------------------------------------------------
Message1 (인터페이스(MessageInter)를 상속받은 클래스)
public class Message1 implements MessageInter {
@Override
public void sayHello(String name) {
// TODO Auto-generated method stub
System.out.pr**텍스트**intln("안녕"+name+"씨!");
}
}
--------------------------------------------------------
Message2 (인터페이스(MessageInter)를 상속받은 클래스)
public class Message2 implements MessageInter {
@Override
public void sayHello(String name) {
// TODO Auto-generated method stub
System.out.println("반가위요"+name+"님!");
}
}
spring전용 xml만들기
일반 jsp의 xml과 달리 spring 전용 xml을 만들어서 관련된 클래스 객체를 미리 만들어서 설계한다.
우선 spring 전용 xml 파일을 번전에 맞게 생성하여 안에 객체를 생성하고자 한다. (xml파일이름: applicationContext.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 http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
<!--
개발자가 필요로하는 객체생성 -> jsp자바에서는 => 클래스명 객체명=new 클래스명()
하지만 spring xml에서는
=> 형식) <bean id="객체를 구분하는 인자(객체명(X))
class="패키지명.하위패키지명....생성하고자 하는 클래스명"></bean>
-->
<!-- id는 다 달라야한다-->
<bean id="test" class="spring.Message1" /> <!-- 내용이 없기에 </bean>은 생략가능 -->
<bean id="test2" class="spring.Message2" />
</beans>
이제 출력이 가능한 메인페이지를 HelloApp이라는 이름으로 만들면
(단 라이브러리 파일들은 미리 다운 받아놓는다.)
1.xml파일의 위치를 불러와야 한다. (절대경로,상대경로)
절대경로를 사용한다면 라이브러리 안에 내장되있는 FileSystemResource 을 사용한다.
=>Resource resource=new FileSystemResource
("C:\webtest\4.jsp\sou\SpringTest\src\spring\applicationContext.xml");
상대경로를 사용한다면 라이브러리 안에 내장되있는 ClassPathResource 을 사용한다.
=>Resource resource=new ClassPathResource
("/spring/applicationContext.xml");
여기서는 상대경로를 사용하고자 한다.
2.빈즈공장을 불러와서 객체를 얻어오기 (xml파일의 정보->메모리에 저장)
BeanFactory은 꺼내올수있는 역할을 하는 인터페이스로 이를 사용한다.
=>BeanFactory factory=new XmlBeanFactory(resource);
3.factory에서 불러오기
getBean("불러올 객체를 가져올 id값")
기존 자바방식으로는 Message1 me=new Message1(); 이렇게 하지만 spring에서는 다르다
Message1 me=(Message1)factory.getBean("test");
=>id가 test인 객체를 미리 만든 xml에서 찾아서 불러온다.
만약 test2, Message2로 바꾸면 그거에 맞게 찾아서 불러온다.
하지만 이렇게 1또는2로 일일히 바꿔준다면 spring방식을 사용하지 않은거랑 차이가없어 보인다
따라서 Message1,2 대신 Message1,2의 부모인 MessageInter를 적용한다.
=>MessageInter me=(MessageInter)factory.getBean("test2");
=>xml파일도 미리 만들어 놓은 둘중 하나를 지우고
bean id="test2" class="spring.Message1" 만 남긴다.
이렇게 하면 이쪽의 소스코드를 안건들고 xml의 class만 바꿔주면 자동으로 변화되고 적용된다.
내가 원하는데로 바꾸고싶을때 일일히 안바꾸고 간편히 바꿀수있다.
따라서 총 종합
Message1.java
public class Message1 implements MessageInter {
@Override
public void sayHello(String name) {
// TODO Auto-generated method stub
System.out.println("안녕"+name+"씨!");
}
}
----------------------------------------------------------
Message2.java
public class Message2 implements MessageInter {
@Override
public void sayHello(String name) {
// TODO Auto-generated method stub
System.out.println("반가위요"+name+"님!");
}
}
-------------------------------------------------------------
applicationContext.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 http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
<!--
개발자가 필요로하는 객체생성 -> 클래스명 객체명=new 클래스명() <=자바에서
형식) <bean id="객체를 구분하는 인자(객체명(X))
class="패키지명.하위패키지명....생성하고자 하는 클래스명"></bean>
-->
<!-- <bean id="test" class="spring.Message1" /> --> <!-- 내용이 없기에 </bean>은 생략가능 -->
<bean id="test2" class="spring.Message1" />
</beans>
------------------------------------------------------------------
HelloApp.java
package spring;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource; // 이 import들은 아까 만든 라이브러리에서 불러옴
//스프링 방식=>객체를 생성->메서드를 호출
//->처리방식을 xml파일로 설정(명세서) //xml안에 관련된 클래스 객체를 미리 만들어서 설계해놓고 사용한다
public class HelloApp {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1.xml파일의 위치를 불러오는 방법->절대경로(FileSystemResource)
/*
Resource resource=new FileSystemResource
("C:\\webtest\\4.jsp\\sou\\SpringTest\\src\\spring\\applicationContext.xml"); //절대경로
*/
Resource resource=new ClassPathResource
("/spring/applicationContext.xml");//상대경로
//2.빈즈공장을 불러와서 객체를 얻어오기 //xml파일의 정보->메모리에 저장
BeanFactory factory=new XmlBeanFactory(resource);//BeanFactory =>꺼내올수있는 역할을 하는 인터페이스
//3.factory에서 getBean("불러올 객체를 가져올 id값")
//Message1 me=new Message1(); <= 기존 자바방식
//Message1 me=(Message1)factory.getBean("test"); // id가 test인 객체를 미리 만든 xml에서 찾아서 불러온다, // test2, Message2로 바꾸면 그거에 맞게 불러온다
//이렇게 일일히 바꿔준다면(1 또는 2로) spring방식을 사용하지 않은거랑 차이가없어보인다 따라서
MessageInter me=(MessageInter)factory.getBean("test2"); // Message1,2의 부모인 MessageInter
me.sayHello("테스트"); // 이렇게 하면 여기의 소스코드를 안건들고 xml의 class만 바꿔주면 자동으로 변화되고 적용된다(내가 원하는데로 바꾸고싶을때 일일히 안바꾸고 간편히 바꿀수있다.)
}
}
2022-08-17