스프링 작동원리

이영광·2022년 6월 10일

자바

목록 보기
16/34

유투브 메타코딩 스프링작동원리 정리

[1] 톰켓시작

  • [필터] 가 메모리에 업로드된다.
    • 권한,인증,인코딩 에 대한 여러가지 필터들이 있는데 우선적으로 필터들이 걸러내게 된다
  • [디스페처] 가 메모리에 업로드
    • 사용자들의 요청이 들어오는걸 디스페처가 확인후 컨트롤러에 요청(주소에맞는 분배)

[2] 컨트롤러 메모리에 업로드

  • [디스패처]를 통해 분배된 주소값에 맞는걸 받아서 body 에 데이터가 있다면 그것을 받는다
    -> Service 에 넘긴다(비지니스로직)

[3] Service 메모리에 업로드

  • 컨트롤러에서 넘어온 데이터
    • ex 로그인이 시작되고(로그인서비스 시작) 이 로직을 통해 JPA 레파지토리에 요청을한다

[4] Repository 메모리에 업로드

  • 서비스에서 넘어온 데이터를 가지고 데이터베이스에 쿼리 요청을 하게된다.

[5] 영속성컨텍스트 메모리에 업로드

  • 영속성 컨텐츠에 객체가 존재하지 않는다면 데이터소스에 넘기면 데이터소스가 데이터베이스에 연락을 한다.
  • 있다면 db접근할필요 없이 바로 레파지토리에 넘긴다.(이미 받아와서 영속성에서 들고있기때문)

[6] DB

  • 데이터베이서에서 탐색후 있다면 데이터소스에 넘기게 된다.

[5] 영속성컨텍스트

  • 받아온데이터를 객채화에서 영속성 컨텍스트가 가지고 있게 되고 이 데이터를 JPA 에 넘긴다

[4] Repository

  • 영속성 컨텍스트에서 데이터를 그대로 받아온걸 서비스에 넘긴다.

[3] Service

  • repository 에서 받아와서 받아온 오브젝트가 있는지 없는지 체크하고 있다면 session에 등록을 하고
    인증페이지로 이동할수 있게 컨트롤러에게 연락한다

[2] controller

  • 컨트롤러는 어떤 페이지로 이동을 할수 있게 이동한다.

@RestController 이다면 데이터를 응답하는 컨트롤러이고

@Controller 는 HTML 페이지를 내보내주는 컨트롤러이다.

예를들어 / 라는 곳으로 이동하라고 했다면 데이터보다는 페이지를 응답해주는 것으로서 ViewResolver 가 작동한다

ViewResolver 는 페이지를 만들어서 응답한다

그렇다면 컨트롤러에서 "/" 리턴하겠지만 정확하게 예를들어 "home" 을 리턴했을때 프로젝트에서 home이라는 페이지(jsp)
를 찾는다 그리고 사용자에게 응답을 해준다.

@RestController 라면 viewresolver 가 작동하지 않으며 "home" 이라는 글씨 자체를 리턴해줄것이다.

인터셉터?

ex /user/1 을 요청을 했을때 1번유저의 정보를 보는 요청이라고 한다면 이 함수가 시작된다면

모든사용자에게 보여주면 안되기때문에. 실행직전 인터셉터가 동작하면서 지금 들어오는 사용자가 세션에 있다면 유저를 확인한후

같은 유저면 정보를 보여주고 다른유저다면 권한을 거절한다. #권한체크

2,3,4,5 는 사용자가 요청시마다 메모리에 업로드가 된다
다른사용자가 요청이 들어온다면 쓰레드가 늘면서 4개가 메모리에 뜨게 된다.
6 은 먼저 떠있다.


시나리오 1 :회원가입

1.회원가입이라는 요청이 디스패처를 통해 컨트롤러로 들어가게 된다면 컨트롤러는 회원가입 메서드를 찾을것이다

2.회원가입의 주소가 있을것이며 http:~/join~~~ , {body: username,password} 등이 들어올것이다.

3.이 데이터를가지고 service 에 회원가입해주라고 요청을 한다

4.컨트롤러에 들어오는 순간부터 데이터베이스에 연결이 시작되며 서비스에서는 transaction 이 시작된다.

5jparepository 에 인서트 해주라고 요청이가며 영속성건텍스트에 연락을 하고 없다면 db 에 인서트를 할것이다

6.가져온 데이터를 컨트롤러 까지 배달이 된다. 서비스가 끝나는 순간 transaction 종료가 되며(db 에 메모리에만 남아있는걸(아직 인서트안됨) 종료가 된다면 커밋이 된다. 커밋이 된다면 영구적으로 데이터베이스에 저장된다. 그전에는 메모리에 만 남아있다.

왜냐하면 롤백을 시켜야될수도 있고 상황들이 있기때문이다.

7.클라이언트 사이드 렌더링이라던지 서버사이드렌더링인지이 따라서 응답의 종류가 변할것이다.

시나리오 2 :송금요청

a -> b 500만원 송금요청

1.컨트롤러에서는 a,b 유저정보와 500만원의 송금정보를 서비스에 넘긴다.

2.서비스에서는 a를 업데이트한다 ex : a의 돈이 1000만원이라면 500으로 내려야되기때문에 레파지토리에 update 해줘라고 연락하고

3.jpa 는 영속성 컨텍스트에서 확인을 하는데 있다면 db 관계없이 정보가 있다면 바로 영속성컨텍스트의 오브젝트를 업데이트하고
서비스까지 가게 되면 트랜잭션 종료가되며 db로 자동으로 반영이된다.

영속성 컨텍스트에 그 정보의 객채가 없다면 db 에 요청을 하고 db에서부터 서비스로 돌아오게 된다.

  1. 서비스에서 a만 업데이트 정보를 돌려주면 되지 않는다. b도 업데이트를 해야된다 + 500 다시 요청이 반복된다.

(업데이트 요청 2번) 과정은 위와 동일

5.이제 모든 업데이트가 끝났으며 컨트롤러로 돌아가며 트랜잭션이 종료되고 db 에 커밋이 된다. 성공

만약 하나의 요청이라도 오류가 생긴다면?

2개가 모두 성공해야 커밋이 되야되며

하나라도 잘못되면 오류처리로 롤백을 해야한다. 메모리에 떠있는걸 삭제 커밋 x

이것들을 서비스에서 관리해서 서비스 부터 트랜잭션 처리를 한다.

서비스의 역할은 결국 하나의 기능을 담당. 그리고 기능을 수행하기 위해서는 데이터베이스에 요청을 담고 있을수 있다.

profile
《REACT》《JAVASCRIPT 》 만지고있어욤

0개의 댓글