Spring
IoC와 AOP를 지원하는 경량의 프레임워크
낮은 결합도와 높은 응집도를 가지는 코드
: 제어의 역행. 즉, new를 개발자가 하지 않고 컨테이너가 수행하는 기능과
관점지향 프로그래밍. 즉, 공통로직을 별도의 클래스로 모듈화하여
올바른 시기에 호출하는 기능을 수행하는,
경량의 POJO를 다루는 컨테이너를 제공하는 프레임워크
IoC (Inversion of Control)
IoC가 뭔가요? : 코드에서 new를 제거하는 것
IoC는 제어의 역행으로 코드에서 new를 제거하고 컨테이너를 통해 제어를 수행한다.
ex)
서블릿 컨테이너 (웹 서버, 톰캣)
서블릿 클래스만 생성 가능했음
FrontController
비동기처리 로직 클래스
컨테이너란?
객체를 생성
객체를 관리하는 주체
관리 == 호출 시점을 정하는 것
or 객체 소멸 시점을 정하는 것
Spring 프레임워크에서 사용하는 컨테이너 => Spring 컨테이너
POJO(일반 JAVA 객체)
DTO, DAO, Action
제어 == 객체를 생성(및 관리)함 == new
코드에 new(개발자가 작성하지 않고)가 없는 것이 좋은 것!
컨테이너가 new를 해주는 것이 좋은 것!
Controller 파트는 new라는 연산자 사용 xxx
java가 jsp 파일에 없는 것처럼 new를 절대적으로 사용하면 안 된다!
HendlerMapper안의 new 코드들 => 스프링 컨테이너로 대신할 예정
=>
AOP (Aspect Oriented Programming)
관점 지향 프로그램
<--> OOP(객체 관점프로그래밍)
3) 경량이란 무엇인가요?
1. 다루는 객체가 가볍다. == POJO
2. 사용 메모리가 적다. == 싱글톤 패턴을 활용
4) 프레임워크란 무엇인가요?
VS 라이브러리 VS API
프레임워크를 활용했을 때의 장점이 뭔가요?
SpringMVC 이미 적용된 프로젝트를 하나 생성해줌 == 구현이 빨라짐
몰라도 쓸 수 있다! == 개발자의 실력이 상향 평준화됨
일관성이 유지되기 쉬움
유지보수 용이
관점 지향
기존의 기능 개발은 "핵심 로직"을 중심으로 개발되었습니다!
비즈니스 메서드, CRUD, 핵심 관심
다양한 CRUD에 공통적으로 적용되는 로직을 모듈화해서 저장, 호출 가능해짐!!!
Spring 컨테이너가 AOP를 지원해주기 때문에!!
공통 로직(횡단관심)을 별도의 클래스(메서드)로 작성하게 됩니다!!
JDBCUtil : 공통 로직을 별도로 관리해주던 클래스
★ 결합도(Coupling)에 대하여...
결합도를 낮추기 위한 다양한 개발자들의 노력이 있어왔습니다.
1) 인터페이스 활용하는 방법
=> 객체가 변경되어도
메서드를 추가 변경하지 않아도 ㄱㅊ << 결합도가 낮다
2) 팩토리 패턴을 활용하는 방법
=> 코드에 new가 있었는데,
new가 없어짐
== 코드에 new가 없을수록 결합도가 낮은 것!!!! 😊
: HandlerMapper
① 컨테이너는 설정파일 (.xml)을 필요로 합니다.
.xml의 구조
.xml 이기 때문에 <>(태그)로 구성됨
루트 엘리먼트 (최상위 태그)
<web-app>
</web-app>
각종 설정들이 <>로 작성되어있음
서블릿 컨테이너(톰캣, 웹서버) => 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" />
무명의 객체를 만들 때는 id를 사용하지 않는다.
mappings.put("/main.do", new MainAction()); >> new MainAction()
<bean class="controller.action.MainAction" />
규칙 1. id 값은 중복 허용 xxx
규칙 2. <bean>을 통해 new 된 객체들은 Heap 메모리 영역에 저장된다.
+) 싱글톤을 알아서 해주는 것은 아니다.
⑥ 싱글톤을 알아서 해주는 것은 아니다.
교재에 "<bean>이 싱글톤을 유지해준다."
Phone phone = new Phone();
<bean class="test.Phone" id="phone">
>> phone이라는 이름의 객체가 다시 요구되었을 때,
기존의 phone을
미리 메모리에 load(적재)되어 있던 phone 객체를 다시 준다!
<bean class="test.Phone" id="phone">
<bean class="test.Phone" id="phone2">
에러가 나는 것은 아니지만 싱글톤이 유지되지 않기 때문에
권장하지 않는다. => 싱글톤이 유지되지 않는다.
한번 phone, phone2 객체를 생성했다면
다음에 다른 곳에서 phone을 요청했을 때
이미 만들어둔 객체를 준다
⑦ <bean>에 등록된 객체들을 스프링 컨테이너가 구동될 때(시작될 때) 한번에 Heap 메모리에 load(적재)
한번에 객체 생성함
스프링 컨테이너가 구동될 때 딱 한번만 new == 싱글톤
이후 호출되면 (팩토리 패턴을 활용해서) 요청하는 객체를 전달 LookUp
⑧ <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 하고 싶을 때 작성
'JAVA > Theory' 카테고리의 다른 글
| [Spring] 의존 주입을 위한 어노테이션 (1) | 2024.03.04 |
|---|---|
| [Spring] 의존 주입 (DI) (0) | 2024.02.29 |
| [Java] request 객체 (0) | 2024.02.06 |
| [Java] POJO vs Non-POJO (0) | 2024.01.19 |
| 자바(Java)의 클래스 (0) | 2023.12.26 |
댓글