-
자바 프로젝트를 Spring으로 만들기(Interface 다시 보기)JAVA/웹 프로그래밍 - Spring 2020. 12. 9. 21:48
아래의 내용에 이어서 진행해보자.
designatedroom87.tistory.com/336?category=909022
프로젝트를 Maven 프로젝트로 변경하기
아래의 내용을 참고해보자. designatedroom87.tistory.com/334?category=909022 Maven 설치 및 설정 우리가 앞에서 서블릿에서 게시판 만들기에서 이미지 업로드 시에 cos.jar파일을 WEB-INF/lib폴더에 추가해..
designatedroom87.tistory.com
우선 일반 자바프로젝트를 생성하고 프로젝트 이름을 spring이라 하자.
spring으로 변환하기 전에 우선 DI에 대해서 알아야 한다.
즉, 이는 자바 문법에서 '인터페이스'에 대해 알아야 한다.
인터페이스의 예제를 살펴보자.
src폴더의 하위로 data라는 패키지를 생성하고 아래의 4개의 파일을 추가하자.
GridPrint.java0.00MBInlinePrint.java0.00MBPrint.java0.00MBSungjuk.java0.00MB그리고 다시 src폴더의 하위에 db라는 패키지를 하나 만들자.
그리고 아래의 5개의 파일을 추가하자.
DB.java0.00MBDbCom.java0.00MBDbCom1.java0.00MBDbCom2.java0.00MBDbUser.java0.00MB그리고 마지막으로 src폴더의 하위에 main이라는 패키지를 만들자.
그리고 이 패키지에 Main이라는 이름의 클래스 파일을 하나 만들자.
아래의 Main.java 파일은 data패키지의 내용에 대한 실행할 main함수가 들어 있는 파일이다.
Main.java
더보기package main; import data.GridPrint; import data.InlinePrint; import data.Print; import data.Sungjuk; public class Main { public static void main(String[] args) { Sungjuk data = new Sungjuk(20,30,50); // data // 위의 성적 데이터를 사용할 예정 Print p = new GridPrint(); p.setSungjuk(data); p.print(); System.out.printf("\n\n\n"); p = new InlinePrint(); p.setSungjuk(data); p.print(); } }
Main.java에서 실행한 결과와 db.DbUser.java에서 실행한 결과를 잘 관찰하도록 하자.
아래는 프로젝트에서의 계층 구조이다.
자바 프로젝트를 Maven Project로 변경하자. spring을 만들었어도 메이븐을 포함해야 한다.
( pom.xml을 이용한다는 의미이다. )
이미 변경하는 방법은 앞에서 알고 있으리라 생각한다.
설정은 default 상태로 두고 Finish를 선택한다.
그러면 프로젝트 내에 pom.xml파일이 생긴 것을 볼 수 있다.
pom파일에서 변경할 점이 있다. 우선 버전 업데이트를 해야 한다.
release부분을 지우고 아래의 내용으로 대체한다. 그리고 업데이트를 반드시 해야 한다.
<configuration>
<source>1.8</source>
<target>1.8</target></configuration>
아래는 변경한 pom 파일의 전체 내용이다.
pom.xml
더보기<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>spring</groupId> <artifactId>spring</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project>
그리고 반드시 업데이트를 해야한다.
아래와 같이 버전이 바뀐 것을 알 수 있다.
스프링 라이브러리를 다운받아야 한다.
포탈 사이트에 maven repository spring framework 입력하자.
아래는 직접 사이트 주소이다.
mvnrepository.com/artifact/org.springframework
Maven Repository: org.springframework
Spring AOP Last Release on Nov 10, 2020
mvnrepository.com
사이트에 접속하면, 검색어로 spring framework 입력하자.
Spring Framework를 클릭하자.
버전을 선택해야 하는데, 가장 많이 사용한 버전인 2.5.6버전을 선택하자.
그러면 아래의 dependency 태그를 복사하자.
아래의 문장이 복사한 내용이다.
<!-- https://mvnrepository.com/artifact/org.springframework/spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> <version>2.5.6</version> </dependency>
그리고 다시 pom.xml을 열자.
이 내용을 붙여 넣어야 한다. dependencies 태그를 적고 이 태그 내에 붙여넣으면 된다.
태그를 붙여 넣으면 pom.xml의 전체 내용은 아래와 같다.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>spring</groupId> <artifactId>spring</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework/spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> <version>2.5.6</version> </dependency> </dependencies> </project>
그리고 반드시 업데이트 프로젝트를 하자.
현재 프로젝트 폴더의 하위 폴더인 Maven Dependencies 폴더를 아래로 내리면 spring.jar파일을 볼 수 있다.
만약, 설치 시에 문제가 발생한다면, C드라이브의 사용자/admin폴더로 이동한다.
우선 이클립스를 닫는다.
.m2/repository 폴더 내에 들어와서 내용을 모두 지우자. (repository폴더는 지우면 안 된다.)
그리고,
.eclipse폴더 내의 내용을 모두 지우고 이클립스를 다시 열자.
그리고 src/main 패키지에 setting이라는이름의 xml파일을 만든다. 아래의 내용을 복사해서 붙여넣자.
우리가 작업할 내용의 프로젝트 하위의 폴더 간의 계층구조는 아래와 같다.
아래의 setting.xml의 bean은 객체를 의미한다.
setting.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.xsd"> </beans>
그리고 src/main 패키지에 DiMain 클래스 파일을 만든다.
DiMain.java
package main; public class DiMain { public static void main(String[] args) { // TODO Auto-generated method stub } }
기존의 내용을 DI로 고쳐보자. setting.xml 파일에서 전부 설정하면 된다.
bean을 만드는 설정 파일이 setting.xml 파일이다. bean을 이용하면 객체를 생성할 수 있다.
property는 set함수를 이용해서 데이터를 주입한다.
setting.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.xsd"> <!-- Sungjuk이라는 클래스를 알려준다. id는 생성한 객체 이름 --> <!-- Sungjuk data = new Sungjuk(20,30,50); --> <bean class="data.Sungjuk" id="data"> <!-- name은 클래스의 변수명이고 value는 이 변수명에 대한 값이다.--> <property name="kor" value="20"></property> <property name="eng" value="30"></property> <property name="math" value="50"></property> </bean> <!-- InlinePrint이라는 클래스를 알려준다. id는 생성한 객체 이름 --> <!-- Print p = new InlinePrint(); --> <bean class="data.InlinePrint" id="p"> </bean> </beans>
src폴더에 stud 패키지를 만들자.
먼저, Student.java파일에서 클래스를 보고,
그 다음에 StudentInfo.java로 이동해서 클래스를 보자.
그리고 마지막으로 StudentMain.java를 보자. 마지막으로 config.xml 파일을 보자.
config.xml0.00MBStudent.java0.00MBStudentInfo.java0.00MBStudentMain.java0.00MB그리고 StudentMain.java파일을 실행하자.
아래의 내용은 StudentMain.java에 있는 내용이다.
ApplicationContext 는 프로그램에서 내용물을 가지고 오는 역할을 한다.
config.xml을 분석해보자.
객체를 단순히 생성하려면 한 줄에 끝낼 수 있지만,
만약 생성자에 매개변수가 있는 경우라면 데이터를 주입해줘야 한다. (Data Injection)
이 경우에는 contructor-arg 태그를 이용하면 된다. arg의 풀네임은 argument이다.
위에서 id는 객체의 이름이 "student"임을 의미하고, class는 생성할 객체의 클래스명이다.
클래스는 stud패키지의 Student에 있다.
그리고 생성자를 호출하기 위해서는 <constructor-arg> 태그를 이용한다.
Student 클래스의 생성자의 매개변수는 3개이므로, 3개를 전달하면 된다.
그리고 index는 생성자에서의 매개변수들의 순서이다. 위와 같이 순서가 존재하면 문장의 위치가 바뀌어도 문제 없다.
즉, 아래와 같이 적고 컴파일 해도 괜찮다.
아래는 매개변수를 StudentInfo 객체 변수에 저장하는 내용으로, 저장할 데이터(매개변수)는 student로 객체이다.
위에서 id는 객체의 이름이 "info"임을 의미하고, class는 생성할 객체의 클래스명이다.
클래스는 stud패키지의 StudentInfo에 있다.
그리고 property는 set 함수(데이터 저장하는 함수)임을 의미한다.
name이 저장할 함수의 이름이며, ref는 저장할 데이터가 객체임을 의미한다.
그리고 src폴더에 tv 패키지를 생성하자.
config.xml0.00MBLGSpeaker.java0.00MBLgTV.java0.00MBSamsungTV.java0.00MBSpeaker.java0.00MBTV.java0.00MBTVUser.java0.00MB처음에 TV.java 파일에서 interface를 먼저 보자.
그리고 나서 이 인터페이스를 상속하는 LgTV.java와 SamsungTV.java를 분석하자.
그리고 Speaker.java 파일에서 interface를 보자.
이 인터페이스를 상속하는 LGSpeaker.java를 보자.
TVUser.java는 main함수가 있는 파일이다.
그리고 설정파일의 내용은 config.xml 이다. config.xml 파일을 분석해보자.
config.xml에서는 Speaker와 TV를 객체화 시키지 않아야 한다.
그 이유는 인터페이스이기 때문이다. 인터페이스에 정의된 메소드는 모두 추상 메소드이므로
이 추상 메소드가 정의된 클래스는 인스턴스화(객체화) 할 수 없다.
그래서 아래와 같이 주석을 한 이유이다.
아래에서 이름이 lgspeaker인 LGSpeaker 클래스를 객체화하는 부분이고
그리고 LgTV클래스의 생성자는 매개변수가 있는 생성자를 호출하고 있음을 볼 수 있다.
생성자의 매개변수는 객체이므로 ref를 썼다. 생성한 객체의 이름은 lgtv이다.
아래는 클래스 명 SamsungTV를 객체화 하려는 내용으로 객체명은 samsungtv이다.
생성자는 매개변수가 없는 기본 생성자를 호출한 후에 property태그를 이용해서
아래의 SamsungTV클래스의 메소드인 아래의 set메소드가 호출된다.
property의 name이 아래의 set메소드임을 나타내는 것이며, 이 때 메소드의 매개변수는 lgspeaker임을 의미한다.
lgspeaker의 자료형은 LGSpeaker 클래스이며, 이는 Speaker 클래스를 상속받으므로 매개변수로 전달 가능하다.
(상속 구조에서 부모가 자식을 가르킬 수 있다.)
위의 xml 설정으로 미루어 보아, samsungtv객체에는 LGSpeaker의 기능이 동작하리라 예측할 수 있다.
아래는 TVUser.java파일의 내용으로 실행할 main함수가 있는 파일이다.
위의 xml 설정의 의해서, 아래의 tv객체는 SamsungTV클래스의 객체를 가리킨다.
volumeUp&Down메소드는 LGSpeaker 클래스의 메소드가 호출됨을 알 수 있다.
이번에 객체 생성을 배열로 이용해보자.
main패키지의 DiMain.java에서 한다. ArrayList를 활용한다.
이를 setting.xml에서 작업하자.
우선, data/Sungjuk.java에서 toString함수를 Override를 해서 구현한다.
setting.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" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"> <!-- xmlns:p="http://www.springframework.org/schema/p" 위의 문장은 namespace를 추가하는 내용이다. --> <!-- xmlns:util="http://www.springframework.org/schema/util" 위의 문장은 namespace를 추가하는 내용이다. --> <bean class="data.Sungjuk" id="data"> <property name="kor" value="20"></property> <property name="eng" value="30"></property> <property name="math" value="50"></property> </bean> <bean class="data.GridPrint" id="p"> <property name="sungjuk" ref="data"></property> </bean> <!-- ArrayList 객체를 생성할 때, 생성자에 Sungjuk 객체를 담는다. new ArrayList<Sungjuk>( new Sungjuk(20,20,20), new Sungjuk(30,30,30), new Sungjuk(40,40,40) data ); --> <bean id="lists" class="java.util.ArrayList"> <constructor-arg> <list> <bean class="data.Sungjuk" p:kor="20" p:eng="20" p:math="20"/> <bean class="data.Sungjuk" p:kor="30" p:eng="30" p:math="30"/> <bean class="data.Sungjuk" p:kor="40" p:eng="40" p:math="40"/> <ref bean="data"/> </list> </constructor-arg> </bean> <util:list id="lists2"> <bean class="data.Sungjuk" p:kor="10" p:eng="20" p:math="20"/> <bean class="data.Sungjuk" p:kor="10" p:eng="30" p:math="30"/> <bean class="data.Sungjuk" p:kor="10" p:eng="40" p:math="40"/> </util:list> <!-- 정수형이 아닌, 문자열로 저장이 된다. --> <util:list id="lists3"> <value>10</value> <value>20</value> <value>30</value> <value>40</value> </util:list> </beans>
DiMain.java
더보기package main; import java.util.ArrayList; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import data.InlinePrint; import data.Print; import data.Sungjuk; public class DiMain { public static void main(String[] args) { /* Sungjuk data = new Sungjuk(20,30,50); // data // 위의 성적 데이터를 사용할 예정 Print p = new InlinePrint(); p.setSungjuk(data); p.print(); */ /* Print p = ? p.print(); */ ApplicationContext context = new ClassPathXmlApplicationContext("main/setting.xml"); Print p = (Print) context.getBean("p"); // setting.xml에서 id가 "p"인 객체를 가지고 온다. p.print(); // List<> lists = new ArrayList<>(); // lists.add(); lists.get(); List<Sungjuk> sungjuks = (ArrayList<Sungjuk>) context.getBean("lists2"); for (Sungjuk sungjuk : sungjuks) System.out.println(sungjuk.toString()); List<String> stringlists = (ArrayList<String>) context.getBean("lists3"); for (String stringlist : stringlists) { System.out.println(stringlist.toString()); System.out.println(Integer.parseInt(stringlist)); } } }
데이터 주입에 Autowired 키워드를 사용할수 있다.
Autowired는 주입에 관한 설정이다.
property와 constructor-arg 태그 없이 주입이 가능하다.tv패키지로 이동해서 LgTV.java의 생성자에 오토와이어드 키워드를 하나 붙인다.(어노테이션)
LgTV.java
tv패키지의 config.xml로 이동하자.
xmlns:context="http://www.springframework.org/schema/context" 를 추가하고
<context:annotation-config /> 추가한다.
그리고 기존의 LgTV의 constructor 주석처리를 한다.
config.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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd"> <context:annotation-config /> <!-- tv.Speaker는 Interface <bean class="tv.Speaker" id="speaker"></bean> tv.TV는 Interface <bean class="tv.TV" id="tv"></bean> --> <!-- new LGSpeaker() --> <bean class="tv.LGSpeaker" id="lgspeaker"></bean> <!-- new LgTV(Speaker speaker) --> <bean class="tv.LgTV" id="lgtv"> <!-- <constructor-arg ref="lgspeaker"></constructor-arg> --> </bean> <!-- new SamsungTV(); setSpeaker(Speaker speaker); --> <bean class="tv.SamsungTV" id="samsungtv"> <property name="speaker" ref="lgspeaker"></property> </bean> </beans>
tv패키지의 TVUser.java 파일의 메인 함수에서 LgTV를 실행한다.
TVUser.java
실행하면 에러가 있다 이것은 나중에 하자.
우선 pom.xml에서 설정을 수정하도록 한다. 아래의 기존의 내용은 지우자.
2.5.6대의 스프링 프레임 워크는 버전 상의 문제로 에러가 나는 경우가 있다.
내용을 지우는 이유는 낮은 버전이라서 나중에 에러가 뜨는 요인이 되기도 한다.
아래는 pom.xml 의 전체 내용이다.
그리고 현재의 프로젝트를 Project Update를 하자.
더보기<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>spring</groupId> <artifactId>spring</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.2</version> </dependency> </dependencies> </project>
우리가 위에서 값을 주입하는 방법은 2가지 방법이 있다.
생성자에서 한 번에 매개변수를 통해 받는 방법과 set함수를 통해 전달 받는 방법이 있다.
여기서 중요한 점은 전달 받을 시에, 매개변수는 일반 변수가 아닌, 객체를 통해 받아야 한다.
즉, int kor, int eng, int math등을 클래스에 정의하면 안 된다.
즉, 위와 같이 쓰고 싶다면 모두 String으로 변경하자. ( 클래스의 필드들 또한 객체로 존재해야 한다. )
tv패키지의 config.xml로 이동하자.
우리의 목표는 bean을 통해서 객체를 생성하는 것이 아니다.
그렇기 때문에 최종 목표는 여기에 있는 내용을 모두 지우는 것이다.
config.xml 의 내용
SamsungSpeaker 클래스는 기존에 없는 클래스인데 밑에서 만든다.
일단 보고 지나가자.
아래의 문장이 반드시 포함되어 있어야 한다.
더보기<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <context:annotation-config /> <context:component-scan base-package="tv" /> <!-- tv.Speaker는 Interface <bean class="tv.Speaker" id="speaker"></bean> tv.TV는 Interface <bean class="tv.TV" id="tv"></bean> --> <!-- new LGSpeaker() --> <!-- <bean class="tv.LGSpeaker" id="lgspeaker"></bean> --> <!-- <bean class="tv.SamsungSpeaker id="samsungspeaker""></bean> --> <!-- <bean class="tv.LgTV" id="lgtv"> <constructor-arg ref="lgspeaker"></constructor-arg> </bean> --> <!-- new SamsungTV(); setSpeaker(Speaker speaker); --> <!-- <bean class="tv.SamsungTV" id="samsungtv"> <property name="speaker" ref="lgspeaker"></property> </bean> --> </beans>
위에서 만들지 않았던, SamsungSpeaker.java 파일을 tv패키지에 정의해보자.
LgTV.java로 이동하자.
LGLGSpeaker.java로 이동하자.
SamsungTV.java로 이동하자.
그리고 실제로 객체가 만들어지는지 확인해보자.
TVUser.java로 이동하자.
아래는 실행결과이다.
TVUser.java에서의 내용을 다음과 같이 변경해서 실행해보자.
아래는 실행결과이다.
이번에는 다시 복습을 해보자.
designatedroom87.tistory.com/338
자바 프로젝트를 Spring으로 만들기(전체 처음부터 다시 보기)
아래의 내용에 이어서 이번에는 다시 처음부터 구현해보도록 하자. designatedroom87.tistory.com/337?category=909022 자바 프로젝트를 Spring으로 만들기(Interface 다시 보기) 아래의 내용에 이어서 진행해보자.
designatedroom87.tistory.com
'JAVA > 웹 프로그래밍 - Spring' 카테고리의 다른 글
Spring MVC2 - 1. 기본 설정 (0) 2020.12.15 Annotation으로 객체(bean)을 생성하기 (0) 2020.12.14 자바 프로젝트를 Spring으로 만들기(전체 처음부터 다시 보기) (0) 2020.12.11 프로젝트를 Maven 프로젝트로 변경하기 (0) 2020.12.08 Maven 설치 및 설정 (0) 2020.12.07