새로 이클립스를 세팅했으니 인코딩을 utf8으로 통일하자!

 

 


Spring Framework

- 새로운 무언가를 만들어내는 기술이 아님.

- 기존에 만들던 게시판 회원가입 쇼핑몰 등등의 기능을 더 "잘 만들자"

- 잘 만들자의 핵심 키워드는 유지보수.

 

- 틀이 잡혀있는 경제적 처리방식 ( 효율적 코딩이 가능 - 일부 디자인 패턴이 우리도 모르게 적용 됨.)

- Spring Framework를 공부하고 온 직원이라면 교육없이 바로 업무 투입 가능.

- 틀이 잡혀있기 때문에 각 직원별 개발실력이 평준화 된다.

 

- Light Weight ( 경량 프레임워크 )

- POJO ( Plain Old Java Object - extends, implements )

 

EJB ( Enterprise Java Bean (class) - Spring의 전신 )

 

Maven Framework

- JAR / MAR 배포 자동화

- 라이브러리 자동화 ( Maven repository )

 

MyBatis Framwork

- DB 관련 프레임워크 / 동쿼리 생성 및 이식성에 유리


프로잭트 생성

 

Spring Legacy Project


pom.xml 메이븐 설정 코드 -> Maven Dependencies 에 영향

 

3.1.1. 스프링버전 (스프링을 사용하기 위한 이클립스 플러그인 버전과 다르다)

 

 

 

변경후 컨트롤S

설치후 변경 확인


컨트롤러 등 소스 

resources : 이미지 음악

test 경로는 지금은 사용하지 않음

 

jsp 저장됨 (폴더별로 분류)


프로젝트 우클릭 > 프로퍼티 >  Project Facets

 

 


네이티브로 실행 해보기

 

엘지 티비를 추가한다면

메인도 수정해 줘야 함

 

> 하나의 변화에 수정해야 하는 코드가 많음!

 

1. 변수부분을 수정하지 않도록 인터페이스 만들기

 

추상메서드이므로 내용을 채워 넣어야함

TV인터페이스의 자손 lgTV 삼성TV

 

다형성을 띄게 된다

> 이제 다 바꿀 필요 없이 Main에서 이름만 수정하면 된다.

 

 

 

>> 이마저도 바꾸지 않고 사용할수는 없을까? : 팩토리 패턴

tv 인스턴스를 반환하는 팩토리 생성

메인에서 new를 직접 할 필요 없이 브랜드값만 전달하면 해당인스턴스 리턴된다

 

그래도 브랜드값 직접 입력해야 하지 않나?

 

> main 매서드도 매개변수를 갖는다 : 인자값 배열

 


ipconfig는 명령어가 아닌 실행파일

뒤에 all을 붙이면 더 많은 값 출력

 

all이 매개변수


"Samsung"이 아니라 args[0]를 넣으면


1. 하나를 바꾸기 위해 다 수정해야 함 :결합도 문제

 

2. TV인터페이스생성 하고 new로 생성 : 여전히 직접 new 해줘야함

 

3. 팩토리 : 문자열은 여전히 넣어줘야함

 

4. 코드상 명시가 아니랑 외부에서 전달해주는 방식

 

 

> 우리가 만들어야 할 인스턴스와 변수가 한두개가 아님 : 메인으로 받아오는 방식의 한계

 

>> 설정파일 만들어 놓기 : XML


실습

 

new가 결합도 문제를 일으키므로 

 

 

<bean>

태그 만들기

 

LgTV tv = new LgTv(); 와 같은 의미

램에 인스턴스 생성을 한다

package kh.spring.main;

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

import kh.spring.interfaces.Tv;

public class Main {

	public static void main (String[] args) {
		AbstractApplicationContext ctx = new GenericXmlApplicationContext("context.xml");
		Tv tv = (Tv)ctx.getBean("tv");
		tv.powerOn();
		
		ctx.close();
		
	}
}

 

스프링 컨테이너라는 인스턴스를 생성 후 그 스프링 컨테니어가 new를 해준다.

(new가 많이 쓰이면 결합도가 높아지고 유지보수가 어려워 진다.)

 

팩토리는 쓰이지 않음!

Dependency Lookup : DL 이라고 한다.

 


실제 웹프로젝트에서는 DL보다는 DI 기술을 더 많이 쓰임


init-method

: 생성자와 별도로 실행

 

destroy-method

 

package kh.spring.beans;

import kh.spring.interfaces.Tv;

public class LgTV  implements Tv{
	public LgTV() {
		System.out.println("LG TV 생성!");

	}

	public void powerOn() {
		System.out.println("TV 켜짐!");

	}

	public void powerOff() {
		System.out.println("TV 꺼짐");

	}

	public void init() {
		System.out.println("LG TV 초기 설정 가동");

	}
	
	public void destroy() {
		System.out.println("LG TV 고장났음.");

	}

}
<?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="tv" class="kh.spring.beans.LgTV" init-method="init" destroy-method="destroy">
	
	</bean>

</beans>

 

 

생성자 실행, init 실행

 

close 되면서 destroy 실행

 

 

lazy-init="true"

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


<!--  init-method="init" destroy-method="destroy" -->
	<bean id="tv" class="kh.spring.beans.LgTV" lazy-init="true">
	
	</bean>

</beans>

 

무작정 인스턴스를 만드는 것이 아니라 필요로 할 때 생성 (사용여부가 불확실한 인스턴스 만들기)

 

scope

- 싱글턴 패턴 (디폴트)

	<bean id="tv" class="kh.spring.beans.LgTV">
	
	</bean>

여러번 불러도 하나만 생성

 

 

-프로토타입

	<bean id="tv" class="kh.spring.beans.LgTV" scope="prototype">
	
	</bean>

 


단, DTO같은 인스턴스들은 싱글턴으로 만들면 안된다!

그외 인스턴스는 싱글턴 적합 

 

 

이제 인스턴스 관리를 개발자가 아니라 스프링 컨테이너가 주로 한다!

 

 

IOC : ( Inversion of Control : 제어의 역전 )

 

스프링 컨테이너를 운용할 때 일어나는 현상


엘지 티비에서 브리프 스피커를 쓴다면

 

package kh.spring.beans;

import kh.spring.interfaces.Tv;

public class LgTV  implements Tv{
	
	private BritzSpeaker speaker = new BritzSpeaker();
	
	public LgTV() {
		System.out.println("LG TV 생성!");

	}

	public void powerOn() {
		System.out.println("TV 켜짐!");

	}

	public void powerOff() {
		System.out.println("TV 꺼짐");

	}

	public void init() {
		System.out.println("LG TV 초기 설정 가동");

	}
	
	public void destroy() {
		System.out.println("LG TV 고장났음.");

	}

}

 

결합도 문제 발생 (나중에 다른 스피커로 바꾸려면?)

 

인터페이스 Speaker를 상속받도록

package kh.spring.beans;

import kh.spring.interfaces.Speaker;

public class BritzSpeaker implements Speaker{

	public BritzSpeaker() {
		System.out.println("스피커");
	}

}
	private Speaker speaker = new BritzSpeaker();

 

여전히 new 사용

 

xml에 bean

	<bean id="speaker" class="kh.spring.beans.BritzSpeaker">
	</bean>
package kh.spring.beans;

import kh.spring.interfaces.Speaker;
import kh.spring.interfaces.Tv;

public class LgTV  implements Tv{

	private Speaker speaker ;

	public LgTV(Speaker speaker) {
		System.out.println("LG TV 생성!");
		this.speaker = speaker;
	}

	public void powerOn() {
		System.out.println("TV 켜짐!");

	}

	public void powerOff() {
		System.out.println("TV 꺼짐");

	}

	public void init() {
		System.out.println("LG TV 초기 설정 가동");

	}

	public void destroy() {
		System.out.println("LG TV 고장났음.");

	}

}

 

Xml에 에러 발생

 <constructor-arg></constructor-arg> : 생성자에 전달하는 인자값

주소값을 줘야 하므로

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


<!--  init-method="init" destroy-method="destroy" lazy-init="true"-->
	<bean id="tv" class="kh.spring.beans.LgTV" scope="prototype">
	 <constructor-arg ref="speaker"></constructor-arg>
	</bean>
	
	<bean id="speaker" class="kh.spring.beans.BritzSpeaker">
	</bean>

<!-- IOC : ( Inversion of Control : 제어의 역전 ) -->
</beans>

스피커를 lgTv에 생성자를 이용해서 주입

 


<!-- DI  : ( Dependency Injection : 의존성 주입 ) -->

 

xml 상에서 클래스간의 관계를 완성

 

소스코드 안에서 수정을 최소화!

'디지털 컨버전스 > Spring' 카테고리의 다른 글

[Spring Framework]  (0) 2020.05.29
[Spring Framework] 서버 연결  (0) 2020.05.27
[Spring Framework] Spring MVC  (0) 2020.05.27
[Spring Framework] Annotation  (0) 2020.05.27
[Spring Framework] 설치  (0) 2020.05.26

D드라이브 밑에 바로 spring 폴더 만들기 (경로상 한글 안됨)

 

새로 이클립스압축파일 복사해서 압축풀고 워크스페이스 잡기


이클립스 마켓플레이스에서 sts 검색

 

스프링 부트가 최신버전이지만 우리 교육과정에서는 스프링프레임워크3 사용

 


 

'디지털 컨버전스 > Spring' 카테고리의 다른 글

[Spring Framework]  (0) 2020.05.29
[Spring Framework] 서버 연결  (0) 2020.05.27
[Spring Framework] Spring MVC  (0) 2020.05.27
[Spring Framework] Annotation  (0) 2020.05.27
[Spring Framework] 설정, DL / DI , IOC  (0) 2020.05.27

+ Recent posts