1. 프레임워크 - 뼈대를 이루는 코드들의 묶음
- 프레임워크란 기본 뼈대이다 . 자동차를 만들 때 뼈대를 구현한 다음 만든다
- 프레임워크는 방향성을 제시하고 원하는 기능을 빠르게 만들 수 있게 함
- 스프링 프레임워크는 주요기능으로 DI, AOP, MVC, JDBC 등을 제공한다
- 모듈: 라이브러리, 프레임워크 안에 미리 만들어져 있는 기능
2. 스프링 컨테이너 - 스프링에서 객체를 생성하고 조립하는 컨테이너로 컨테이너를 통해 생성된 객체를 빈이라고 부른다.
1) 객체 생성 및 속성 데이터 작성
2) 스프링 컨테이너에서 객체 생성 및 조립
3) 애플리케이션 구현
3. 구축(강의 교안 2강 참고)
- 위 상단 project에서 spring tool 4 version 선택해서 아래로 내려가면 위 사진 나옴
- Spring Tool suite 3 - 3 wiki 선택 하고 2~3번째 사진 체크 표시 다운로드
---------------------------------------------------------------------------------------------------------------------------------------------------
* jvm is not suitable for the product version : 11 or greater is required 오류 떴을 때
- 폴더에 버전 2개가 깔려 있으면 인식을 못하기 때문에 밑에 11버전 두고 모두 지울 것
---------------------------------------------------------------------------------------------------------------------------------------------------
4. 실행
- 설치가 완료 되면 encoding utf-8로 모두 설정해줄 것
1) maven project 생성
- pom.xml: 라이브러리를 지정된 형태로 기술하면 다운로드 받을 수 있음(강의 교안 1강_pom에서 스프링 받기 txt 참고해서 pop.xml <version>0.0.1-SNAPSHOT</version> 아래에 넣어줄 것)
- dependency: 필요한 라이브러리를 원격에서 받을 때 작성되는 이름
- build: maven이 필요한 소스코드들을 어느 버전으로 컴파일 시키고 어떻게 쓰는지에 대한 설명(maven 설정)
- <source>11</source>, <target>11</target>로 변경
<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>com.simple</groupId>
<artifactId>SpringDI</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
- maven: 원격에 있는 필요한 모듈을 다운로드 해주는 플랫폼(중간에서 필요한거 내려받아서 이 프로젝트에 바로 사용을 할 수 있게끔 제공해주는 플랫폼)
- 프로젝트 우클릭 - 빌드패스 - configu~에서 build path 들어가서 라이브러리에서 밑에 있는 첫번째 사진 블럭 더블 클릭 - java se11버전으로 변경 - 다시 프로젝트 우클릭 maven에서 업데이트 프로젝트(alt+f5) 선택해서 선택하면 에러 사라짐(maven 바뀐 것을 프로젝트에 반영하겠다는 뜻)
- src/main/java에는 패키지에 클래스 생성
* SpringTest
package ex01;
public class SpringTest {
public void test() {
System.out.println("스프링 bean 사용해보기");
}
}
* MainClass
package ex01;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("application-context.xml");
SpringTest bean = ctx.getBean(SpringTest.class);
bean.test();
}
}
* application-context.xml
- src/ main/resources - spring bean configuration file 생성하면 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">
<!-- 스프링 빈 설정 파일-->
<bean id = "test" class ="ex01.SpringTest"/>
</beans>
1) Spring DI/IoC
- JAVA의 Class 상속 / Interface 를 이용한 추상화를 기반으로 하는 개발 방법
- Spring은 아래 DI/ IoC 를 강력하게 지원하는 프레임워크
* IoC: Inversion of Control
- 프로그램을 제어하는 패턴 중 하나
- DI는 IoC 패턴의 구현방법 중 하나
- DI에 따라 프로그램의 흐름이 완전히 변경됨
- Application-context: 스프링이 동작하는데 필요한 다양한 객체들이 200가지 정도 만들어져 있습니다.
- bean은 xml파일에 정의를 합니다.
* DI : Dependency Injection
- 스프링 Container 에 만들어둔 각종 클래스 ( 들은 서로 의존적이다
- A객체가 B 객체 없이 동작이 불가능한 상황
- 스프링은 DI 를 기준으로 많은 프레임워크 모듈들이 만들어짐
- Spring은 DI Framework 혹은 IoC Framework 라고 부름
+ 마지막 사진 추가 설명
- 생성자를 통한 의존성 주입: ref(bean의 아이디가 들어감)
- setter를 통한 의존성 주입: name은 set을 제외한 이름이 들어감(이름은 멤버변수 명이랑 같음), ref는 객체 타입을 주입할 수 있다.
* 예제(hotel, chef)
<?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">
<!-- 스프링 빈 설정 파일-->
<bean id = "test" class ="ex01.SpringTest"/>
<!-- 생성자를 통한 주입 -->
<bean id="chef" class="ex02.Chef" />
<bean id="hotel" class="ex02.Hotel" >
<constructor-arg ref="chef"/>
</bean>
<!-- 세터를 통한 주입 -->
<bean id="dev" class="ex02.DatabaseDev">
<!-- DatabaseDev는 문자열, 비어 있으므로 property로 넣어줌 -->
<property name="url" value="데이터베이스 주소" />
<property name="uid" value="데이터베이스 계정명" />
<property name="upw" value="데이터베이스 비밀번호" />
</bean>
<bean id="dao" class="ex02.MemberDAO">
<property name="databaseDev" ref="dev"/>
</bean>
</beans>
package ex02;
public class Hotel {
//hotel 객체가 chef 객체를 사용하고 있는 경우에는 hotel 객체가 chef 객체에 의존성이 있다고 표현함.
//멤버변수
private Chef chef;
//생성자-construct
public Hotel(Chef chef) {
this.chef = chef;
}
//getter
public Chef getChef() {
return chef;
}
}
package ex02;
public class Chef {
public void cooking() {
System.out.println("요리하기 기능");
}
}
* databaseDev, MemberDAO, MainClass, application-context.xml
package ex02;
public class DatabaseDev {
private String url;
private String uid;
private String upw;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getUpw() {
return upw;
}
public void setUpw(String upw) {
this.upw = upw;
}
}
package ex02;
public class MemberDAO {
private DatabaseDev databaseDev;
//get
public DatabaseDev getDatabaseDev() {
return databaseDev;
}
//set
public void setDatabaseDev(DatabaseDev databaseDev) {
this.databaseDev = databaseDev;
}
}
package ex02;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("application-context.xml");
//호텔 안에 있는 get을 통해 cooking 메서드 실행
//생성자를 통한 주입 확인
// Hotel hotel = ctx.getBean(Hotel.class);
// hotel.getChef().cooking();
// new Hotel(new Chef()); //원래는 이렇게 만들어야 하는데 위와 같이 xml에서는 의존성 주입
//세터를 통한 주입 확인
MemberDAO dao = ctx.getBean("dao", MemberDAO.class);
DatabaseDev dev= dao.getDatabaseDev();
System.out.println(dev.getUid());
System.out.println(dev.getUrl());
System.out.println(dev.getUpw());
}
}
<?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">
<!-- 스프링 빈 설정 파일-->
<bean id = "test" class ="ex01.SpringTest"/>
<!-- 생성자를 통한 주입 -->
<bean id="chef" class="ex02.Chef" />
<bean id="hotel" class="ex02.Hotel" >
<constructor-arg ref="chef"/>
</bean>
<!-- 세터를 통한 주입 -->
<bean id="dev" class="ex02.DatabaseDev">
<!-- DatabaseDev는 문자열, 비어 있으므로 property로 넣어줌 -->
<property name="url" value="데이터베이스 주소" />
<property name="uid" value="데이터베이스 계정명" />
<property name="upw" value="데이터베이스 비밀번호" />
</bean>
<bean id="dao" class="ex02.MemberDAO">
<property name="databaseDev" ref="dev"/>
</bean>
</beans>
2) singleton
- scope="prototype"이라고 하면 다른 객체로 나옴, 원래 자동으로 singleton으로 생성 됨.
3) list or map의 의존성 주입
* 예제(customer, person, collection-context.xml, MainClass)
package ex03;
import java.util.List;
import java.util.Map;
public class Customer {
//list or map의 의존성 주입
//string을 받는 List
private List<String> lists;
//객체를 받는 List
private List<Person> persons;
//map
private Map<String, Object> maps;
//List<String>의 getter, setter
public List<String> getLists() {
return lists;
}
public void setLists(List<String> lists) {
this.lists = lists;
}
//List<person>의 getter, setter
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
//map의 getter, setter
public Map<String, Object> getMaps() {
return maps;
}
public void setMaps(Map<String, Object> maps) {
this.maps = maps;
}
}
package ex03;
public class Person {
private String name;
private String id;
//getter, setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
<?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">
<!-- list or map의 의존성 주입 -->
<bean id="customer" class="ex03.Customer">
<!--list 안에 person -->
<property name="lists">
<list>
<value>홍길동</value>
<value>이순신</value>
<value>홍길자</value>
</list>
</property>
<!-- list 안에 object -->
<property name="persons">
<list>
<bean class = "ex03.Person">
<property name="name" value="홍길동"></property>
<property name="id" value="aaa123"></property>
</bean>
<bean class = "ex03.Person">
<property name="name" value="홍길자"></property>
<property name="id" value="bbb123"></property>
</bean>
</list>
</property>
<!-- map 안에 object가 들어있는 모형 -->
<property name="maps">
<map>
<entry key="k1" value="문자열"></entry>
<entry key="k2">
<bean class="ex03.Person">
<property name="name" value="홍길자"></property>
<property name="id" value="bbb123"></property>
</bean>
</entry>
</map>
</property>
</bean>
</beans>
package ex03;
import java.util.Map;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("collection-context.xml");
//map 꺼내보기(앞에는 collection-context에서 bean id)
Customer customer = ctx.getBean("customer", Customer.class);
Map<String, Object> maps = customer.getMaps();
System.out.println(maps.toString());
}
}
4) 연습 문제
* mainClass, transpotation-context.xml
package ex04;
import org.springframework.context.support.GenericXmlApplicationContext;
public class MainClass {
public static void main(String[] args) {
//Car, Airplane 빈을 생성하고, 의존성 주입
//각 객체 안에 있는 배터리를 자바클래스에서 출력.
//인터페이스는 모형일 뿐 객체 생성이 안됩니다.
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext("transportation-context.xml");
//예를 들어서 Car.class라는 것은 transportation-context에서
//id값이 car인 class를 가지고 온다는 의미임.
Car car = ctx.getBean(Car.class);
car.getBattery().energy();
ctx.getBean(Airplane.class).getBattery().energy();
}
}
<?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">
<!-- 생성자를 통한 주입 -->
<!-- 배터리는 인터페이스라서 객체 생성이 안되기 때문에 java 파일에서 사용해야함. -->
<!-- 의존 관계니까 배터리를 먼저 만들고, car를 만든다. -->
<!-- spring은 프로그램을 시작하자마자 객체를 만들고 시작하니까 꺼내서 쓸 수 있고,
작성 순서에 영향을 받지 않는다. -->
<!-- 배터리1 객체 생성 -->
<bean id="battery1" class="ex04.Battery1">
</bean>
<!-- car는 battery에 의존한다. -->
<!-- battery1이라는 위에 있는 객체의 id를 ref에 넣어줌 -->
<!-- battery1이라는 배터리를 낀 car를 사용 할거야 -->
<bean id="car" class="ex04.Car">
<constructor-arg ref="battery1" />
</bean>
<!-- 배터리2 객체 생성 -->
<bean id="battery2" class="ex04.Battery2">
</bean>
<!-- airplane은 getter, setter를 통한 주입-->
<bean id="airplane" class ="ex04.Airplane">
<property name="battery" ref="battery2"/>
</bean>
</beans>
'TIL > Spring' 카테고리의 다른 글
day78-spring (0) | 2023.02.06 |
---|---|
day77-spring (0) | 2023.02.03 |
day76-spring (0) | 2023.02.02 |
day75-spring (1) | 2023.02.01 |
day74-spring (0) | 2023.01.31 |