스프링 1주차 강의를 완강했다.
오늘의 본격적인 수업 내용은 클라이언트가 서버에게 요구할때 방식에 대해, 그리고 요청된 방식에 맞게 요청을 반환하는 방식에 대해 주로 배웠다. 또한 웹 코딩은 DB와 함께 하기에 DB를 어떻게 다루는지도 같이 배웠다. 오늘 배운 양이 조금 많지만 그래도 천천히 정리해보자.
지난 개인과제/팀프로젝트를 통해 우리는 MVC 모델을 사용하고/공부했다. 하지만 내생각에 기존의 쓰임만큼 정확히 분리된 역할을 하지 않았다. 드디어 오늘 SpringMVC를 배우면서 내가 개념도 모르고 추상적으로만 알고있던 MVC에 대해 배우고, 실습했다. MVC에 대해 알아보자.
MVC란 Model, View, Controller로 이루어진 디자인 패턴이다. 각각의 역할을 분리한 정형화된 패턴이라 할 수 있다.
Model은 비즈니스 로직을 담고 있으며 DB와 연동되어 데이터를 저장하고, 불러온다.
View는 사용자 인터페이스를 담당한다. 사용자가 보는 화면, 버튼 등을 관리한다.
Controller는 Model과 View 사이에서 상호작용한다. View에서 들어온 사용자 입력에 대해 Model에게 전달해주고, Model이 출력하는 결과값을 View에게 주어 View가 뿌려줄 수 있게 해준다.
SpringMVC란 servlet API를 기반으로 구축된 웹 프레임워크이다. Spring MVC는 중앙에 있는 DispatcherServlet이 요청을 처리하기 위한 공유 알고리즘을 제공하는 Front Controller 패턴을 중심으로 설계되어 있으며 이 모델은 유연하고 다양한 워크 플로우를 지원한다.
말이 어렵지만 쉽게 표현해서 Spring에서 MVC 모델을 적용하여 HTTP 요청을 효율적으로 처리하고 있다. 정도로 이해했다.
위에 나온 servlet이 무엇일까? 서블릿은 자바를 이용하여 웹페이지를 동적으로 생성하는 서버 프로그램이다.
서블렛이 작동하는 순서에 대해 알아보자.
1. 클라이언트가 서버에게 API(HTTP request)를 요청한다.
2. 요청받은 서블렛 컨테이너는 servletRequst, servletResponse 객체를 생성한다.
3. 설정된 정보에서 어떤 servlet 요청인지 분석
4. 해당 servlet에서 service 메서드를 찾아서 doGet()이든~ doPost()~든 맞는 메서드를 호출
5. 호출한 메서드 결과를 servletResponse 객체에 담아 다시 클라이언트에게 반환한다.
6. 응답이 완료되면 생성된 servleetRequest, servletResponse 객체는 소멸된다.
만약 클라이언트가 요청하는 API가 많다면 위의 방식은 그에 해당하는 servlet을 모두 구현해야 하기 때문에 코드 작성 양이 많아지겠지만, 무적 Spring은 DispatchServlet을 사용하여 FrontController를 통해 효율적으로 대응한다.
DispatcherServlet의 동작 방식에 대해 알아보자.
1. 클라이언트에게 API 요청이 들어오면 DispatcherServlet이 요청을 분석한다.
2. 분석한 요청을 토대로 Handler mapping을 통해 controller를 찾아 요청을 전달한다.
3. controller는 요청에 대해 처리 후 결과를 View에게 전달
4. DispatcherServlet이 클라이언트에게 정보를 View를 통해 전달한다.
이를 통해 스프링을 이용하여 서버와 클라이언트가 어떻게 통신하는지에 대해 배웠다. 더 많은 것을 배웠으나 오늘 다 적기엔 무리가 있으니 다음에 다시 정리하는 시간을 갖도록 하자.
또한 오늘은 DB를 다루는 기초에 대해 배웠다.
DB의 종류는 굉장히 다양하고 우리는 스프링과 호환성이 좋은 MySql을 이용하여 공부하기로 했다.
오늘 배운것은 기본적인 DB 다루기이다. 테이블을 생성하고, 데이터를 저장하고, 삭제하고 업데이트 하는 등등의 작업을 했다. 그중에 기억해야 할 것은 제약조건인듯 하다.
- AUTO_INCREMENT : 컬럼의 값이 중복되지 않게 1씩 자동으로 증가하게 해줘 고유번호를 생성해 줍니다.
- CREATE TABLE 테이블이름 ( 필드이름 필드타입 AUTO_INCREMENT, // id bigint AUTO_INCREMENT, ... );
- NOT NULL : 해당 필드는 NULL 값을 저장할 수 없게 됩니다.
- CREATE TABLE 테이블이름 ( 필드이름 필드타입 NOT NULL, ... );
- UNIQUE : 해당 필드는 서로 다른 값을 가져야만 합니다.
- CREATE TABLE 테이블이름 ( 필드이름 필드타입 UNIQUE, ... );
- PRIMARY KEY : 해당 필드가 NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가지게 됩니다.
이런 제약조건을 달아서 테이블을 생성할 때 컬럼의 제약조건을 걸 수 있다. 이런 제약 조건을 통해 데이터베이스의 무결성을 확보할 수 있다.
또한 오늘은 DB 3개를 JOIN하고, 쿼리를 작성하여 내가 원하는 값들만 뽑아오는 작업, ALTER을 통해 부모 데이터 베이스의 데이터가 지워질 때 상속받은 데이터베이스들의 컬럼도 같이 지워지는 작업 등 아주 간단한 숙제를 진행했다. 물론 나는 이 숙제를 하는데 너무 어려워서 2시간이 걸렸다. 그래도 스스로 정답을 찾고, 구글링을 하고, 문법에 익숙해져가는 게 초급 공부의 핵심이라 생각한다. 아무튼! 오늘 배운것들 쉽지 않았고 낯설었지만 자주 반복해서 보면서 익숙해지도록 하자.
자바도 결국 익숙해진 순간부터는 문법을 찾는 일은 없었으니까