유투브 메타코딩 스프링작동원리 정리
@RestController 이다면 데이터를 응답하는 컨트롤러이고
@Controller 는 HTML 페이지를 내보내주는 컨트롤러이다.
예를들어 / 라는 곳으로 이동하라고 했다면 데이터보다는 페이지를 응답해주는 것으로서 ViewResolver 가 작동한다
ViewResolver 는 페이지를 만들어서 응답한다
그렇다면 컨트롤러에서 "/" 리턴하겠지만 정확하게 예를들어 "home" 을 리턴했을때 프로젝트에서 home이라는 페이지(jsp)
를 찾는다 그리고 사용자에게 응답을 해준다.
@RestController 라면 viewresolver 가 작동하지 않으며 "home" 이라는 글씨 자체를 리턴해줄것이다.
ex /user/1 을 요청을 했을때 1번유저의 정보를 보는 요청이라고 한다면 이 함수가 시작된다면
모든사용자에게 보여주면 안되기때문에. 실행직전 인터셉터가 동작하면서 지금 들어오는 사용자가 세션에 있다면 유저를 확인한후
같은 유저면 정보를 보여주고 다른유저다면 권한을 거절한다. #권한체크
2,3,4,5 는 사용자가 요청시마다 메모리에 업로드가 된다
다른사용자가 요청이 들어온다면 쓰레드가 늘면서 4개가 메모리에 뜨게 된다.
6 은 먼저 떠있다.
1.회원가입이라는 요청이 디스패처를 통해 컨트롤러로 들어가게 된다면 컨트롤러는 회원가입 메서드를 찾을것이다
2.회원가입의 주소가 있을것이며 http:~/join~~~ , {body: username,password} 등이 들어올것이다.
3.이 데이터를가지고 service 에 회원가입해주라고 요청을 한다
4.컨트롤러에 들어오는 순간부터 데이터베이스에 연결이 시작되며 서비스에서는 transaction 이 시작된다.
5jparepository 에 인서트 해주라고 요청이가며 영속성건텍스트에 연락을 하고 없다면 db 에 인서트를 할것이다
6.가져온 데이터를 컨트롤러 까지 배달이 된다. 서비스가 끝나는 순간 transaction 종료가 되며(db 에 메모리에만 남아있는걸(아직 인서트안됨) 종료가 된다면 커밋이 된다. 커밋이 된다면 영구적으로 데이터베이스에 저장된다. 그전에는 메모리에 만 남아있다.
왜냐하면 롤백을 시켜야될수도 있고 상황들이 있기때문이다.
7.클라이언트 사이드 렌더링이라던지 서버사이드렌더링인지이 따라서 응답의 종류가 변할것이다.
a -> b 500만원 송금요청
1.컨트롤러에서는 a,b 유저정보와 500만원의 송금정보를 서비스에 넘긴다.
2.서비스에서는 a를 업데이트한다 ex : a의 돈이 1000만원이라면 500으로 내려야되기때문에 레파지토리에 update 해줘라고 연락하고
3.jpa 는 영속성 컨텍스트에서 확인을 하는데 있다면 db 관계없이 정보가 있다면 바로 영속성컨텍스트의 오브젝트를 업데이트하고
서비스까지 가게 되면 트랜잭션 종료가되며 db로 자동으로 반영이된다.
영속성 컨텍스트에 그 정보의 객채가 없다면 db 에 요청을 하고 db에서부터 서비스로 돌아오게 된다.
(업데이트 요청 2번) 과정은 위와 동일
5.이제 모든 업데이트가 끝났으며 컨트롤러로 돌아가며 트랜잭션이 종료되고 db 에 커밋이 된다. 성공
2개가 모두 성공해야 커밋이 되야되며
하나라도 잘못되면 오류처리로 롤백을 해야한다. 메모리에 떠있는걸 삭제 커밋 x
이것들을 서비스에서 관리해서 서비스 부터 트랜잭션 처리를 한다.
서비스의 역할은 결국 하나의 기능을 담당. 그리고 기능을 수행하기 위해서는 데이터베이스에 요청을 담고 있을수 있다.