본문으로 건너뛰기

서버 프로그램의 구조: MVC·DAO·DTO

정보처리기사 목차서버 프로그램레슨 151 / 233

목차

서버 프로그램은 요청을 받아 업무 규칙대로 처리하고 데이터베이스를 읽고 쓰는 프로그램입니다. 일을 컨트롤러·서비스·DAO 층으로 나누고, 층 사이로는 값을 DTO에 담아 넘깁니다.

개발환경 구축에서 WAS가 돌리던 프로그램이 서버 프로그램입니다. 그 안에 요청 받기, 업무 규칙, SQL을 한 덩어리로 섞어 짜면, 우수 기준 점수 하나를 바꿀 때도 덩어리 전체를 뒤져야 합니다. 그래서 일의 종류마다 맡는 층을 따로 둡니다. 아래 그림은 101번 학생의 성적 요청 하나가 층을 내려갔다가, 데이터베이스의 행이 DTO에 담겨 올라오는 길을 보입니다.

7단계 중 1단계. 서버 프로그램은 일을 층으로 나눕니다. 컨트롤러는 요청을, 서비스는 업무 규칙을, DAO는 데이터베이스 읽고 쓰기를 맡습니다.

1층마다 맡는 일 — 컨트롤러·서비스·DAO

컨트롤러(controller)는 화면에서 온 요청을 맨 먼저 받습니다. 요청에서 학번 같은 값을 꺼내 확인하고, 일을 서비스에 맡긴 뒤 결과를 화면에 넘깁니다. 서비스(service)는 평균을 내고 '80 이상이면 우수'처럼 업무에서 정한 규칙대로 계산하고 판단합니다. DAO(Data Access Object)는 데이터베이스에 닿는 일만 맡는 객체입니다.

가르는 기준컨트롤러서비스DAO
받는 것화면에서 온 요청컨트롤러의 부탁서비스의 부탁
하는 일값을 꺼내 확인하고 결과를 넘긴다업무 규칙대로 계산·판단한다SQL로 데이터베이스를 읽고 쓴다
모르는 것SQL·업무 규칙화면 꼴·SQL화면 꼴·업무 규칙

이 짜임을 MVC 패턴으로 보면, 컨트롤러는 그대로 컨트롤러이고 서비스·DAO·DTO는 데이터와 업무 처리를 맡는 모델(model) 쪽이며 화면이 뷰(view)입니다. MVC는 1과목 5단원에서 배웁니다. 스프링(Spring) 같은 서버 개발 프레임워크는 이 층을 틀로 주어, 층마다 @Controller·@Service·@Repository(DAO 자리) 표시를 달게 합니다.

2층 사이를 오가는 값 — DTO와 VO

DTO(Data Transfer Object)는 층과 층 사이에서 값을 묶어 나르는 객체입니다. 값을 담는 칸과, 값을 넣고 꺼내는 메서드(setter·getter)만 두고 계산은 하지 않습니다. 그림에서 DAO가 행마다 하나씩 만든 카드가 DTO입니다.

class ScoreDto {
  private String courseCode;
  private int score;

  int getScore() {
    return score;
  }

  void setScore(int score) {
    this.score = score;
  }
}

VO(Value Object)는 값 그 자체를 나타내는 객체입니다. 시작일과 끝날을 묶은 기간이 예입니다. 한 번 만들면 값을 바꾸지 않는 읽기 전용이고, 속성값이 같으면 같은 것으로 봅니다.

가르는 기준DTOVO
무엇에 쓰나층 사이에서 값을 나른다값 자체를 나타낸다
값을 바꾸나setter로 넣고 바꾼다만든 뒤 바꾸지 않는다
값이 같으면 같은 것인가따지지 않는다같은 것으로 본다

실무 코드에는 DTO에 VO라는 이름을 붙인 클래스도 많습니다. 예전 Java 자료가 DTO를 VO라고 불렀던 흔적이고, 시험은 위 표처럼 가릅니다.

3나눠서 얻는 것 — 고칠 곳이 한 층에 모인다

SQL은 DAO에만 있으므로, 데이터베이스를 다른 제품으로 옮겨도 DAO만 고칩니다. 업무 규칙이 바뀌면 서비스만, 요청을 받는 꼴이 바뀌면 컨트롤러만 고칩니다. 위층은 아래층이 어떻게 일하는지 모르고 부탁만 하기 때문입니다.

요청에서 꺼낸 값이 SQL에 그대로 섞여 들어가면, 값을 보낸 쪽이 데이터베이스를 마음대로 다룰 수 있습니다. 서버 프로그램을 짤 때 이런 약점을 찾아 막는 일을 보안 취약성 식별이라 하고, 4과목 '시큐어 코딩: 입력이 명령이 되는 약점'에서 자세히 배웁니다.

예제

그림의 DAO가 보내는 SQL을 돌리면 101번 학생의 행 셋이 나옵니다.

SELECT 과목코드,
  점수
FROM 수강
WHERE 학번 = 101
ORDER BY 과목코드;
과목코드점수
DS85
NW80
OS75

행 하나가 DTO 하나가 되어 올라가고, 층마다 값이 이렇게 바뀝니다.

층받는 것넘기는 것
컨트롤러요청 101 성적학번 101
서비스학번 101DAO에 행을 청한다
DAO행을 달라는 부탁위 SQL의 행 셋을 DTO 셋으로
서비스DTO 셋평균 80, 80 이상이라 우수
컨트롤러결과 DTO화면에 101 평균 80 우수

우수 기준이 '85 이상'으로 바뀌면 서비스만 고치고 SQL과 DAO는 그대로입니다. 이 학생은 우수에서 빠집니다.

시험 포인트

  • 필기: 서버 프로그램은 컨트롤러(요청 받기)·서비스(업무 규칙)·DAO(데이터베이스 접근)로 층을 나누고, 층 사이로는 DTO에 값을 담아 나릅니다. DAO는 SQL과 데이터베이스 연결을 숨겨, 데이터베이스를 바꿔도 DAO만 고칩니다. DTO는 계산 없이 값을 나르는 객체(getter·setter), VO는 값 자체를 나타내는 읽기 전용 객체입니다. 오답 보기는 일을 다른 층에 붙입니다 — 'SQL은 서비스가 만든다', 'DTO가 점수를 계산한다', 'VO는 값을 바꿔 가며 나른다'.
  • 실기: DAO(Data Access Object)·DTO(Data Transfer Object)·VO(Value Object)로 씁니다.

확인 문제

1. 어느 쇼핑몰 서버 프로그램의 코드 조각 넷입니다. 서비스 층에 둘 것을 고르세요.

  • ① 요청 주소에서 상품 번호를 꺼내고, 숫자가 아니면 오류 응답을 고른다
  • ② 회원 등급이 골드이면 주문 금액에서 10%를 깎는다
  • ③ 상품 표에서 번호가 같은 행을 SELECT 문으로 읽는다
  • ④ 상품 번호·이름·값을 담는 칸과 넣고 꺼내는 메서드만 있다
정답

②입니다. 등급에 따라 깎아 주는 것은 업무에서 정한 규칙이라 서비스가 맡습니다.

  • ① 요청에서 값을 꺼내 확인하고 응답을 고르는 일은 컨트롤러의 몫입니다.
  • ③ SQL로 데이터베이스를 읽는 일은 DAO만 합니다.
  • ④ 값을 담아 나르기만 하는 객체는 DTO입니다. 층이 아니라 층 사이를 오가는 값입니다.

2. 다음 (가)~(다)에 맞는 이름을 영문 약어와 원어로 함께 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) 회원 정보를 읽고 쓰는 SQL이 모두 이 객체 안에만 있습니다. 데이터베이스를 다른 제품으로 옮길 때 이 객체만 고쳤습니다.
  • (나) 주문 번호·수량·금액을 담아 컨트롤러와 서비스 사이를 오갑니다. 값을 넣고 꺼내는 메서드뿐이고 계산은 하지 않습니다.
  • (다) '3000원'처럼 금액과 통화를 묶어 나타냅니다. 한 번 만들면 바꿀 수 없고, 금액과 통화가 같으면 같은 것으로 봅니다.
정답

받는 답: (가) DAO(Data Access Object) · (나) DTO(Data Transfer Object) · (다) VO(Value Object)

(가)의 실마리는 'SQL이 모두 이 안에만 있고 데이터베이스를 옮길 때 이것만 고친다', (나)는 '층 사이를 오가며 값만 나른다', (다)는 '바꿀 수 없고 값이 같으면 같다'입니다.

  • 틀리는 꼴 서비스 — (가)에: 업무 규칙을 맡는 층입니다. SQL은 모르고 DAO에 부탁합니다.
  • 틀리는 꼴 VO — (나)에: 값 자체를 나타내는 읽기 전용 객체입니다. (나)는 값을 넣고 바꾸며 층 사이를 나릅니다.
  • 틀리는 꼴 DTO — (다)에: 값을 넣고 바꾸며 나르는 객체입니다. (다)는 만든 뒤 바꿀 수 없습니다.

3. 1번의 쇼핑몰에 바뀔 일 셋이 생겼습니다. 각각 어느 층을 고쳐야 하는지 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (1) 골드 회원의 할인을 10%에서 15%로 올립니다.
  • (2) 데이터베이스를 다른 제품으로 옮겨 SQL 문법 일부가 달라졌습니다.
  • (3) 상품 번호를 요청 주소가 아니라 입력 칸으로 받게 바뀌었습니다.
정답

받는 답: (1) 서비스 · (2) DAO · (3) 컨트롤러

(1)은 업무 규칙이 바뀐 것이라 규칙을 가진 서비스만 고칩니다. (2)는 SQL이 바뀐 것이라 SQL을 가진 DAO만 고칩니다. (3)은 요청을 받는 꼴이 바뀐 것이라 요청에서 값을 꺼내는 컨트롤러를 고칩니다.

  • 틀리는 꼴 DAO — (1)에: 할인율을 SQL에 넣으면 업무 규칙이 DAO로 새어 나가, 규칙이 바뀔 때 SQL까지 뒤져야 합니다.
  • 틀리는 꼴 서비스 — (2)에: 서비스는 SQL을 모르고 DAO에 부탁만 합니다. 부탁하는 꼴은 그대로입니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로