-
4장 SpringFramework vs Java Programming 비교스프링 프레임워크 기초 공부 2020. 4. 26. 14:56
자바 프로젝트 사용
java ee(java enterprise edition)
자바로 구현되는 웹프로그래밍에서 가장 많이 사용되는 JSP, Servlet을 비롯하여, 데이터베이스에 연동하는 JDBC, 그 외에도 JNDI, JTA, EJB 등의 많은 기술들이 포함되어 있습니다.
java se(java standard edition)
자바 표준 에디션은 가장 기본이 되는 에디션입니다.흔히 자바 언어라고 하는 대부분의 패키지가 포함된 에디션이며
주요 패키지로는 java.lang.*, java.io.*, java.util.*, java.awt.*, javax.rmi.*, javax.net.* 등이 있습니다.
자바 프로그램을 개발하기위해선 이클립스 개발 모드를 변경해야한다.
이클립스 상단 오른쪽에 보면 다음과 같은 이미지가 있다 java - ee 모드에서 java 모드로 변경해준다
키워드* java bean:java 에서 사용하는 java bean은 어떠한 데이터를 관리 한다는 목적으로 사용하거나 어떠한 유틸리티 성격을 가지고 있는 메소드를 가지고 있는 클래스를 말함
Java Programming
자바에서 클래스를 만들고 객체를 생성하여 메소드를 출력해보겠습니다.
이때 HelloWorldEn클래스의 이름을 바꿔야 한다면 MainClass에서 참조변수 타입과 new 연산자 뒤 객체를 생성하는부분 그리고 callMethod 메소드의 매개변수 이름 모두 바꿔주어야한다.
위의 결과로 인해 유지보수가 좋지 않다는 점을 알수가 있다.
하지만 이때 다형성을 사용한다면 좀 더 유지보수가 쉽게 변경될수있다
키워드* 다형성:다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다. 키보드의 키를 통해서 비유를 들어보겠다. 키보드의 키를 사용하는 방법은 '누른다'이다. 하지만 똑같은 동작 방법의 키라고 하더라도 ESC는 취소를 ENTER는 실행의 목적을 가지고 있다. 다형성이란 동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다.예로 (오버로딩 오버라이딩이 있다.)
자바에서의 모든 객체는 부모클래스형 참조변수나 구현한 인터페이스 변수에 담을수 있습니다.
다형성을 사용하면 객체를 생성하는 부분과 참조변수명만 교체해주면 된다 (유지보수가 좀 더 편리해집니다.)
하지만 이 객체가 수십개가 있다고 치자 그러면 사람이 객체를 생성하는 부분을 모두 변경해주어야한다.
이런 부분들을 해소하기 위해 spring framework가 탄생하였다.
spring framework
spring framework는 처음 프로젝트 셋팅에 조금 어려운 부분이 있습니다 하지만 셋팅이 완료되면 개발과 유지보수가 매우 편리한 장점을 가지고 있습니다. 실무에서 프로젝트가 시작이 되면 6개월에서 1년이 진행이 될 수 있습니다. 만약 처음 셋팅을 잘 해놓았다면 1~2년동안 굉장히 손쉽게 프로젝트를 진행할 수 있습니다.
spring framework사용은 xml을 이용하는 방법과 자바 어노테이션을 이용하는 방법 두가지로 구분될 수 있습니다.
spring framework는 어떠한 개발도구가 제공된다는 것이 아닌 자바 어플리케이션을 개발할때 스프링 그룹에서 만든 자바 라이브러리를 붙여넣고 그 라이브러리에서 제공되는 클래스를 이용하여 작업을 하는 방식(spring framework를 사용할때 maven이나 gradle을 사용하여 라이브러리를 자동으로 다운로드받아 셋팅함)
키워드*maven이란(pom.xml에 maven프로젝트와 관련된 정보들을 기술함)
1.자바 프로젝트의 빌드를 자동으로 해주는 도구
2.개발자가 xml문서에 작성한 프로젝트 정보를 토대로 컴파일하고 라이브러리를 연결하는 등의 작업을 해주는 도구
maven repository-> maven프로젝트를 위한 라이브러리를 셋팅할수 있는것들 검색가능
개발 모드 변경
프로젝트 생성
new - maven project
maven project를 위한 라이브러리 셋팅
maven repository 접속!
1.spring context (maven dependencies를 보시면 다운로드가 되어 추가된 파일들을 볼 수 있습니다.)
properties 속성을 사용하지 않은 방법
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.25.RELEASE</version> </dependency>
properties 속성을 version에 삽입한 방법
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework-version}</version> </dependency>
xml에서 사용할 속성들을 정의한 부분
<!-- xml에서 사용할 속성들 --> <properties> <!-- 자바 버전 --> <java-version>1.8</java-version> <!-- 스프링 버전(태그의 이름이 속성의 이름이됨) --> <org.springframework-version>4.3.25.RELEASE</org.springframework-version> <!--<org.springframework-version>5.1.9.RELEASE</org.springframework-version> --> <org.slf4j-version>1.7.26</org.slf4j-version> <ch.qos.logback-version>1.2.3</ch.qos.logback-version> </properties>
<org.springframework-version>이라는 속성에 스프링 버전을 정의해놓고 상단의 spring context 의 version에
${org.springframework-version}을 삽입해주면 된다.
이제 객체에 관련된 정보를 자바에 작성하지 않고 xml파일에 작성하겠습니다.
먼저 xml파일을 생성합니다
<?xml version="1.0" encoding="UTF-8"?> <!-- 사용할 namespace정의하는 부분 --> <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.xsd"> </beans>
상단에 namespace를 정의해줍니다.
그후 main클래스에서 해당 xml을 로딩해줍니다.
package kr.co.softcampus.main; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainClass { public static void main(String[] args) { // TODO Auto-generated method stub //beans.xml 파일을 로딩한다. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml"); ctx.close(); } }
다음으로 프로그램 개발이나 운영 시 발생하는 문제점을 추적하거나 운영 상태를 모니터링 하는 정보를 기록하는
로그를 사용하기 위해 pom.xml에 라이브러리를 추가하겠습니다.
이또한 maven repository에서 받으실수 있습니다
<!-- 로그 출력 라이브러리 --> <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j-version}</version> </dependency> <!-- logback --> <!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${ch.qos.logback-version}</version> <!-- logback을 slf4j가 사용할수 있도록 연결해주는부분 --> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> <scope>runtime</scope> </dependency>
이제 환경설정을 끝이 났습니다.
본격적으로 비교에 들어가보도록 하겠습니다.
먼저 java에서의 다형성과 같이 인터페이스를 만든후 클래스가 상속을 받고 객체를 생성해보겠습니다.
springframework에서는 객체를 mainclass에서 하지않고 xml파일에서 하게됩니다.
이제 xml파일을 mainclass에 로딩한후 객체의 주소값을 참조변수에 넣도록 하겠습니다.
package kr.co.softcampus.main; import org.springframework.context.support.ClassPathXmlApplicationContext; import kr.co.softcampus.beans.HelloWorld; public class MainClass { public static void main(String[] args) { // TODO Auto-generated method stub //beans.xml 파일을 로딩한다. ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("kr/co/softcampus/config/beans.xml"); //xml에 정의한 bean 객체의 주소값을 가져온다 HelloWorld hello1 = (HelloWorld)ctx.getBean("hello");//getBean 메소드가 object 타입이다 그래서 HelloWorld로 형변환함 callMethod(hello1); HelloWorld hello2 = ctx.getBean("hello",HelloWorld.class); callMethod(hello2); ctx.close(); } public static void callMethod(HelloWorld hello) { hello.sayHello(); } }
java에서 객체를 생성하여 참조변수에 넣는 방식은 똑같습니다 단 객체의 주소값을 spring은 xml에 생성하고 java는 mainclass에서 생성한다는 차이가 있습니다.
1.먼저 beans.xml을 로딩합니다
2.로딩후 getBean을 사용하여 id가 Hello인 객체의 주소값을 HelloWorld타입의 참조변수에 넣어줍니다
(java에서는 HelloWorld hello1 = new HelloWorldEn();으로 해주었습니다 객체의 주소값을 참조변수에 넣어주는 방식은 일치합니다.)
이때 주소값을 불로와 참조변수에 넣어주는 방법이 2가지 있습니다.
1.HelloWorld hello1 = (HelloWorld)ctx.getBean("hello");
2.HelloWorld hello2 = ctx.getBean("hello",HelloWorld.class);
둘중 원하시는 방법을 활용하시면 됩니다.
3.그후 callMethod를 호출하여 실행합니다.
결과창
HelloWorldEn HI~~~
HelloWorldEn HI~~~
두가지 방법으로 생성된 2개의 인스턴스의 callMethod가 실행된걸 볼 수 있습니다.
이제 HelloWorldEn 클래스를 HelloWorldKo로 바꾸어보겠습니다.
먼저 HelloWorld 인터페이스를 상속받는 HelloWorldKo 클래스를 만들어줍니다.
package kr.co.softcampus.beans; public class HelloWorldKo implements HelloWorld{ @Override public void sayHello() { // TODO Auto-generated method stub System.out.println("HelloWorldKo HI~~~"); } }
그 후
<?xml version="1.0" encoding="UTF-8"?> <!-- 사용할 namespace정의하는 부분 --> <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.xsd"> <bean id='hello' class = 'kr.co.softcampus.beans.HelloWorldKo'/> <!-- <bean id='hello' class = 'kr.co.softcampus.beans.HelloWorldEo'/> --> <!-- 주석 키워드 ctrl+ shift+ /,\ --> </beans>
xml폴더에서 class = 'kr.co.softcampus.beans.HelloWorldEn'
에서 class = 'kr.co.softcampus.beans.HelloWorldKo'
로 수정해주시면 끝이 납니다 mainclass에서 아무런 수정없이 클래스가 교체된걸 볼 수 있습니다.
결과물
HelloWorldKo HI~~~
HelloWorldKo HI~~~springframework는 객체를 xml파일에 생성하여 mainclass에서는 객체의 주소값을 참조변수에 삽입하는 역활만 하기때문에 유지보수가 매우 편리한것을 느낄 수 있습니다.
'스프링 프레임워크 기초 공부' 카테고리의 다른 글
7장 di 생성자를 이용한 주입 (0) 2020.04.27 6장 bean 객체 생성하기 (0) 2020.04.26 5장 ioc컨테이너 (0) 2020.04.26 3장 개발 환경 구축 (0) 2020.04.26 1장,2장 spring framework 소개 (0) 2020.04.26