개요

이번 주차에서는 백엔드 개발에서의 일반적으로 사용되는 계층과 개체들에 대해서 알아볼 것입니다.

백엔드 개발 관련 레퍼런스를 보면 DAO, DTO, Service, Entity 등의 용어들이 사용되는 것을 확인할 수 있습니다. 이러한 요소들이 어떤 것을 의미하고 어떻게 사용해야하는지 알아볼 것입니다.

이번에 배우는 내용들이 실질적으로 웹 애플리케이션을 어떻게 구성할 것인가에 대한 해답이 될 수 있습니다. 반면 이 내용들은 어느 정도 관습적입니다. 처음엔 관습을 따라 개발을 하겠지만 앞으로 개발을 하면서 이러한 관습들 사이에서 내 프로젝트에 적용하기 부적절한 부분이 발견된다면 이를 해결할 수 있는 방법을 익혀나가야 할 것입니다.

Router

라우터는 HTTP 요청을 Controller와 연결해주는 계층입니다.

스프링의 경우는 DispatcherServlet이 라우팅을 담당한다고 말씀드렸는데, 이 DispatcherServlet은 스프링 동작 과정에 숨어있으므로 별도의 라우터 클래스를 작성해줄 필요는 없습니다. 스프링의 개발자는 컨트롤러에 라우팅 힌트 코드(@RequestMapping)를 작성하여 DispatcherServlet이 라우팅을 할 수 있게 할 뿐입니다. 따라서 스프링부트에서 라우팅을 담당하는 객체는 엄밀히 말하자면 DispatcherServlet 이지만, Controller가 라우팅 역할까지 한다고 이야기해도 무방합니다.

또한 라우터는 HTTP Request 객체를 처리할 수 있습니다. HTTP Request를 받아 어떤 컨트롤러에 어떤 메소드를 실행시킬지(Routing), 어떤 값을 전달할지(Binding)를 지정해줍니다. 이러한 방식을 통해서 Router는 웹기술에 의존적이게 하면서 Controller 는 웹과는 별개의 컴포넌트로 만들 수 있습니다.

//Router.js

let express = require('express');
let app = express();

app.route('/')
	.get(function(req,res) {
	SomeController.getIndex(req.getName());
}).post(function(req,res) {
	SomeController.postIndex();
});

app.listen(8080, () => {
	console.log('listen to 8080');
});

반면 다른 언어, 다른 프레임워크에서는 라우팅을 담당하는 계층을 놓기도 합니다.

위 코드는 javascript 기반의 ****express ****프레임워크로 만든 웹애플리케이션의 일부입니다. Router.js 라는 파일을 생성하고 URI와 메서드에 따라 어떤 내용이 실행될 지 지정해줍니다. 일부 프레임워크에서는 이렇게 라우팅 코드를 직접 작성해줄 필요도 있습니다.

따라서 스프링만 배운 사람은 라우팅에 대한 개념이 모호하여, 다른 개발자와 소통할때 차질이 생길 지도 모릅니다. 라우터는 백엔드 전반에서 사용되는 계층이기 때문에 이런걸 따로 코드로 작성하는 경우도 있구나 하고 알아둘 필요가 있습니다.

Controller

컨트롤러에 대해서는 앞시간에 여러번 다뤘으므로 어느정도 이해하고 있을거라 생각합니다.

Controller 는 라우터로부터 실행되며, http 요청의 endpoint이자 웹애플리케이션 코드의 startpoint입니다.

Controller 의 주요 역할로는 HTTP 요청으로 들어오는 파라미터들에 대해서 형식적인 검증을 하고, 요청에 따른 비즈니스 로직을 수행할 수 있는 Service 계층의 객체에게 파라미터를 전달하여 비즈니스 로직이 수행될 수 있게 합니다. 이후 비즈니스 로직의 수행 결과에 따라서 적절한 응답 반환 을 반환하여 사용자에게 전달 될 수 있도록 합니다.

형식적 검증