[CS 면접 질문] 백엔드, Spring
WAS와 WS의 차이
WAS(Web Application Server)
비즈니스 로직을 넣을 수 있음 Tomcat, PHP, ASP, .NET 등WS(Web Server)
비즈니스 로직을 넣을 수 없음 Nginx, Apache 등
서블릿(Servlet)이란?
클라이언트의 요청을 처리하고 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술.
Spring MVC에서 Controller로 이용되며, 사용자의 요청을 받아 처리한 후에 결과를 반환한다.
Spring Framework의 특징
스프링 프레임워크는 자바 개발을 편리하게 해주는 오픈소스 프레임워크이다.
경량 컨테이너로서 자바 객체를 직접 관리
각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.제어의 역전(IoC, Inversion of Control)이라는 기술을 통해 어플리케이션의 느슨한 결합을 도모
컨트롤의 제어권이 사용자가 아닌 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.의존성 주입(DI, Dependency Injection)을 지원
각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)을 지원
트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할 수 있다.
제어의 역전 (IoC)
IoC란 모든 객체에 대한(생성, 생명주기 등) 제어권을 개발자가 아닌 IoC 컨테이너에게 넘긴 것을 의미한다.
스프링에서는 IoC 컨테이너(스프링 컨테이너)가 객체의 생명주기, 의존성을 관리하고 책임진다. 이 때 컨테이너가 관리하는 객체들을 빈(Bean)이라고 한다.
객체 관리를 컨테이너가 함으로써 개발자가 비즈니스 로직에 집중할 수 있다는 장점이 있다.
의존성 주입 (DI)
DI는 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아서 사용하는 것을 의미한다.
이를 통해 객체간의 결합도를 줄이고 코드의 재사용성을 높일 수 있다.
의존성 주입은 생성자 주입, 필드 주입, 세터 주입의 3 가지 방법이 있는데,
이 중 Spring에서 가장 권장하는 의존성 주입 방법은 생성자를 통한 주입 방법이다.
그 이유는 1. 순환 참조를 방지 2. 불변성을 가짐 3. 테스트에 용이하기 때문이다.
관점지향 프로그래밍 (AOP)
AOP는 핵심 비즈니스 로직에 있는 공통 관심사항을 분리하여 각각을 모듈화 하는 것을 의미한다. 핵심 기능(비즈니스 로직)에 부가기능을 하는 모듈이 중복되어 분포되어 있을 경우 사용할 수 있다.
중복 코드 제거, 재활용성 극대화, 변화수용의 용이성과 같은 장점이 있다.
Spring의 싱글톤 패턴
스프링은 컨테이너를 통해 직접 싱글톤 객체를 생성하고 관리하는데,
요청이 들어올 때마다 매번 객체를 생성하지 않고, 이미 만들어진 객체를 공유하기 때문에 효율적인 사용이 가능하다.
이를 통해 다음과 같은 장점을 얻을 수 있다.
- static 메소드나 private 생성자 등을 사용하지 않아 객체지향적 개발을 할 수 있다.
- 테스트하기 편리하다.
Spring Boot와 Spring Framework
Spring은 프로젝트 초기에 다양한 환경설정을 해야 하지만, Spring Boot는 설정의 많은 부분을 자동화하여 사용자가 편하게 스프링을 활용할 수 있도록 한다.
디스패처 서블릿(Dispatcher Servlet)이란?
디스패처 서블릿이란 톰캣과 같은 서블릿 컨테이너를 통해 들어오는 모든 요청을 제일 앞에서 받는 프론트 컨트롤러이다.
디스패처 서블릿은 공통된 작업을 처리한 후에, 적절한 세부 컨트롤러로 작업을 위임한다. 각각의 세부 컨트롤러는 요청을 처리하고 반환할 view를 Dispatcher Servlet에 넘긴다.
디스패처 서블릿 동작 과정
- 클라이언트의 요청을 디스패처 서블릿이 받음
- 핸들러 매핑을 통해 요청을 위임할 컨트롤러를 찾음
- 요청을 컨트롤러에 위임할 핸들러 어댑터를 찾아 전달
- 핸들러 어댑터가 컨트롤러로 요청을 위임
- 비지니스 로직을 처리함
- 컨트롤러가 반환값을 반환함
- 핸들러 어댑터가 반환값을 처리함
- 서버의 응답을 클라이언트로 반환함
MVC 패턴이란?
MVC 패턴은 애플리케이션을 개발할 때 그 구성요소를 Model, View, Controller 3가지로 나누는 디자인 패턴이다.
- Model: 데이터 관리 및 비즈니스 로직을 처리하는 부분 (DAO, DTO, Service 등)
- View: 사용자에게 보여지는 UI 화면 (html, jsp, tymeleaf, mustache 등 화면을 구성하기도 하고, Rest API로 서버가 구현된다면 json 응답으로 구성되기도 한다.)
- Controller: 사용자의 요청을 처리하고 Model과 View를 중개하는 역할.
VO와 BO, DAO, DTO
- DAO(Data Access Object): DB에 접근하여 실제 데이터를 조회 또는 조작하는 클래스. Repository 또는 Mapper에 해당.
- BO(Business Object): 여러 DAO를 활용해 비지니스 로직을 처리하는 클래스. Service에 해당.
- DTO(Data Transfer Object): 데이터를 주고 받기 위해 사용하는 클래스
- VO(Value Object): 실제 데이터만을 저장하는 클래스