SQL을 알아보기 전에 DBMS(Database Management System)을 알아보자
데이터베이스란?
대량의 정보를 컴퓨터가 효율적으로 접근할 수 있도록 가공 및 저장한 것이다.
DBMS란?
다수의 사용잘들이 데이터베이스 내 데이터를 접근할 수 있도록 해주는 소프트웨어 도구 집합이다.
key와 value의 간단한 관계를 테이블 형식으로 나타낸 데이터베이스이다. 하나의 데이터베이스에는 여러 개의 테이블이 존재한다.
관계형 데이터베이스를 생성, 갱신, 관리하기 위한 시스템이다. 레코드 단위로 읽기/쓰기가 이루어진다.
클라이언트가 요청을 보낼 때 주로 사용하는 언어가 SQL이다.
SQL은 RDBMS에 저장된 데이터와 통신하기 위해 필요한 프로그래밍 언어이다.
명령어
크게 4가지 그룹으로 나뉜다.
데이터 타입
ORM 장단점
스프링 MVC는 프로트 컨트롤러 패턴으로 구현되어 있다. 그리고 프론트 컨트롤러가 DispatcherServlet 이다.
org.springframework.web.servlet.DispatcherServlet
DispatcherServlet도 부모 클래스로 HttpServlet을 상속 받아 사용하고, 동작한다.
위 그림은 DispatcherServlet의 다이어그램이다. DispatcherServlet -> FrameworkServlet -> HttpServletBean -> HttpServlet 으로 상속받는다.
HttpServlet의 service() 호출로 FrameworkServlet.service()가 시작된다. 여러 메서드가 시작되면서 DispatcherServlet.doService()가 호출되고 DispatcherServlet의 핵심인 doDispatch() 코드가 실행된다. doDispatch()에 SpringMVC의 모든 구조가 다 들이 있다.
DispatcherServlet.doDispatch()
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
try {
ModelAndView mv = null;
try {
// 1. 핸들러 조회
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
// 2. 핸들러를 처리할 수 있는 핸들러 어댑터 조회
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// 3. 핸들러 어댑터 실행 -> 4. 핸들러 어댑터를 통해 핸들러 실행 -> 5. ModelAndView 반환
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
}
}
private void processDispatchResult(HttpServletRequest request, HttpServletResponse response, @Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv, @Nullable Exception exception) throws Exception {
if (mv != null && !mv.wasCleared()) {
// view 랜더링 호출
render(mv, request, response);
}
}
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
View view;
String viewName = mv.getViewName();
if (viewName != null) {
// 6. view 리졸버를 통해 view 찾기 -> 7. view 반환
view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
}
// 8. view 렌더링
view.render(mv.getModelInternal(), request, response);
}
스프링MVC의 큰 강점은 DispatcherServlet 코드의 변경 없이 원하는 기능을 변경하거나 확장할 수 있다는 것이다. 대부분을 확장 가능하게 인터페이스로 제공한다.