서버(server)는 말그대로 '제공하는 사람' 이라는 뜻으로서 클라이언트에게 네트워크를 통해 정보나 서비스를 전달하는 컴퓨터 시스템이다. 클라이언트가 특정 주소에서 어떠한 데이터를 서버에 요청하게 되면 그 주소에 맞는 메서드에서 요청을 받고, 데이터 베이스로부터 데이터를 받아 클라이언트가 원하는 형태의 데이터로 가공을 한 후, 클라이언트에게 응답한다.
이러한 일련의 과정들은 소규모의 클라이언트가 이용한다던가, 데이터의 양이 적은 경우라면 절차적인 코드를 작성해도 문제가 되지 않을 것이다. 하지만 구글, 네이버와 같은 어마어마한 데이터를 다뤄야 한다던가, 클라이언트와 서버 사이에 요청, 응답이 엄청 많다면 코드를 절차적인 방법으로 작성하는데에는 분명 문제가 생길 것이다. 서버의 역할을 분담하여 객체지향적인 코드를 작성한다면 여러 장점이 있을 것이다. (결국은 OOP이다.)
코드의 가독성이 좋을 것이다.
절차지향적인 코드의 장점은 직관적으로 코드를 작성할 수 있다는 점에서 설계 시에 매우 편리할 것이다. 역할을 나누는 것에 대한 고민없이 명령어 한줄한줄 작성하면 그만이기 때문이다. 반면 역할을 나누어 객체지향적인 코드를 작성하게 되면 비록 작성 시간은 오래 걸리겠지만 코드가 구조화되어있기 때문에 가독성이 좋아진다.
유지 보수를 하기 수월하다.
가독성 측면과 유사한 장점이다. 유지, 보수를 해야할 때 절차지향적 코드는 역할 별로 독립적이지 못하기 때문에 모든 코드를 전부 수정해야 할 수 있다. 반면 객체지향적 코드는 서로 독립적(OOP의 캡슐화)이기 때문에 한부분만 수정해도 정상작동하는데 무리가 없다.
서버는 세 부분으로 분류할 수가 있다. 서버 가장 바깥에 위치한 컨트롤러, 중간에 위치한 서비스, 제일 안 쪽의 레포지토리.
컨트롤러는 클라이언트와 가장 맞닿은 부분으로 클라이언트에게 요청을 받고 응답을 해주는 역할을 한다.
서버에서 가장 중요한 비즈니스 로직을 담당하고 있다. 디비로부터 데이터를 주고 받으며 컨트롤러로부터 받은 요청에 따라 데이터를 가공하는 역할을 한다.
서버의 가장 안쪽이고 DB와 맞붙어 있는 인터페이스이다. 가공된 데이터를 DB와 CRUD를 하는 역할을 한다.