새로 이클립스를 세팅했으니 인코딩을 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 |