SpringFrameWork

Shaun·2022년 4월 15일
1

스프링

목록 보기
4/6

이번 시간에는 간단하게 SpringBoot / JPA / 웹서버 / 톰캣 등등 항상 내가 사용하고 있지만 정확한 flow를 파악하지 못해 전체적인 흐름 정리 및 복습시간을 가졌다.

ORM(Object Relational Mapping)

  • 자바 class 가지고 데이터베이스 테이블을 ‘모델링’ 한다
  • 원래는 DB의 테이블을 먼저 생성을하고 그안에 데이터를 넣는 방식을 사용하지만 JPA에서의 ORM 이란 방식은 자바Object를 먼저만들고(Object) 그에 해당하는(Relational) 테이블을 자동으로 만들어준다.(Mapping)
  • 그래서 TRM 이아닌 ORM

서블릿

  • 서블릿이 없다면 이러한 http요청 하나하나 해석하고 만들어야 되므로 시간이 많이 소모된다.

  • 서블릿을 통해 웹 요청을 다루면 개발자는 집중해야되는 서비스 로직에 더 집중 가능

서블릿컨테이너(톰켓)

백단에서 톰켓이란녀석이 request에 해당하는 자바웹페이지를 골라서 준다라고만 간단히 알고 있엇다. 이번시간에는 더 자세히 알아보자

  • Spring은 URL(자원접근) 방식 불가

  • 그래서 URI(식별자 접근) 방식으로 접근을하고(톰켓을 거친다) 응답은 URL방식으로 나감

톰켓 내부 동작방식

  • 첫번째 호출시 request가 오면 톰켓 내부에서는 서블릿 객체가 생성된다. 그리고 init() 메서드로 초기화를 시켜주고 Service()에서 reques(httpMethod) 에 해당하는 부분 실행, 이 부분에서 DB에 연결하고, 데이터를 가져온뒤, 응답을 해준다.

  • 두번쨰 호출부터는 서블릿객체생성 x , init() 초기화 x, 다음 과정은 똑같다.

  • 이 과정은 스레드 하나에 할당되며 request가 몰려서 최대 스레드를 넘어가면 대기상태로 들어간다. 그러고 난뒤에 스레드가 작업을끝내면 작업을 끝낸 스레드에게 다음 request를 준다.이러한 재사용 하는 기법을 pooling기법이라 한다

  • 자바기본 구조를 알면 쉽다. 메서드 사용시 독립된 공간을 가지기 떄문에 여러 서블릿객체하나에 쓰레드들이 각자 메서드들 사용시 독립적 공간 사용가능

웹서버 + 톰켓

FrontContorller


  • 우리는 사용자의 요청을 servlet 에게 전달하기위해 web.xml(톰켓의 문지기같은 역활) 에 servlet을 등록하고 mapping하는 과정이 필요하다. 하지만 요청이 많아질수록 이러한 반복적인 과정을 대신해주는 녀석이 FrontController 이다.

  1. 처음에 요청이오면 바로 자원접근이 불가능하니(Spring특징) 톰켓을 한번 거친다. 그떄 톰켓에서는 request/response 객체를 만들어준다.

  2. Request ->톰켓문지기(web.xml) 하는일 요청이 많아 frontController에서 request를 좀 받는다 ->request.do(특정주소) - >frontController에서 낚아챈다. -> 자원을 찾아갈수있도록 request해줌 -> 그럼 기존에 톰켓이 만들었던 request/response 객체가 바뀐다. 그럼 최초요청 request A에대한 데이터도 바뀜 ->

=> 이걸 방지하고자 나온게 requestDispatcher (톰켓이 만들었던 기존의 request/response 를 유지한다)

RequestDispatcher

  • requestDispatcher = 기존의 request/response 데이터를 유지시켜준다. 데이터를 들고 다음페이지 이동

  • frontcontroller + requestDispatcher = DispatchServlet(스프링에서 제공)

  • DispathcServlet이 자동생성되어 질때 수많은 객체가 생성(ioc) 된다 . 보통은 필터들이다.

  • JSP에서는 front , requestDispatcher 다 직접 짜야하지만 스프링은 제공해줌

DispatchServlet

  • 주로 주소분배, 컴포넌트스캔 역활 담당

컴포넌트 스캔

  • 주소 분배를 하려면 그 클래스들(자바파일들) 을 메모리에 띄어줘야하는데 src에 있는 모든 파일들을 생성해준다. (그래서 우리가 new로 생성안해도 됌)

  • 생성된 객체들은 IOC컨테이너에서 관리한다.

  • DispatchServlet이 자동으로 우리가 필요한 자바 파일들을 src에서 찾아 만들어주는데 무슨 기준으로 만들까?

    -> 애노테이션

  • handlerMapping = 해당 컨트룰러를 찾아줌

  • handlerAdapter = 컨트룰러 안 메서드 찾아줌

  • 4.modleAndView 로 데이터를 받고 -> 뷰리졸버

  • 위 세가지 모두가 DIspatchServlet이 스프링컨테이너로부터 주입받아서 사용하고 동작함

결론적으로 우리가 코드를 작성하고 (자바객체) 그것을 스프링이 컨테이너(IOC)에서 관리를 하고 DispatchServlety이 그 스프링 컨테이너를 주입받아 사용하고 동작한다!!!!

ContextLoaderListner

  • DispatcherServlet 에서 ->쓰레드 만들고 -> src 에서 자바피일들 띄우고 새로운요청이오면 반복, 반복된 작업

  • 그래서 그전에 web.xml 이 ContextLoaderListner 녀석을 띄워주고 -> root-ApplicationContext라는 파일을 읽어 쓰레드들이 공통적을 사용하는 것들을 미리 띄워준다.(EX =DB)

  • request -> web.xml -> ContextLoaderListner -> DispathcerServlet

Response

  • 크게 data반환, 페이지 반환 이 있다.

1.페이지반환

  • DIspachServelt 이 클래스들을 띄우고 handlerMapping에게 요청에 해당하는 클래스 파일을 찾으라한다(주소분배)

  • 페이지 반환시 viewResolver 에서 그 파일이름 앞뒤로 web-INF.views/파일이름/.jsp 이런식으로 붙여 리턴해준다

  • 이것을 톰켓이 html로 바꿔준뒤 클라에게 반환

2.데이터 반환

  • data반환시 @ResponseBody 붙이면 리턴값을 파일이아닌 데이터로 반환.

  • 엔티티나 dto반환시에는 클라이언트쪽에서 객체를 이해못하니
    messageConverter(Jakson)라는 녀석이 이것을 JSON형식으로 바꿔준다

정리

  • 보기에 좀 지저분하지만 한페이지에 학습내용을 정리해봤다
profile
호주쉐프에서 개발자까지..

0개의 댓글