Spring

2024. 9. 19. 16:36면접준비

WAS와 WS의 차이를 설명하시오.

WAS(Web Application Server)

  • 비즈니스 로직을 넣을 수 있음
  • Tomcat,PHP,ASP,.NET 등

WS(Web Server)

  • 비즈니스 로직을 넣을 수 없음
  • Nginx, Apache 등

1.Web Server

-클라이언트에게 요청을 받고 정적인 Request라면 (html, css 등) 정적인 콘텐츠를 Response합니다.

-클라이언트에게 요청을 받고 동적인 Request라면 WAS로 처리를 이관한 뒤 WAS에서 처리한 결과를 클라이언트에게 전달 합니다.

  1. WAS
  2. DB 조회가 필요하거나 사용자의 입력을 받아 서버에서 가변적으로 로직을 수행하는 등의 동적인 처리가 필요한 요청을 처리하기 위해 만들어졌습니다. Web Container의 JSP/Servlet 구동 환경을 제공하고 프로그래밍 언어(JSP,PHP 등)로 작성한 뒤 HTML 문서로 만들고 Web Server로 전달합니다.

Web Server와 WAS를 분리해 놓는 이유

  1. 기능을 분리하여 서버 부하 방지
  2. Web Server를 두는 가장 큰 이유. 만약 정적 컨텐츠 요청까지 WAS가 처리한다면 정적 데이터 처리로 인해 부하가 커지게 되고, 동적 컨텐츠의 처리가 지연됨에 따라 수행 속도가 느려집니다. 그렇기에 단순한 정적 컨텐츠 요청은 Web Server에서 빠르게 클라이언트에 제공하여 WAS로 넘어오지 않게 막는 것이 줗습니다.
  3. 물리적으로 분리하여 보안 강화
  4. 여러대의 WAS를 연결 가능
  5. Web Server하나에 여러 대의 WAS를 설치하고 Load Balancing을 하여 WAS의 부하를 더 낮춰줄 수 있습니다.

Spring Framework에 대해 설명해주세요

스프링 프레임워크는 자바 개발을 편리하게 해주는 오픈소스 프레임워크 입니다.

-경량 컨테이너로서 자바 객체를 직접 관리

-각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.

-제어의 역전(IoC)이라는 기술을 통해 어플리케이션의 느슨한 결합을 도모

-컨트롤의 제어권이 사용자가 아닌 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.

-의존성 주입(DI, Dependency Injection)을 지원

-각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜 준다.

-관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)을 지원

-트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.

Spring MVC에 대해 설명해주세요

-MVC는 Model, View, Controller의 약자이며, 각 레이어간 기능을 구분하는데 중점을 둔 디자인 패턴입니다.

-Model은 데이터 관리 및 비즈니스 로직을 처리하는 부분

-View는 비즈니스 로직의 처리 결과를 유저 인터페이스가 표현되는 구간

-Controller는 사용자의 요청을 처리하고 Model과 View를 중개하는 역할

DispatcherServlet : 클라이언트에게 요청을 받아 응답까지의 MVC처리과정을 통제한다.

HandlerMapping : 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정한다.

HandlerAdapter : HandlerMapping에서 결정된 핸들러 정보로 해당 메소드를 직접 호출해주는 역할을 한다.

ViewResolver : Controller의 처리 결과를 생성할 view를 결정한다.

  1. 클라이언트는 URL을 통해 요청을 전송한다.
  2. DispatcherServlet은 HandlerMapping을 통해 해당 요청이 어느 컨트롤러에게 온 요청인지 찾는다.
  3. DispatcheServlet은 HandlerAdapter에게 요청의 전달을 맡긴다.
  4. HandlerAdapter는 해당 컨트롤러에 요청을 전달한다.
  5. 컨트롤러는 비즈니스 로직을 처리한 후에 반환할 뷰의 이름을 반환한다.
  6. DispatcherServlet은 ViewResolver를 통해 반환할 뷰를 찾는다.
  7. DispatcherServlet은 컨트롤러에서 뷰에 전달할 데이터를 추가한다.
  8. 데이터가 추가된 뷰를 반환한다.

제어의 역전(IoC)에 대해 아는대로 설명해주세요.

모든 객체에 대한 라이프 사이클을 개발자가 아닌 Ioc컨테이너에게 넘긴 것을 말합니다.

따라서 개발자는 로직에 집중할 수 있는 장점이 있습니다.

스프링은 Ioc컨테이너에 객체들을 생성하면 객체끼리 의존성을 주입(DI)하는 역할을 합니다.

*컨테이너에 등록된 객체를 빈이라고합니다

스프링 컨테이너(=IoC 컨테이너)의 종류

스프링 컨테이너가 관리하는 객체를 빈(Bean)이라고 하고, 이 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리(Bean Factory)라고 부릅니다.

-객체의 생성과 객체 사이의 런타임 관계를 DI관점에서 볼 때 컨테이너를 BeanFactory라고 한다.

-BeanFactory에 여러가지 기능을 추가한 ApplicationContext가 있다.

DI(Dependency Injection) 란?

각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것

의존성 주입의 3가지 방법

Spring은 @Autowired 어노테이션을 이용한 다양한 의존성 주입(DI, Dependency Injection) 방법을 제공합니다.

의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아 사용하는 것 입니다.

이를 통해 객체간의 결합도를 줄이고 코드의 재활용성을 높일 수 있습니다.

@Autowired는 Spring에게 의존성을 주입하는 지시자 역할로 쓰입니다.

의존성 주입 필요성

-코드의 재사용성을 높여준다.

-객체간의 의존성을 줄이거나 없앨 수 있다.

-객체간의 결합도를 낮추면서 유연한 코드를 작성할 수 있다.

의존성 주입 3가지 방법

1.생성자 주입(Constructor Injection)

2.필드 주입(Field Injection)

3.수성자 주입(Setter Injection)

  1. 생성자 주입
@Controller
public class ConsController{
//final을 붙일 수 있음
	private final ConsService consService;
	
	//@Autowired
	public ConsController(ConsService consService){
		this.consService = consService;
	}
}

클래스의 생성자가 하나이고, 그 생성자로 주입받을 객체가 빈으로 등록되어 있다면 @Autowired를 생략 할 수 있습니다.

2.필드 주입(Field Injection)

@Controller
public class FiledController{
	@Autowired
	private FiledService filedService;
}

필드에 @Autowired 어노테이션만 붙여주면 자동으로 의존성 주입 됩니다.

사용법이 매우 간단하기 때문에 가장 많이 접할 수 있는 방법입니다.

단점

-코드가 간결하지만, 외부에서 변경하기 힘들다.

-프레임워크에 의존적이고 객체지향적으로 좋지 않다.

3.수정자 주입(Setter Injection)

@Controller
public class SetterController{
	private SetterService setterService;
	
	@Autowired
	public void setSetterController(SetterService setterService){
		this.setterService = setterService;
	}
}

Setter 메소드에 @Autowired 어노테이션을 붙이는 방법입니다.

단점

-수정자 주입을 사용하면 setXXX메소드를 public으로 열어두어야 하기 때문에 언제 어디서든 변경이 가능하다.

어떤 주입 방식을 사용하는게 좋을까?

SpringFramework reference에서 권장하는 방법은 생성자를 통한 주입 입니다.

순환 참조를 방지할 수 있다.

필드 주입과 수정자 주입은 빈이 생성된 후에 참조를 하기 때문에 어플리케이션이 아무런 오류없이 구동됩니다.

반면 생성자를 통해 주입하고 실행하면 BeanCurrentlyInCreationException이 발생하게 되어 오류 체크를 할 수 있습니다.

불변성(Immutability)

생성자로 의존성을 주입할 때 final로 선언할 수 있고, 이로인해 런타임에서 의존성을 주입받는 객체가 변할 일이 없어지게 됩니다.

하지만 수정자 주입이나 일반 메소드 주입을 이용하게 되면 불필요 하게 수정의 가능성을 열어두게 되고 이는 OOP의 5가지 원칙 중 OCP(Open-Closed Principal, 개방-폐쇄의 원칙)를 위반하게 됩니다. 그러므로 생성자 주입을 통해 변경의 가능성을 배제하고 불변성을 보장하는 것이 좋습니다.

관점지향 프로그래밍(AOP, Aspect Oriented Programming)은 무엇이고, 언제 사용할 수 있을까요?

AOP는 핵심 비즈니스 로직에 있는 공통 관심사항을 분리하여 각각을 모듈화 하는 것을 의미하며 공통 모듈인 인증, 로깅, 트랙잭션 처리에 용이합니다.

핵심 비즈니스 로직에 부가기능을 하는 모듈이 중복되어 분포되어 있을 경우 사용할 수 있습니다.

AOP의 가장 큰 특징이자 장점은 중복 코드 제거, 재활용성의 극대화, 변화수용의 용이성이 좋다는 점입니다.

  1. 관점지향 프로그래밍이란?
  2. AOP는 OOP를 돕는 보조적인 기술로, AOP는 기능을 핵심 관심 사항(Core Concern)과 공통 관심 사항(Cross-Cuttin Concern)으로 분리시키고 각각을 모듈화 하는 것을 의미합니다.
    1. 업무 로직을 포함하는 기능을 핵심기능
    2. 핵심 기능을 도와주는 부가적인 기능을 부가기능 이라고 부른다.
    3. OOP를 적용하여도 핵심 기능에서 부가 기능을 쉽게 분리된 모둘로 작성하기 어려운 문제점을 AOP가 해결해준다.
    4. AOP는 부가기능을 애스펙트(Aspect)로 정의하여, 핵심 기능에서 부가 기능을 분리함으로써 핵심 기능을 설계 하고 구현할 때 객체지향적인 가치를 지킬 수 있게 도와주는 개념이다.

'면접준비' 카테고리의 다른 글

JAVA  (0) 2024.09.29
Spring2  (0) 2024.09.28