Framework/SPRING

[SPRING 이론] [01] 프레임워크

오류나면꽥꽥 2024. 2. 28. 17:12

✅ Spring 프레임워크 개요

  1. SpringBoot
  2. Spring 기반으로한 자체 프레임워크 => 실무에서 사용

 

 

 

프레임워크

: 프레임워크 == 골격 ( 개발자 끼리의 기준을 통해 유지보수가 용이 )

 

ex)

리모컨

한 개발자가 볼륨 버튼을 +10을 하고 퇴사한 뒤 다른 개발자가 새로 볼륨 버튼을 +1로 해서 만들 경우

--> 전에 만든 리모컨을 가지고 왔을 때 문제가 생긴다!

 

프레임워크의 장점은?

1. 유지보수 용이

2. 개발시간 단축 → 개발비용 절감

3. 개발자의 역량이 획일화 → 실력 상향 평준화

4. 재사용 용이

 

 

 

 

 

  스프링 프레임워크

: IoCAOP를 지원하는 경량의 프레임워크

 

ex)

POJO

NOT POJO (Servlet,리스너,필터)

: 우리는 이미 JSP 팀 프로젝트에서 경량으로 작업함

Servlet을 FrontController 한개만 생성하여 사용함

API, 비동기처리 기능 등을 구현할 때에 Servlet을 추가로 사용함

📍 IoC ( Inversion of Control )란?

: 제어의 역행 ( 프레임워크에게 제어권을 넘겨주는 것 )

개발자가 new (객체화, 인스턴스화)를 제어 x

코드에 new가 작성될수록 유지보수에 불리 --> tip. 코드는 결합도 낮고 응집도 높아야 좋다.

new를 사용 할수록 결합도가 높아 지기 때문에 new를 사용하지 않는다.

 

 

 

Q. 결합도가 높은 코드라면?

해결01 - 다형성 활용하기

해결02 - SW 개발 디자인 패턴 ( MVC, Factory, Singleton, ... )

 

 

 

 

해결02 - SW 개발 디자인 패턴

📍  Factory 패턴이란?

: 객체를 생성하는 코드를 캡슐화 == new와 관련된 코드를 은닉

사용자로부터 필요한 객체의 이름을 받아 객체 자체를 반환하는 로직

코드를 변경하지 않아도 결과(화면)가 달라집니다. ---> 재컴파일 하지 않아도 되기 때문에

Spring Legacy Project

.xml == 설정파일

  1. web.xml == 톰캣 관련 설정파일
  2. pom.xml == 스프링 관련 설정파일 ( .jar 파일들에 대한 관리 )

tip. xml에서는 주석을 안 남기는 것을 권장

 

 

​⭐⭐⭐
<bean>에서 new를 개발자 대신 해준다

 

 

 

ex)

<bean class="test.GalaxyPhone" id="galaxy"/>

== ▲위 코드는 GalaxyPhone galaxy = new GalaxyPhone(); 와 같은 의미

 

 

 

 

 

 

기본형태

 

<bean class="" id=""></bean>
디폴트
pre-loading 방식을 사용함
(즉시로딩방식)
객체를 1개만 메모리에 생성하고 해당 객체를 재사용
설정값
하면 lazy-init 방식을 할 수도 있음
(지연로딩방식)
== 싱글톤 Singleton 패턴

 

 

ex)

실무에서 설정값을 주고 사용하는 경우

<bean class="test.GalaxyPhone" id="galaxy" init-method="initMethod" scope="prototype" />
<bean class="test.IPhone" id="apple" destroy-method="destroyMethod" lazy-init="true"/>

 

// interface - Phone.java
package test;

// FrontController에서 Action .execute() 강제하기위해 활용
public interface Phone {
	void powerOn();
	void powerOff();
	void volumeUp();
	void volumeDown();
}
// interface - Watch.java
package test;

public interface Watch {
	void volumeUp();
	void volumeDown();
}
// GalaxyPhone.java
public class GalaxyPhone implements Phone {

	private Watch watch;
	
	public GalaxyPhone() {
		System.out.println("갤럭시폰 기본 생성자 호출됨");
	}
	
	public GalaxyPhone(Watch watch) {
		this.watch=watch;
		System.out.println("갤럭시폰 생성자 호출됨");
	}
		
	public void initMethod() {
		System.out.println("객체를 처음 생성할때 함께 호출할 메서드");
		System.out.println("보통 일반적으로 멤버변수 초기화와 관련된 코드들이 포함되어있음");
	}
	
	@Override
	public void powerOn() {
		System.out.println("전원ON");
	}
	@Override
	public void powerOff() {
		System.out.println("전원OFF");
	}
	@Override
	public void volumeUp() {
		watch.volumeUp();
	}
	@Override
	public void volumeDown() {
		watch.volumeDown();
	}
}
// GalaxyWatch.java
package test;

public class GalaxyWatch implements Watch{
	public GalaxyWatch() {
		System.out.println("갤럭시 워치 객체 생성됨");
	}
	
	@Override
	public void volumeUp() {
		System.out.println("갤럭시 워치로 음량++");
	}
	@Override
	public void volumeDown() {
		System.out.println("갤럭시 워치로 음량--");
	}
}
// MiWatch.java
package test;

public class MiWatch implements Watch {

	public MiWatch() {
		System.out.println("미밴드 생성자 호출됨");
	}
	
	@Override
	public void volumeUp() {
		System.out.println("샤오미 밴드로 ++");
	}

	@Override
	public void volumeDown() {
		System.out.println("샤오미 밴드로 --");
	}
}
// BeanFactory.java
package test;

// 특별한 말이 없다면, Bean == 객체
public class BeanFactory {
	public Object getBean(String beanName) { // 메서드 시그니처
		if(beanName.equals("갤럭시")) {
			return new GalaxyPhone();
		}
		else if(beanName.equals("아이폰")) {
			return new IPhone();
		}
		return null;
	}
}