재밌고 어려운 IT를 이해해보자~!

스프링 프레임워크, Bean태그, 결합도 본문

코리아IT핀테크과정

스프링 프레임워크, Bean태그, 결합도

언제나즐거운IT 2024. 2. 26. 16:36

Spring 프레임워크가 뭘까?!

=> IoC와 AOP를 지원하는 경량의 프레임워크


낮은 결합도와 높은 응집도를 가지는 코드이다.

: 제어의 역행. 즉, new를 개발자가 하지않고 컨테이너가 수행하는 기능과 관점지향 프로그래밍. 즉, 공통로직을 별도의 클래스로 모듈화하여 올바른 시기에 호출하는 기능을 수행하는 경량의 POJO를 다루는 컨테이너를 제공하는 프레임워크

 

IoC( Inversion of Control)가 뭘까?

=> 코드에서 new를 제거하는 것

제어의 역행
- 제어를 중프까지 개발자가 담당함
- Spring에서는 제어를 프레임워크에 맡길예정
- 컨테이너를 통해 제어를 수행할것임
- 서블릿 컨테이너 == 웹 서버, 톰캣

- 서블릿 클래스만 생성가능했음
- FrontController
- 비동기처리 로직 클래스

컨테이너란?

  - 객체를 생성하거나
  - 객체를 관리하는 주체
  - 관리 == 호출 시점을 정하는 것 or 객체 소멸시점을 정하는 것
  - Spring 프레임워크에서 사용하는 컨테이너 => Spring 컨테이너
  - POJO
  - DTO, DAO, Action
  - 제어 == 객체를 생성(및 관리)함 == new
  - 코드에 new(개발자가 제어하는것)가 없는 것이 좋은것!
  - 컨테이너가 new를 해주는것이 좋은것!
  - C파트는 new라는 연산자를 사용 xxx
  - HM안의 new 코드들 => 스프링 컨테이너로 대신할예정! => POJO인데...?가능한가?

AOP ( Aspect Oriented Programming ) 란?

- 관점 지향 프로그래밍 <-> OOP(객체 지향 프로그래밍)

xx지향 프로그래밍
1) 절차 : 순서대로 진행하는 방식
   일의 처리순서가 가장 중요
   알고리즘
   성능 - 속도
2) 객체 : 모듈(클래스)단위로 코드를 구성하는 방식
   설계, 객체가 중요
   학생,카드,캐릭터,xxx기능Action,...
   성능 - 메모리(Heap) : 싱글톤,팩토리,...
※※※※※개발팁...
   ctrl C,V 를 하잖아요?
   개선할 여지가 있다는 뜻~^^
※※※※※
3) 관점
   기존의 기능개발은 "핵심 로직"을 중심으로 개발되었습니다!
         비즈니스 메서드, CRUD, 핵심 관심
   다양한 CRUD에 공통적으로 적용되는 로직을 따로 모듈화해서 저장, 호출가능해짐!!!
      Spring이 AOP를 지원해주기때문에!
   공통로직(횡단관심)을 별도의 클래스(메서드)로 작성하게 됩니다!!
      JDBCUtil : 공통로직을 별도로 관리해주던 클래스
3) 경량이란?
   1. 다루는 객체가 가볍다. == POJO
   2. 사용 메모리가 적다. == 싱글톤 패턴을 활용
4) 프레임워크?
   vs 라이브러리 vs API


   프레임워크를 활용했을때의 장점은?
      SpringMVC 이미 적용된 프로젝트를 하나 생성해줌 == 구현이 빨라짐
      몰라도 쓸수있다! == 개발자의 실력이 상향 평준화됨
      일관성이 유지되기 쉬움
      유지보수 용이

★ 결합도(Coupling)에 대하여
   결합도를 낮추기위한 다양한 개발자들의 노력이있어왔다.
   1) 인터페이스를 활용하는 방법
      => 객체가 변경되어도
         메서드를 추가 변경하지않아도 괜찮다.
       : DTO
   2) 팩토리 패턴을 활용하는 방법
      => 코드에 new 가 있었는데, new 가 없어짐
         코드에 new 가 없을수록 결합도가 낮은것!!!!! ★
       : HM (HandlerMapper)


지금부터 말하는 개념은 코드로 못 돌려본다!
뜯어보면 그렇게 생겼다!
여러분이 직접 하나하나 코드를 분해하면서 공부해보자!

① 컨테이너는 설정파일을 필요로한다.
      .xml
   서블릿 컨테이너(톰캣,웹서버) => web.xml
② 스프링 컨테이너 역시 설정파일(.xml)을 필요로한다.
   applicationContext.xml
③ applicationContext.xml 설정파일의 루트 엘리먼트
   <beans>
   </beans>
④ 각종 설정들을 루트 엘리먼트 안에 <>(태그)로 작성
   1) <bean></bean>
   2) ...
⑤ <bean> 이란?
 ★ new 를 대신해주는 태그 ★
   결합도가 낮아집니다!~~
   <bean class="클래스명" id="객체명" />

Phone phone=new Phone();
<bean class="test.Phone" id="phone" />

handler=new HandlerMapper();
<bean class="controller.common.HandlerMapper" id="handler" />

mappings.put("/main.do", new MainAction()); >> new MainAction()
<bean class="controller.action.MainAction" />

   규칙 1. id 값은 중복허용 xxx
   규칙 2. <bean>을 통해 new 된 객체들은 Heap 메모리 영역에 저장됨
   +) 싱글톤을 알아서 해주는것은 아님

⑥ 싱글톤에 관련된 설명이 제각각일수있음 → 잘 파악해서 정리할것!

⑦ <bean> 에 등록된 객체들을 스프링 컨테이너가 구동될때(시작될때) 한번에 Heap 메모리에 load(적재)
   한번에 객체생성함
   스프링 컨테이너가 구동될때 딱 한번만 new == 싱글톤
   이후 호출되면 (팩토리 패턴을 활용해서) 요청하는 객체를 전달 : Look Up

⑧ <bean> 태그의 다양한 속성
   <bean class="" id="" init-method="initMethod" />
            생성자 역할을 해줄 메서드를 new 하는 타이밍에 호출할수있음
             == 멤버변수 초기화 역할을 해줄 메서드
   <bean class="" id="" lazy-init="true" />
            지연 로딩 방식
      모든 <bean>은 컨테이너 구동시점에 new 됨
      해당 객체를 사용하는 시점에 new 하고싶을때에 작성
         == 클라이언트(Client,브라우저,사용자)가 호출하는 시점
   <bean class="" id="" scope="singleton" />
      ↔ <bean class="" id="" scope="prototype" />
         해당 객체를 사용할때마다 새로 new 하고싶을때에 작성

 

결합도 낮추는 코드작성!

BeanFactory.java

package test;

import java.util.ArrayList;

// Bean == 객체 == 기능 단위
// 기능 단위로 코드를 작성해놓은 객체
public class BeanFactory {
	// 팩토리 패턴을 구현하기위한 클래스
	// 팩토리 패턴이란?
	// : 객체명을 요청하면
	// 해당 객체를 제공하는 것
	private ArrayList<String> iDatas;
	private ArrayList<String> gDatas;
	public BeanFactory() {
		iDatas=new ArrayList<String>();
		iDatas.add("IPHONE");
		iDatas.add("APPLE");
		
		gDatas=new ArrayList<String>();
		gDatas.add("GALAXY");
		gDatas.add("SAMSUNG");
		
	}
	
	// 이건그냥 내부로직
	private boolean isIPHONE(String phoneName) {
		for(String data:iDatas)  {
			if(phoneName.equals(data)) {
				return true;
			}
		}
		return false;
	}
	private boolean isGALAXY(String phoneName) {
		for(String data:gDatas)  {
			if(phoneName.equals(data)) {
				return true;
			}
		}
		return false;
	}
	
	
	// ver 3
	// Object == 자바의 최상위클래스
	public Object getBean(String beanName) {
		beanName=beanName.toUpperCase();
		
		if(isIPHONE(beanName)) {
			return new IPhone();
		}
		else if(isGALAXY(beanName)) {
			return new GalaxyPhone();
		}
		return null;
	}
}

GalaxyPhone.java

package test;

public class GalaxyPhone implements Phone {

	@Override
	public void powerOn() {
		System.out.println("갤럭시 전원 ON");
		
	}
	@Override
	public void powerOff() {
		System.out.println("갤럭시 전원 OFF");
		
	}
	@Override
	public void call() {
		System.out.println("갤럭시 전화통화연결");
		
	}
}

Iphone.java

package test;

public class IPhone implements Phone{

	public void powerOn() {
		System.out.println("아이폰 전원 ON");
	}
	
	public void powerOff() {
		System.out.println("아이폰 전원 OFF");
	}
	
	public void call() {
		System.out.println("아이폰 전화");
	}
	
}

Phone.java

package test;

public interface Phone {
	// 인터페이스
	// == 아, 메서드 오버라이딩 강제하려는거구나!
	// == 메서드 시그니쳐를 맞춰야하는 상황인가보다~
	// "다형성"을 코드에 적용한 사례
	
	public void powerOn();
	public void powerOff();
	public void call();
}

User.java

package test;

public class User { // Cliend*(브라우저)

	public static void main(String[] args) {
		//컨테이너안에 있기때문에 new를 안한다 원래 
		BeanFactory beanFactory=new BeanFactory();
		
		Phone phone= (Phone)beanFactory.getBean(args[0]);
		phone.powerOn();
		phone.call();
		phone.powerOff();
		
		// [결론]
		// 비슷한 서비스를 제공하는 객체들끼ㅣㄹ는
		// 메서드 시그니쳐를 맞춰줄 필요가 있다.
		// -> 메서드 시그니쳐를 강제
		// -> 인터페이스 설계가 필요!
		// => "다형성"을 실현하여 코드에 적용한 대표적인 사례!!!
		//  : 똑같은 메서드를 호출했어도,
		// 	  메서드를 수행하는 주체(주어,대상)에 따라
		//    다른 결과(output)가 나오는 현상
		
	}

}







 

 

'코리아IT핀테크과정' 카테고리의 다른 글

스프링 설치  (0) 2024.02.27
Dependency Injection(의존 주입)  (0) 2024.02.27
CKEditor [TEAM PROJECT]  (0) 2024.02.21
네이버 로그인 API [TEAM PROJECT]  (0) 2024.02.21
카카오 로그인 API [TEAM PROEJCT]  (0) 2024.02.21
Comments