#1. Service Layer
1. Service 계층 이해하기
1) Service 계층이란?
- 웹 페에지에서 구현 해야하는 모든 기능을 하나의 컨트롤러 함수에서 모두 구현할 경우, 한 페이지에서 구현해야 하는 내용이 지나치게 많아진다.
- 때문에 효율적이지 못하고, 코드의 유지보수에도 좋지 않다.
- Service 계층은 하나의 페이지가 구현해야 하는 기능 중 저수준의 데이터 처리로직(SQL수행)과 웹 고유의 기능(요청에 대한 응답, UI구현)을 분리하고, 이를 연결해 주는 역할을 수행한다.
- 데이터베이스를 처리하는 코드를 모듈화 시키는것이 서비스 계층의 취지이다.
- 하나의 기능을 수행하기 위해 2개 이상의 SQL문을 연속적으로 수행해야 한다면 이를 하나의 단위 기능으로 묶어 요구사항을 표현한다.
2) Service 계층 이해하기
- Controller: 사용자의 요청을 받고 화면에 표시하기 위한 UI(자바스크립트에서는 JSON, URL을 수신하고 URL안에 있는 파라미터를 추출)를 구성한다.
- Service: 요청에 필요한 요구사항을 구현한다. (데이터 연동)
- DAO(Data Access Object): 저 수준의 데이터 입출력을 구현한다. (MyBatis, sequelize)
3) 요구사항
- 도출된 요구사항을 구현하기 위한 일련의 처리 로직을 비지니스 로직이라 한다.
- 비지니스 로직을 표현하기 위한 기능 단위는 프로젝트의 요구사항에 부합해야 하므로, 요구사항 명세서가 명시하고 있는 기능들에 대해 클래스로 표현한다.
#2. 페이지 번호 구현
1. 페이지 번호 구현
목록 조회시 모든 데이터를 한번에 조회할 경우 성능에 큰 영향을 미치기 때문에 데이터를 분할아혀 조회하는 기법이다.
1) 페이지 번호 구현을 위한 변수 예시
변수명 | 설명 |
nowPage | 현재 페이지 번호. Controller에 파라미터로 전달된다. |
totalCount | 전체 데이터의 수. 검색조건이 지정된 경우 검색 결과의 수로 처리된다. |
listCount | 한 페이지에 보여질 데이터의 수. LIMIT절에서 사용된다. |
groupCount | 한 번에 보여질 페이지 번호의 수. 개발자가 직접 변수로 정의한다. |
totalPage | 전체 페이지 수 |
prevGroupLastPage | 이전 그룹의 마지막 페이지. 첫 번째 그룹에서는 0으로 처리한다. |
nextGroupFirstPage | 다음 그룹의 첫 번째 페이지. 마지막 그룹에서는 0으로 처리한다. |
groupStart | 현재 페이지 그룹의 시작 번호 |
groupEnd | 현재 페이지 그룹의 끝 번호 |
offset | SQL의 LIMIT절에서 사용할 조회 시작 위치 |
※ nowPage, totalCount, listCount, groupCount는 계산을 통해 얻는게 아니라 개발자가 직접 값을 정하거나 데이터베이스를 통해 얻어와야 한다.
2) 주요 계산 식
- 전체 페이지 수
totalPage = parseInt(((totalCount - 1) / listCount)) + 1;
- 전체 데이터 수에서 1을 빼고, 한 페이지에 보여질 데이터 수로 나눈다.
- 그 후 정수로 변환하고 1을 더한다.
- 전체 그룹 수
totalGroup = parseInt(((totalPage) - 1) / (groupCount)) + 1;
- 전체 페이지 수에서 1을 빼고, 한 번에 보여질 페이지 번호의 수로 나눈다.
- 그 후 정수로 변환하고 1을 더한다.
- 현재 페이지가 속한 그룹
nowGroup = parseInt(((nowPage - 1) / groupCount)) + 1;
- 현재 페이지 번호에서 1을 빼고, 한번에 보여질 페이지 번호의 수로 나눈다.
- 그 후 정수로 변환하고 1을 더한다.
- 현재 그룹의 시작 페이지 번호
groupStart = parseInt(((nowGroup - 1) * groupCount)) + 1;
- 현재 페이지가 속한 그룹에서 1을 빼고, 한 번에 보여질 페이지 번호의 수를 곱한다.
- 그 후 정수로 변환하고 1을 더한다.
- 현재 그룹의 마지막 페이지 번호
groupEnd = Math.min(totalPage, nowGroup * groupCount);
- 전체 페이지수와 현재 그룹에 한 번에 보여질 페이지 번호의 수를 곱한 값 중 작은 값을 가져온다.
- 이전 그룹의 마지막 페이지 번호
prevGroupLastPage = 0;
if (groupStart > groupCount) { prevGroupLastPage = groupStart - 1; }
- 현재 페이지 그룹의 시작 번호가 한 번에 보여질 페이지 번호의 수 보다 크다면, 이전 그룹의 마지막 페이지 변수에 현재 페이지 그룹의 시작 번호에 1을 뺀 값을 대입한다.
- 다음 그룹의 시작 페이지 번호
nextGroupFirstPage = 0;
if (groupEnd < totalPage) { nextGroupFirstPage = groupEnd + 1; }
- 현재 페이지 그룹의 끝 번호가 전체 페이지 수 보다 작다면, 다음 그룹의 첫 번째 페이지 변수에 현재 페이지 그룹의 끝 번호에 1을 더한 값을 대입한다.
- LIMIT 절에서 사용할 데이터 시작 위치
offset = (nowPage - 1) * listCount;
- 현재 페이지 번호에 1을 빼고, 한 페이지에 보여질 데이터의 수를 곱한다.
'국비수업 > Node.js' 카테고리의 다른 글
[Node.js] CORS / MVC 패턴 (0) | 2022.07.10 |
---|---|
[Node.js] 객체지향 데이터베이스 프로그래밍 (Mybatis) (0) | 2022.07.07 |
[Node.js] MySQL 연동하기 (0) | 2022.07.06 |
[Node.js] SingleTon 패턴 (0) | 2022.07.06 |
[Node.js/express] File Upload (0) | 2022.07.04 |