#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을 빼고, 한 페이지에 보여질 데이터의 수를 곱한다.

+ Recent posts