The Debugging Chronicles : "코드의 미학"

[Spring] 프레임워크 구조 본문

Spring

[Spring] 프레임워크 구조

sweetseonah1004 2024. 10. 1. 10:48

프레임워크 = 틀, 뼈대

개발 양식을 개발자들에게 제시

***개발자들의 역량이 획일화

 

혼자만 잘하는 개발자가 왜 위험한가?

1. 협업을 해야함

2. 말을 안하고 자기가 혼자 다 개발함

3. 만약 퇴사한다면??

 

따라서 회사는 회사는 협업이 가능한 개발자를 선호한다.

똑같이 개발한다면 일관성 유지 용이,쉬운 관리, 구현 시간 단축, 개발비용이 최소화 된다.

또한 유지 보수가 용이하니 재사용성이 증가한다.

 


그럼 Spring 프레임워크가 무엇인가?

한마디로

"IoC와 AOP를 지원하는 경량의 프레임워크"입니다.

여기서 알아야할 것은 3가지이다

1. IoC  2.AOP  3. 경량이다

 

 

1. IoC

제어의 역전(Inversion of Control)이라고 한다.

 

제어는 무언가를 관리하는 능력을 이야기한다.

그럼 무언가는 무엇일까?

 

바로 '객체'이다

 

그래서 객체를 관리하는 능력을 이야기한다.

원래는 개발자가 객체를 관리하는데

Spring에서는 다른 애 == "컨테이너"가 객체를 관리한다.

 

(원래 개발자가 객체를 생성하고 싶으면 개발자가 new를 해서 호출을 했다.new BoardDAO(); BoardDAO.insert();)

 

(***개발자가 new를 적게 사용하면 고수였다.)

 

(그런데 여기서 new를 생성하는데 이런 문제에 부닥칠 수 있다.)

 

(예를 들어

동물의 숲에서 사람인 내가 있고  주민인 동물이 있다.

얘네들이 낚시를 하거나 잠자리채로 무언가 잡을 수 있다.

동물에 숲에는 객체가 4가지 있다.

사람.낚시.낚시하기()

사람.잠자리채.채집()

그럼 질문!

만약 낚시(도구) 객체는 언제 생성해야할까요?

그래서 어렵다 어떤 타이밍에 new를 생성해야하는지가!!)

 

여기서

FrontController는 new를 해주지 않았다.

그래서 확인해 보니

command 로그가 출력됬으니까
100% doAction() 호출됨
100% doGet() 호출됨
not static >>> 객체가 100% 있음 == FrontController 객체
FrontController frontController = new FrontController();
개발자가 객체관리를 안하는데 누군가 대신해주고있네????
서블릿 "컨테이너"가 있는거였네???????  == 톰캣

기존 Web 프로젝트에서 우리는 new FC();를 하지않았다!
그런데 되고있었다! 자동으로 해주네????
"컨테이너"가 있었구나~~~
그건 바로 서블릿 컨테이너 == 톰캣
그러면 설정파일 누구지? == web.xml(톰캣,서블릿 컨테이너의 설정파일)
※ .xml 에 과도한 설정이 작성되는 것을 방지하기위해
   @ 어노테이션을 대신 사용하기도합니다 ^^~~~

  <servlet>
    <description></description>
    <display-name>Apple</display-name>
    <servlet-name>Apple</servlet-name>
    <servlet-class>controller.common.Apple</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Apple</servlet-name>
    <url-pattern>/Apple</url-pattern>
  </servlet-mapping>

@WebServlet("*.do")

Spring에는 POJO를 개발자 대신 관리해주는 "컨테이너"가 있다.
설정파일 == pom.xml

결론) 컨테이너 : .xml(설정파일) = 1: 1

 

기존 중간 프로젝트에서는 서블릿 컨테이너(톰캣)가 FrontController만 new 대신 해줬는데,

최종 프로젝트에서는 DAO,DTO,Controller 등의 POJO도 대신 new 해줄것임!!!!!

 

2. AOP ==>  나중에 배울 예정

 

3.경량

경량은 가볍다는 뜻이다

not POJO(서블릿)가 없다는 뜻

POJO 대부분 구성되어 있음


코드를 통해 확인해 보자

 

 

기본 생성자 만들어서 로그 작업해주고 전원을 껴고 끄고 있도록 한다.

 

위에 코드는 결합도가 높다.

 

이를 낮추기 위해 두가지 방법을 사용해 보자

 

첫번쨰는 인터페이스 사용하기

 

 

 

두번째는 개발 패턴 활용하기이다.

 

 

스프링에서 객체를 생성해서 가져다주는 역할은 스프링 컨테이너가 한다. 

스프링 컨테이너를 만든다. 컨테이너를 구동시키는 코드

컨테이너는 동작하기 위해 xxx.xml 파일이 필요하다.

객체를 달라는 요청한다.

 

캐스팅 이슈

객체를 요청하는 말을 전문용어로 look up 한다고 한다.

 

.xml 파일을 만들어 준다

우리가 Bean == 객체들을 만들어야한다.

그건 beans를 통해서 가능하다.

 

<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">
   
   
   
</beans>

<beans>라는 root(최상위) element(요소, 태그)를 준비한다.

 

 

bean을 만들어 보자

bean은 beans 안에 있다.

 

이렇게 bean등록을 맞췄고 형태는 useBean과 형태가 비슷하다

 

다시 client로 돌아가서 설정해보자

컨테이너를 구동시킬 때 apple 만 구동시켰는데 갤럭시도 생성된다

이유는 컴파일러는 사용자가 애플일지 갤럭시를 선택할지 모른다.

 

만약에 banana를 외친다면

 

 

 

라인 넘버 7번에서 구동된다.