[CS] Technology Interview Preparation (3)

2021. 4. 10. 17:52기술면접 (Computer Science)

REST (REpresentational State Transfer)

- WWW과 같은 분산 하이퍼미디어 시스템을 위한 sw 아키텍처의 한 형식이다.

- 컴퓨터가 가지고 있는 자원(파일/데이터/그림 등)의 상태 즉, 정보 값을 전달 하는 방식

- 자원의 표현에 의한 상태 전달

- HTTP Method를 통해 Resource를 처리하기 위한 아키텍쳐

 

REST API

- API 란 Application Progrmming Interface 으로 데이터와 기능의 집합을 제공해 정보 교환 하는 것

- REST 기반으로 서비스 API를 구현한 것

- REST 기반으로 시스템을 분산해 확장성과 재사용성을 높여 유지보수 및 운용을 편리하게 함

 

Rest ful

- REST라는 아키텍처를 구현하는 웹 서비스를 나타내기 위해 사용되는 용어

- REST API를 제공하는 웹 서비스를 REST ful 하다고 할 수 있다.

- REST 원리를 따르는 시스템은 REST ful이란 용어로 지칭 된다.

 

Spring 과 Springboot 차이

스프링의 의존성 주입(Dependency Injection)과 제어의 역전(Inversion of Control)을 통해 재사용 및 유지보수가 용이한 코드를 작성할 수 있게 되었고, 확장성을 가진 코드를 설계할 수 있게 되었습니다. 또한 Spring 이 제공해주는 기능들을 사용하여 개발자는 비즈니스 로직에 더욱 집중할 수 있게 되어 생산성을 증가시킬 수 있었습니다. 예를 들면 Mockito와 같은 다른 프레임워크와 통합하여, 개발자가 비즈니스 로직외에 신경 써야 할 부분을 덜어줍니다. 이는 생산성 향상에도 큰 도움을 주었다. 이는 스프링이 해결하고자 한 다른 프레임워크와의 통합(Intergration with Other Frameworks)의 특징 입니다.

 

정리하면 스프링 프레임워크는 Web Application을 개발하는데 결합도를 낮추는 방향의 개발방법을 제공한다고 말할 수 있습니다. 스프링의 이러한 컨셉(Dispatcher Servlet, ModelAndView, and Vier Resolver) 덕분에 쉬운 개발을 할 수 있게 됬습니다.

 

그러면 스프링이 이토록 많은 문제들을 해결하고 있다면, 왜 스프링 부트의 필요해졌을까?

 

스프링으로 개발을 할 때 Transaction Manager, Hibernate Datasource, Entity Manager, Session Factory와 같은 설정와 복잡한 구성 문제에 많이 직면한다.

이 같은 불편한 문제를 해결하기 위해 스프링부트는 일일히 관련 라이브러리를 추가할 필요 없이 쉽고 자동 설정을 위한

CoC(Convention over Configuration) 패러다임을 사용하고 있다. 스프링부트 뿐만 아니라 많은 Framework(Spring, Ruby on Rails, Symphony 등)이 "설정보다 관례" CoC 패러다임을 사용하고 있다. 

 

즉, Spring Boot는 최소한의 번거로움으로 스프링 기반의 프로덕션 급 응용 프로그램 및 서비스를 쉽게 만들 수 있도록하는 것을 목표로합니다. 

따라서, Spring Boot는 아래와 같은 기능을 지원합니다.

Auto Configuration - 자동 설정
Easy dependency Management - 쉬운 의존성 관리
Embedded Servlet Container Support - 내장 서블릿 컨테이너(내장 서버)

스프링부트는 자동설정(AutoConfiguration)을 이용하였고 어플리케이션 개발에 필요한 모든 내부 디펜던시를 관리해주며 복잡도를 줄이기 위해서 starter란 의존성과 설정을 자동화해주는 모듈을 도입하였다. 그로인해 개발자는 Dependency 관리와 호환버전에 대하여 고려할 필요가 없어졌다.

 

Dependency Injection(DI) - 의존성 주입

DI란 스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입 기능으로, 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입 시켜주는 방식이다. DI(의존성 주입)를 통해서 모듈 간의 결합도가 낮아지고 유연성이 높아진다. 의존성 주입을 통해 객체간의 결합도를 낮추어 코드 재사용성을 향상시키고, 단위테스트를 용이하게 할 수 있도록 해줍니다.

 

Ioc(Inversion of Control) - 제어의 역전

IoC는 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미한다. IoC는 제어의 역전이라고 말하며, 간단히 말해 "제어의 흐름을 바꾼다"라고 한다. 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 한다.

 

스프링이 모든 의존성 객체를 스프링이 실행될때 다 만들어주고 필요한곳에 주입시켜줌으로써 Bean들은 싱글턴 패턴의 특징을 가지며, 제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리하게 된다.

 

Dispatcher Servlet

- 사전적 의미 : 발송하다.

- 클라이언트의 모든 요청을 한곳으로 받아서 처리

- Servlet Container에서 HTTP프로토콜을 통해 들어오는 모든 요청을 프레젠테이션 계층의 제일앞에 둬서 중앙집중식으로 처리해주는 프론트 컨트롤러(Front Controller)
- 제일 앞에서 서버로 들어오는 모든 요청을 처리하는 프론트 컨트롤러를 Spring에서 정의하였고, 이를 Dispatcher-Servlet이라고 합니다. 

- Handler의 실행 결과를 HTTP Response 형태로 만들어 변환

Dispatcher-Servlet 흐름

 

REST Controller vs Controller

- @Controller는 주로 View를 반환하기 위해 사용

- @Controller가 View를 반환하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링

- @Controller도 @ResponseBody 어노테이션을 활용하면 Json 형태로 데이터를 반환이 가능하다.

 

- @RestController의 주용도는 View를 갖지 않는 REST Data(JSON/XML) 반환하기 위해 사용

- @RestController가 Data를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작

 

- 과거에는 @RequestMapping / 스프링 4.0 에서는 메소드를 명확히 해주는 @GetMapping 등장하였다.

   Ex) @RequestMapping(method=RequestMethode.GET , path = “/hello-world”)

   Ex) @GetMapping(path=”/”)

- 과거에는 Controller 생성을 위해서 스프링 설정 XML 파일에 Controller를 등록하여 사용하였는데, Spring 4.0부터는 @RestController 라는 어노테이션이 나오면서 등록할 필요가 없어졌다.


HttpMessageConverter

- HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라집니다. 

- 단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고, 객체인 경우에는 MappingJackson2HttpMessageConverter가 사용되며, 데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 됩니다.

- Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리합니다.

HATEOAS (Hypermedia As the Engine Of Application State)

- 현재 리소스와 연관된 자원 상태 정보를 제공 (호출 가능한)

- 호출한 URI로부터 연관된 REST API 주소 정보들을 함께 보내주는 역할을 하는 것이 HATEOAS 이다.

- 그럼으로써 클라이언트는 서버와 상호 작용하는 방법에 대한 사전 지식이 거의 또는 전혀 필요없이 사용 할 수 있게 되는 것이다.