request : 요청하는 쪽은 요청받는 쪽의 ip 주소, url(자원요청주소) 알아야
response: 응답하는 쪽은 응답받는 쪽의 주소 모름
-> 갑이 다른 을에게 무언가 보내고 싶다면 지속적으로 유지되는 소켓 필요
웹서버 ex) 아파치
- static 자원을 응답
- .jsp(자바코드) 이해X
아파치 + 톰켓
&39;아파치가 이해할 수 없는 파일은 톰켓에 넘김
-> 톰켓은 .jsp 속 모든 자바코드를 컴파일
-> 컴파일된 결과를 .html 파일로 만들어 아파치에 반환
-> 아파치는 .html 파일을 응답
출처 : https://minwan1.github.io/2018/11/21/2018-11-21-jsp-springboot-%EB%8F%99%EC%9E%91%EA%B3%BC%EC%A0%95/
request(java 자원 요청) 시 처음이라면 : new 객체, 스레드1
1) 서블릿 객체 생성
2) 서블릿 객체의 init() 메소드 호출
3) 서블릿 객체의 service() 메소드 호출 : 스레드1
: POST, GET, put, delete 중 무엇인지 체크 -> 그 메소드 호출
ex) get이라면 get() 메소드 호출 : DB연결, 데이터, html 담아서 응답
request 시 처음이 아니라면 : 객체 재사용, 새로운 스레드
1) service() 메소드 호출 : 새로운 스레드
: POST, GET, put, delete 중 무엇인지 체크 -> 그 메소드 호출 :
c.f. 같은 객체인데 왜 스레드가 여러 개일 수 있을까?
자바에서 클래스 메소드는 heap에 저장
-> 메소드 호출 시 메소드 호출에 이용되는 정보는 스택에 저장
-> 호출될 때마다 스택에 따로 저장됨
-> 같은 객체여도 스레드가 여러개인 것!!
톰켓 기본 설정
- 스레드 Auto 설정 시 20개 : 최대 스레드는 20개(21번째는 대기)
: 재사용 pooling 기법
최대 스레드 수가 너무 적은 경우
: scale-up(컴퓨터 업그레이드), scale-out(컴퓨터 수 늘림)
요청이 url or 자바 파일 -> 톰켓(web.xml -> frontController)
특정 주소의 request를 FrontController가 낚아 챔 -> request
A의 request, response 정보를 톰켓이 메모리에 저장
frontController에서 주소 낚아채서 다시 request 시,
기존 A의 request, response 정보를 frontController의 request, response 정보로 덮어 써야
기존 A의 request, response 정보를 따로 유지하고 싶으면? : RequestDispatcher 사용
: frontcontroller 패턴 + requestdispatcher
= root-applicationContext + servlet-applicationContext
싱글톤으로 관리됨 -> 어디에서 접근하든 동일한 객체임을 보장함
ViewResolver, Interceptor, MultipartResolver 객체를 생성
웹과 관련된 어노테이션만 스캔
해당 파일은 DispatcherServlet에 의해 실행됨
root-applicationContext에서 로드한 객체 참조 가능
그 외 어노테이션 스캔 ex) Service, Repository, ...
DB 관련 객체 생성
해당 파일은 contextloaderlistener에 의해 실행됨
servlet-applicationContext보다 먼저 로드됨 (contextloaderlistener은 web.xml에 의해 실행되므로)
servlet-applicationContext에서 로드한 객체 참조 불가 (생성시점 다르므로)
출처: https://minwan1.github.io/2018/11/21/2018-11-21-jsp-springboot-%EB%8F%99%EC%9E%91%EA%B3%BC%EC%A0%95/
@configuration
class A {
@Bean
객체 메소드(){
return 객체();
}
}
A{
String Hello(){
return "hello"; // viewresolver -> web-inf/views/hello.jsp로
}
}
A{
@ResponseBody
String Hello(){
return user; // 메시지 컨버터가 json으로 바꾸어 response
// {"id": 1, "name"; "홍길동"}
}
}
user {
int id = 1
String name = "홍길동"
}
출처 : https://asfirstalways.tistory.com/334
출처 : 인프런 "스프링부트 개념정리(이론)" 8~14강
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC#reviews
https://getinthere.tistory.com/11