✅ Spring 프레임워크 개요
- SpringBoot
- Spring 기반으로한 자체 프레임워크 => 실무에서 사용
✅ 프레임워크
: 프레임워크 == 골격 ( 개발자 끼리의 기준을 통해 유지보수가 용이 )
ex)
리모컨
한 개발자가 볼륨 버튼을 +10을 하고 퇴사한 뒤 다른 개발자가 새로 볼륨 버튼을 +1로 해서 만들 경우
--> 전에 만든 리모컨을 가지고 왔을 때 문제가 생긴다!
프레임워크의 장점은?
1. 유지보수 용이
2. 개발시간 단축 → 개발비용 절감
3. 개발자의 역량이 획일화 → 실력 상향 평준화
4. 재사용 용이
✅ 스프링 프레임워크
: IoC와 AOP를 지원하는 경량의 프레임워크
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 == 설정파일
- web.xml == 톰캣 관련 설정파일
- 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;
}
}
'Framework > SPRING' 카테고리의 다른 글
[SPRING 이론] spring / spring boot 특징 요약 (0) | 2025.01.16 |
---|---|
[SPRING 이론] [04] 인스턴스화 / 어노테이션 (0) | 2024.03.04 |
[SPRING 이론] [03] 의존성(의존관계) / 의존주입 (0) | 2024.03.04 |
[SPRING 이론] [02] 컨테이너 (0) | 2024.02.29 |