WIL (Weekly I Learned) 220801-220807

BOSEUL KIM·2022년 8월 7일
0

TIL / WIL

목록 보기
6/9

이번 주 스프링 숙련 과제를 힘들게 마치고... 심화 과정이 시작되었습니다~
이번 주는 그래도 팀 과제라 그런지 부담이 조금은 덜한 느낌 ㅜ

그럼 이번 주 WIL 주제에 대해 정리해보겠습니다~

• ORM(Object Relational Mapping)

ORM이란 객체가 DB의 테이블이 매핑을 이루는 것을 말한다.
즉, 객체가 테이블이 되도록 매핑 시켜주는 것을 말하는데 ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메소드)로써 데이터를 조작할 수 있다.

예를 들면, User 테이블의 데이터를 출력하기 위해서는 MySQL에서는

SELECT * FROM user;

라는 query를 실행해야 하지만, ORM을 사용하면 User 테이블과 매핑된 객체를 user라 할 때,

user.findAll()

이라는 메소드 호출로 데이터 조회가 가능하다.
query를 직접 작성하지 않고 메소드 호출만으로 query가 수행되다 보니, ORM을 사용하면 생산성이 매우 높아진다. 하지만 query가 복잡해지면 ORM으로 표현하는데 한계가 있고, 성능이 raw query에 비해 느리다는 단점이 있는데, 그래서 JPQL, QueryDSL 등을 사용하거나 한 프로젝트 내에서 Mybatis와 JPA를 같이 사용하기도 한다.

• SQL(Structured Query Language)

→ SQL은 관계형 데이터베이스 시스템(RDBMS)에서 자료를 관리 및 처리하기 위해 설계된 언어이다. 1970년대에 IBM에서 최초 개발되었으며 관계형 모델이라는 이론에서 파생된 특징을 가지고 있는데, 현재 SQL의 표준으로 ANSI SQL이 정립되었다. 각 DBMS 프로그램에서 ANSI SQL을 기반으로 개발된 SQL을 사용하며 서로 근소한 차이를 보인다.

SQL 문법의 종류


- DDL(Data Definition Language, 데이터 정의 언어)
각 릴레이션을 정의하기 위해 사용하는 언어(CREATE, ALTER, DROP..)

- DML(Data Manipulation Language, 데이터 조작 언어)
데이터를 추가/수정/삭제하기 위한, 즉 데이터 관리를 위한 언어(SELECT, INSERT, UPDATE..)

- DCL(Data Control Language, 데이터 제어 언어)
사용자 관리 및 사용자별로 릴레이션 또는 데이터를 관리하고 접근하는 권한을 다루기 위한 언어(GRANT, REVOKE..)

SQL 언어적 특징


각 프로그래밍 언어가 가진 고유한 특성은 꼭 구별지어 알아두어야 사용할 때 오류를 줄일 수 있다. SQL은 다음과 같은 언어적 특성을 갖는다.

  1. SQL은 대소문자를 가리지 않는다.
    (단, 서버 환경이나 DBMS 종류에 따라 데이터베이스 또는 필드명에 대해 대소문자를 구분하기도 함)

  2. SQL 명령은 반드시 세미콜론(;)으로 끝나야 한다.

  3. 고유의 값은 따옴표('')로 감싸준다.
    ex) SELECT * FROM EMP WHERE NAME = 'James';

  4. SQL에서 객체를 나타낼 때는 백틱으로 감싸준다.

  5. 주석은 일종의 도움말로, 주석 처리된 문장은 프로그램에서 동작하지 않는다. 한 줄 주석은 문장 앞에 --를 붙여서 사용한다.

  6. 여러 줄 주석은 /**/로 감싸준다.

• MVC(Model, View, Controller)

Spring MVC


Spring MVC는 Spring에서 제공하는 웹 모듈로, Model, View, Controller 세가지 구성요소를 사용해 사용자의 다양한 HTTP Request을 처리하고 단순한 텍스트 형식의 응답부터 REST 형식의 응답은 물론 View를 표시하는 html을 return하는 응답까지 다양한 응답을 할 수 있도록해주는 프레임웍이다.

Spring MVC의 구조


Spring MVC의 주요 구성요소는 Model, View, Controller지만, 이들이 유기적으로 동작하도록 하기 위해 다양한 구성요소가 함께한다.

  • DispatcherServlet(Front Controller)
  • Handler(Controller)
  • ModelAndView
  • ViewResolver

DispatcherServlet : 제일 앞단에서 HTTP Request를 처리하는 Controller
Spring MVC에서는 HTTP Request가 왔을 때 DispatcherServlet이라 불리는 서블릿이 HTTP Request를 처리할 Controller을 지정한다. DispatcherServlet은 일종의 HTTP Request를 처리할 Controller을 지정하는 Controller로 Super Controller 역할을 한다. 
*이렇게 앞쪽에서 처리하는 컨트롤러를 두는 패턴을 Front Controller 패턴이라고 한다. 

Controller(Handler) : HTTP Request를 처리해 Model을 만들고 View를 지정
DispatcherServlet에 의해 배정된 Controller는 HTTP Request를 처리하고, HTTP Request의 메세지를 처리해 필요한 데이터를 뽑아 Model에 저장한다. 또한 HTTP Request에 따라서 HTTP가 보여줄 View Name를 지정한다. 이곳에서 View Name 뿐만 아니라, 직접 View를 반환할 수도 있다. 하지만 이곳에서 View에 Model의 데이터를 세팅하지는 않는다.
*위 그림에서는 편의상 View Name을 반환하는 Model And View를 만들었다.

ModelAndView: Controller에 의해 반환된 Model과 View가 Wrapping된 객체
Model : Map<String, Value> 형태의 데이터 저장소
Model은 Map자료 구조로, HTTP Request 속의 데이터를 파싱해 Key-Value 쌍으로 만들어 저장한다. 이 Model은 이후에 View를 그리기 위해 사용된다.

public ModelAndView(String viewName, @Nullable Map<String, ?> model) {
   this.view = viewName;
   if (model != null) {
      getModelMap().addAllAttributes(model);
   }
}

View, View Name : ViewResolver에서 그릴 View를 지정
ModelAndView 내부에는 View 혹은 View Name이 있는데, View가 지정되더라도 데이터가 세팅된 View가 지정되지 않는다.

ViewResolver :  ModelAndView를 처리하여 View를 그리기
ViewResolver에서는 ModelAndView 객체를 처리해 View를 그린다. 여기서는 모델에 저장된 데이터를 사용해 View를 그려준다.  View는 사용자에게 보여줄 완성된 View이며, 여기서 그려지는 View는 그대로 유저에게 반환된다. 우리가 특정한 url로 들어갔을 때 우리에게 보여지는 View가 바로 이곳에서 만들어지는 View이다.

Spring MVC의 의의


특히 Spring MVC는 HTTP Request를 처리하는 부분인 Controller, 데이터를 처리해 정제된 데이터를 넣는 Model, 정제된 데이터를 활용해 사용자에게 보여지는 View에 대한 역할 분리를 잘 해놓았다. Spring MVC를 사용하면 Model, View, Controller 모두를 인터페이스를 사용해 규격화해놓아 유연하고 확장성 있게 웹 어플리케이션을 설계할 수 있다.

0개의 댓글