23단원 '서버 프로그램'의 네 레슨에서 6문제, 앞 단원(20·21)에서 2문제를 섞었고, 끝에 실기 꼴 3문제가 있습니다. 앞 단원 문제가 어느 레슨인지는 정답을 펼치면 보입니다. 실기 꼴은 종이에 답을 끝까지 쓴 뒤 펼치세요. 띄어쓰기만 다르면 같은 답입니다.
문제 1
어느 대학이 수강 신청 홈페이지를 열려고 서버와 소프트웨어를 꾸리는 계획을 세웠습니다. 계획으로 옳지 않은 것을 고르세요.
- ① 홈페이지 머리에 늘 같은 모양으로 뜨는 아이콘 그림과 CSS 파일은 웹 서버가 WAS를 거치지 않고 돌려준다
- ② 학생마다 다른 '내 신청 내역' 화면은 웹 서버가 DB 서버에 직접 물어 만들게 해 WAS의 일을 던다
- ③ 수강 신청 프로그램을 돌릴 WAS로 Tomcat을 고르고, Tomcat보다 JVM을 먼저 깐다
- ④ 서버마다 운영체제를 먼저 깔고, 그 위의 소프트웨어는 패키지 관리자로 의존 패키지까지 함께 깐다
정답
② — 학생마다 다른 화면은 요청이 올 때마다 프로그램을 돌려 만드는 동적 콘텐츠입니다. 그 프로그램을 돌리고 필요한 데이터를 DB 서버에 묻는 것은 WAS의 일이고, 웹 서버는 프로그램을 돌리지도 DB 서버에 묻지도 않습니다.
- ① 맞습니다. 누가 언제 청해도 같은 파일은 정적 콘텐츠라 웹 서버가 바로 돌려주고, 그만큼 WAS는 그림 파일 요청에 시간을 쓰지 않습니다.
- ③ 맞습니다. Tomcat은 Java로 만든 WAS라 JVM 위에서 돌아, JVM이 먼저 깔려 있어야 합니다.
- ④ 맞습니다. 패키지 관리자는 저장소에서 패키지를 받으며, 그 패키지가 기대는 다른 패키지까지 찾아 함께 깝니다.
다시 볼 레슨: 개발환경 구축
문제 2
도서관 대출 프로그램을 컨트롤러·서비스·DAO 층으로 나누고, 층 사이의 값은 DTO에 담아 나릅니다. 코드 조각을 놓은 자리로 옳지 않은 것을 고르세요.
- ① 컨트롤러 — 요청에서 회원 번호를 꺼내 숫자인지 확인한다
- ② 서비스 — 연체 중인 회원이면 대출을 막는다
- ③ DAO — 대출 표에 새 행을 넣는 INSERT 문을 보낸다
- ④ DTO — 대출일에 14일을 더해 반납 예정일을 계산한다
정답
④ — DTO는 값을 담는 칸과 값을 넣고 꺼내는 메서드(setter·getter)만 두고 계산은 하지 않습니다. 반납 예정일을 셈하는 것은 업무에서 정한 규칙이라 서비스의 몫이고, DTO는 셈한 날짜를 담아 나를 뿐입니다.
- ① 맞습니다. 요청에서 값을 꺼내 확인하고 일을 서비스에 맡기는 것이 컨트롤러입니다.
- ② 맞습니다. '연체 중이면 막는다'는 업무 규칙이라 서비스가 판단합니다.
- ③ 맞습니다. SQL로 데이터베이스를 읽고 쓰는 일은 DAO만 합니다.
다시 볼 레슨: 서버 프로그램의 구조: MVC·DAO·DTO
문제 3
도서관 대출 프로그램에서 컨트롤러의 메서드가 서비스의 메서드를 부르고, 서비스의 메서드가 다시 DAO의 메서드를 불렀습니다. 메서드는 일을 마치면 자기를 부른 자리로 돌아갑니다. (가) 세 메서드가 끝나는 차례와 (나) 돌아갈 자리를 쌓아 두는 자료구조로 알맞은 것을 고르세요.
- ① (가) DAO → 서비스 → 컨트롤러 · (나) 스택
- ② (가) DAO → 서비스 → 컨트롤러 · (나) 큐
- ③ (가) 컨트롤러 → 서비스 → DAO · (나) 스택
- ④ (가) 컨트롤러 → 서비스 → DAO · (나) 큐
정답
① — 가장 나중에 불린 DAO의 메서드가 먼저 끝나 서비스로 돌아가고, 서비스가 끝나야 컨트롤러로 돌아갑니다. 나중에 쌓은 자리가 먼저 빠지는 후입선출(LIFO)이라, 돌아갈 자리는 스택에 쌓습니다.
- ② 끝나는 차례는 맞게 봤지만 구조를 큐로 봤습니다. 먼저 넣은 것이 먼저 나오는 큐는 차례를 기다리는 작업에 쓰고, 함수 호출에서 돌아갈 자리는 스택에 둡니다.
- ③ 끝나는 차례를 부른 차례와 같다고 봤습니다. 컨트롤러는 서비스가 돌아와야 끝나므로 맨 나중에 끝납니다.
- ④ 부른 차례대로 끝나고 그 차례대로 줄 선다고 봤습니다. 끝나는 차례는 부른 차례의 거꾸로이고, 그렇게 꺼내는 구조가 스택입니다.
다시 볼 레슨: 스택과 큐 · 서버 프로그램의 구조: MVC·DAO·DTO
문제 4
지도 앱에서 한 지점의 위치를 위도·경도 두 값으로 나타내는 객체를 VO로 만들려 합니다. 이 객체를 (가) 만든 뒤에 위도·경도 값을 바꿀 수 있는지와 (나) 위도·경도가 같은 두 객체를 같은 것으로 보는지, 알맞은 것을 고르세요.
- ① (가) 바꿀 수 있다 · (나) 같은 것으로 본다
- ② (가) 바꿀 수 있다 · (나) 따지지 않는다
- ③ (가) 바꿀 수 없다 · (나) 같은 것으로 본다
- ④ (가) 바꿀 수 없다 · (나) 따지지 않는다
정답
③ — VO는 값 그 자체를 나타내는 객체입니다. 한 번 만들면 값을 바꾸지 않는 읽기 전용이고, 속성값이 같으면 같은 것으로 봅니다.
- ① VO에도 setter를 두어 값을 바꾼다고 봤습니다. setter로 값을 넣고 바꾸며 나르는 것은 DTO이고, VO는 만든 뒤 바꾸지 않습니다.
- ② DTO의 성질을 골랐습니다. 층 사이에서 값을 나르는 DTO는 값을 바꿔 가며 쓰고, 값이 같은지는 따지지 않습니다.
- ④ 읽기 전용인 것은 맞게 봤지만, 값이 같아도 따로 본다고 봤습니다. VO는 값이 곧 그 객체라 위도·경도가 같으면 같은 위치입니다.
다시 볼 레슨: 서버 프로그램의 구조: MVC·DAO·DTO
문제 5
Java 프로그램이 Java와 함께 오는 라이브러리의 Math.abs(-7)을 불러 7을 받았습니다. 이렇게 부른 API의 (가) 기능이 있는 곳과 (나) 돌려받는 것으로 알맞은 것을 고르세요.
- ① (가) 네트워크 건너 다른 서버 · (나) JSON 같은 데이터
- ② (가) 네트워크 건너 다른 서버 · (나) 함수의 반환값
- ③ (가) 같은 프로그램 안 · (나) JSON 같은 데이터
- ④ (가) 같은 프로그램 안 · (나) 함수의 반환값
정답
④ — 언어와 함께 오는 라이브러리의 함수도 API입니다. 같은 프로그램 안의 기능을 함수로 불러 반환값을 받으니 라이브러리 API입니다.
- ① 웹 API의 모습을 골랐습니다. 네트워크 건너 다른 서버의 기능을 HTTP 요청으로 부르고 JSON 같은 데이터로 받는 것은 웹 API입니다.
- ② API를 다른 서버에 있는 것으로만 봤습니다. 라이브러리 API는 부르는 프로그램과 같은 곳에 있습니다.
- ③ API라면 늘 JSON으로 답한다고 봤습니다. JSON 같은 데이터로 답하는 것은 HTTP 요청으로 부르는 웹 API입니다.
다시 볼 레슨: API
문제 6
어느 병원의 진료비 정산 배치가 새벽에 돌다가 보험 번호가 빈 기록 2건을 만났습니다. (가) 배치는 멈추지 않고 그 2건을 건너뛰어 나머지를 모두 정산했고, (나) 건너뛴 2건의 기록 번호와 시각을 기록 파일에 남겨 담당자에게 알렸습니다. (가)·(나)가 보여 주는 배치 프로그램의 필수 요소로 알맞은 것을 고르세요.
- ① (가) 견고성 · (나) 안정성
- ② (가) 견고성 · (나) 견고성
- ③ (가) 안정성 · (나) 안정성
- ④ (가) 안정성 · (나) 견고성
정답
① — 잘못된 데이터가 섞여도 멈추지 않고 넘어가는 것이 견고성이고, 넘어간 일을 언제 어디서인지 기록해 알리는 것이 안정성입니다.
- ② 오류를 기록해 알리는 일까지 견고성으로 봤습니다. 견고성은 멈추지 않는 데까지이고, 남기고 알리는 것은 안정성입니다.
- ③ 멈추지 않는 것까지 안정성으로 봤습니다. '안정'이라는 낱말에 끌렸지만, 잘못된 데이터에도 멈추지 않는 것은 견고성입니다.
- ④ 둘을 뒤바꿨습니다. 멈추지 않는 것이 견고성, 기록하고 알리는 것이 안정성입니다.
다시 볼 레슨: 배치 프로그램
문제 7
어느 병원의 진료비 정산 배치는 날마다 새벽에 하루치 기록 n건을 정렬한 뒤 정산합니다. 기록이 어떤 차례로 쌓여 있든 정렬 시간이 n log n에 비례해야 아침 진료 전에 끝낼 수 있습니다. 알맞은 정렬을 고르세요.
- ① 삽입 정렬
- ② 선택 정렬
- ③ 힙 정렬
- ④ 퀵 정렬
정답
③ — 힙 정렬은 힙을 다시 세울 때마다 트리 높이 log n만큼만 내려가, 줄이 놓인 모양과 상관없이 언제나 O(n log n)입니다.
- ① 이미 정렬된 줄에서 빠른 것만 봤습니다. 삽입 정렬은 그때만 O(n)이고, 그 밖에는 O(n²)입니다.
- ② 줄 모양에 따라 시간이 달라지지 않는다는 점에 끌렸습니다. 선택 정렬은 늘 같은 횟수를 견주지만, 그 횟수가 두 겹 반복의 O(n²)입니다.
- ④ 평균만 봤습니다. 퀵 정렬은 평균 O(n log n)이지만, 피벗이 한쪽으로 쏠리면 O(n²)까지 느려집니다.
다시 볼 레슨: 퀵·병합·힙 정렬 · 선택·버블·삽입 정렬
문제 8
크론탭(crontab)에 매주 화요일과 목요일 18시 30분에 도는 줄을 적으려 합니다. 크론 식 다섯 칸으로 알맞은 것을 고르세요.
- ①
30 18 * * 1,3 - ②
30 18 * * 2,4 - ③
18 30 * * 1,3 - ④
18 30 * * 2,4
정답
② — 칸 차례는 분·시·일·월·요일이라 분 30, 시 18을 앞에 적습니다. 요일은 0이 일요일이어서 화요일이 2, 목요일이 4이고, 둘은 쉼표로 이어 목록으로 적습니다.
- ① 요일을 0부터 월요일로 셌습니다. 0은 일요일이라 1·3은 월요일·수요일입니다.
- ③ 시를 첫 칸에 적고, 요일도 0부터 월요일로 셌습니다. 첫 칸은 분이고, 시 칸은 0~23이라 30이 들어갈 수 없습니다.
- ④ 요일은 맞게 셌지만 분과 시의 자리를 바꿨습니다. 첫 칸이 분, 둘째 칸이 시입니다.
다시 볼 레슨: 배치 프로그램
문제 9 (실기)
학사 서버가 학생 한 명은 /students/105, 과목 하나는 /courses/OS처럼 다루는 대상마다 주소를 붙였습니다. 그 주소에 GET을 보내면 조회하고 DELETE를 보내면 지우는 식으로 할 일은 HTTP 메서드가 정하고, 학생·과목의 정보는 JSON으로 주고받습니다. 이렇게 웹 API를 짜는 방식의 이름을 영문 약어로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: REST
실마리는 '다루는 대상마다 주소를 붙이고, 할 일은 HTTP 메서드로 정하며, 정보는 JSON으로 주고받는다'입니다. 자원에 주소를 붙이고 메서드로 할 일을 정해 웹 API를 짜는 방식입니다.
- 같은 이름의 다른 꼴: Representational State Transfer — 약어를 푼 원어입니다. 문제가 영문 약어로 물었습니다.
- 틀리는 꼴 HTTP: 요청과 응답을 실어 나르는 규약입니다. 묻는 것은 그 규약의 메서드로 웹 API를 짜는 방식입니다.
- 틀리는 꼴 API: 다른 프로그램의 기능을 부르는 약속 전체를 이르는 이름입니다. 묻는 것은 웹 API를 짜는 방식 하나입니다.
- 틀리는 꼴 Open API: 누구나 쓸 수 있게 공개했는지로 가르는 이름입니다. 문제에는 공개했다는 실마리가 없습니다.
다시 볼 레슨: API
문제 10 (실기)
병원 홈페이지에서 병원 소개 쪽은 미리 만들어 둔 HTML 파일이라 누가 열어도 같습니다. 그런데 '내 예약 보기' 쪽은 환자마다 내용이 달라, 요청이 올 때마다 프로그램을 돌려 화면을 만들고 예약 기록은 다른 서버에 묻습니다. '내 예약 보기' 화면을 만드는 서버의 이름을 영문 약어로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: WAS
실마리는 '요청마다 프로그램을 돌려 환자마다 다른 화면을 만든다'와 '기록은 다른 서버에 묻는다'입니다. 동적 콘텐츠를 만드는 서버입니다.
- 같은 이름의 다른 꼴: Web Application Server(원어) · 웹 애플리케이션 서버(한글 이름) — 문제가 영문 약어로 물었습니다.
- 틀리는 꼴 웹 서버: 병원 소개 쪽처럼 만들어 둔 파일을 바로 돌려주는 서버입니다. 프로그램을 돌리지 않습니다.
- 틀리는 꼴 DB 서버: 예약 기록을 저장하고 찾아 주는 서버로, WAS가 묻는 상대입니다. 화면을 만들지 않습니다.
다시 볼 레슨: 개발환경 구축
문제 11 (실기)
진료비 정산 배치의 정렬을 병합 정렬에서 힙 정렬로 바꿨습니다. 기록 n건이 늘 때 거치는 단계 수가 늘어나는 정도는 둘 다 O(n log n)으로 같았습니다. 그런데 병합 정렬은 합칠 때 n건만큼의 칸을 더 썼고, 힙 정렬은 몇 칸만 더 썼습니다. 알고리즘을 견주는 두 잣대 가운데 이때 나아진 쪽의 이름을 한글로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.
정답
받는 답: 공간 복잡도
실마리는 '입력이 늘 때 더 쓰는 칸, 곧 메모리가 늘어나는 정도가 줄었다'입니다. 단계 수가 늘어나는 정도는 그대로라 시간 쪽은 달라지지 않았습니다.
- 같은 이름의 다른 꼴: Space Complexity — 영문 이름입니다. 문제가 한글로 물었습니다.
- 틀리는 꼴 시간 복잡도: 입력이 늘 때 거치는 단계 수가 늘어나는 정도입니다. 두 정렬 모두 O(n log n)이라 그대로입니다.
- 틀리는 꼴 빅오 표기법: 복잡도를 O(n log n)처럼 적는 방법의 이름입니다. 견주는 잣대 자체의 이름이 아닙니다.
다시 볼 레슨: 알고리즘과 시간 복잡도 · 퀵·병합·힙 정렬