항해 4주차 WIL

백승한·2022년 7월 17일
0

ORM

ORM에 대한 개념적인 부분은 TIL로 정리를 해두었다.
오늘은 성능 이슈와 관련된 N+1 Problem 를 알아보았다.

N+1 Problem

ORM 에서 성능 이슈가 발생하면 가장 흔한 원인으로 N+1 Problem이 언급된다.

N+1 Problem은 연관 관계가 설정된 엔티티를 조회할 경우에 발생한다.
쿼리 1번으로 N건의 데이터를 조회했는데, 조회된 N 건의 데이터 수 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상

실무에서 N+1문제로 DB가 죽어버리는 문제를 방지하기 위해서는 어떻게 해야 할까?

우선 연관관계에 대한 설정이 필요하다면 FetchType을 성능 최적화를 하기 어려운 즉시 로딩(EAGER)을 사용하는 게 아니라 지연 로딩 (LAZY) 모드로 사용을 하고 성능 최적화가 필요한 부분에서는 Fetch 조인을 사용한다.
또한 기본적으로 Batch Size의 값을 1000 이하로 설정한다. (대부분의 DB에서 IN절의 최대 개수 값 : 1000)

그 외에 팀바팀이긴 한데 꼭 연관관계 설정이 필요 없다면 N+1 문제로 인하여 DB가 죽어버리는 불상사를 막기 위해 연관관계를 끊어버리고 사용하는 것도 방법이다.

SQL

SQL이란?

구조적 질의 언어(Structured Query Language)인 SQL은

관계 데이터베이스에 저장된 데이터를 적재, 조작, 검색하기 위한 컴퓨터 언어를 말합니다.

SQL은 관계 데이터베이스 시스템을 위한 표준 언어입니다.

MySQL, MS Access, Oracle, Sybase, Infomix, postgres, SQL Server와 같은 모든 관계 데이터베이스 관리 시스템은

표준 데이터베이스 언어로 SQL을 사용하고 있습니다.

또한, 이러한 데이터베이스 관리 시스템은 다음과 같은 다양한 방언을 사용하고 있습니다.

  • T-SQL을 사용하는 MS SQL Sever,

  • PL/SQL을 사용하는 Oracle,

  • JET SQL(기본 형식)이라 불리는 SQL의 MS Access 버전 등

SQL 명령어

표준 SQL 명령은 관계 데이터베이스와의 상호작용을 위해 CREATE, SELECT, INSERT, UPDATE, DELETE, DROP으로 이루어져 있습니다.

이 명령어들은 각각의 성격에 따른 그룹으로 분류할 수 있습니다.

1) DDL - Data Definition Language(데이터 정의어)

  • CREATE: 새로운 테이블, 뷰 또는 데이터베이스의 다른 개체를 생성

  • ALTER: 테이블과 같이 존재하는 데이터베이스 개체를 수정

  • DROP: 테이블 전체, 뷰 또는 데이터베이스의 다른 개체를 삭제

2) DML - Data Manipuation Language(데이터 조작어)

  • INSERT: 레코드를 생성

  • UPDATE: 레코드를 수정

  • DELETE: 레코드를 삭제

3) DCL - Data Control Language(데이터 제어어)

  • GRANT: 사용자에게 권한을 부여

  • REVOKE: 사용자로부터 부여된 권한을 회수

4) DQL - Data Query Language(데이터 질의어)

  • SELECT: 1개 또는 그 이상의 테이블로부터 조건에 맞는 레코드를 조회

Spring MVC

Spring MVC란 무엇인가?

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

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

Spring MVC의 구조

Spring MVC의 주요 구성요소는 Model, View, Controller지만, 이들이 유기적으로 동작하도록 하기 위해 다양한 구성요소가 함께한다. 우리는 이 글에서 MVC 뿐만 아니라 구성요소에 대해서도 다룰 것이다.

  • 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 역할을 한다. 

Controller(Handler) : HTTP Request를 처리해 Model을 만들고 View를 지정

DispatcherServlet에 의해 배정된 Controller는 HTTP Request를 처리하고, HTTP Request의 메세지를 처리해 필요한 데이터를 뽑아 Model에 저장한다. 또한 HTTP Request에 따라서 HTTP가 보여줄 View Name를 지정한다. 이곳에서 View Name 뿐만 아니라, 직접 View를 반환할 수도 있다. 하지만 이곳에서 View에 Model의 데이터를 세팅하지는 않는다.
* 위 [그림1]에서는 편의상 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, @Nuallable 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이다.

참고1
참고2
참고3

profile
방문해주셔서 감사합니다🙂

0개의 댓글