스파이더 웹 개발

면접 예상 질문 - Spring 본문

Interview

면접 예상 질문 - Spring

스파이더웹 2022. 8. 5. 00:02
728x90
반응형

1. WAS와 WS의 차이

https://dyko615.tistory.com/32

2. Spring Framework란 무엇인가

스프링 프레임워크는 자바 개발을 편리하게 해주는 오픈소스 경량급 애플리케이션 프레임워크

특징

1) 경량 컨테이너

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

2) 의존성 주입(DI)를 통한 객체간의 관계 구성

  • 의존성 주입(DI)은 제어의 역전(IoC)이 일어나는 것을 전제로 하여 스프링 내부의 객체들간의 관계를 만들어줄 때 사용합니다
  • 프레임워크가 의존성이 존재할 경우 서로 연결시켜줍니다

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

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

4) AOP(관점지향 프로그래밍)지원

  • 로그, 트랜잭션과 같이 반드시 처리가 필요한 부분을 횡단 관심사라고 합니다. 스프링에서는 이러한 관심사를 비즈니스 로직과 분리하여 중복된 코드를 줄이고 개발자가 비즈니스 로직에 집중하도록 만들어 준다

 

3. Spring vs SpringBoot 차이점

스프링 부트는 스프링 프레임워크를 사용하기 위한 설정의 많은 부분을 자동화한 프레임워크입니다spring boot starter dependency만 추가해주면 설정은 끝나고, 내장된 톰캣을 제공해 서버를 바로 실행할 수 있습니다.

Spring Boot와 Spring framework의 차이

1) 스프링 부트는 내장된 톰캣을 가지고 있어, 별도의 톰캣을 설정할 필요가 없어, jar 파일로 손쉽게 배포가 가능하다
2) 스프링 프레임워크의 경우 dependency를 설정시 별도의 버전관리가 필요했으나, 스프링 부트의 경우 자동으로 버전관리를 해주므로 종속성이나 호환 버전에대해 신경쓸 필요가 없다
3) Spring Boot의 AutoConfiguration
스프링 부트의 main 메서드는 @SpringBootApplication 어노테이션을 가지고 있는데 이것은 ComponentScan + EnableAutoConfiguration등을 합친 어노테이션 이라볼 수 있습니다.

https://programforlife.tistory.com/68

 

4. 스프링 MVC?

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

1. Model

  • Model은 데이터 관리 및 비즈니스 로직을 처리하는 부분(DAO,DTO,Service 등)

2. View

  • View는 비즈니스 로직의 처리 결과를 통해 사용자 인터페이스가 표현되는 구간

3.Controller

  • Controller는 Model과 View를 연결해주는 역할을 한다

MVC 처리과정

DispatcherServlet : 클라이언트에게 요청을 받아 응답까지의 MVC 처리과정을 통제한다.
HandlerMapping : 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정한다.
HandlerAdapter : HandlerMapping에서 결정된 핸들러 정보로 해당 메소드를 직접 호출해주는 역할을 한다.
ViewResolver : Controller의 처리 결과(데이터)를 생성할 view를 결정한다.

 

MVC 처리과정

1. 클라이언트는 URL을 통해 요청을 전송한다.
2. 디스패처 서블릿은 핸들러 매핑을 통해 해당 요청이 어느 컨트롤러에게 온 요청인지 찾는다.
3. 디스패처 서블릿은 핸들러 어댑터에게 요청의 전달을 맡긴다.
4. 핸들러 어댑터는 해당 컨트롤러에 요청을 전달한다.
5. 컨트롤러는 비즈니스 로직을 처리한 후에 반환할 뷰의 이름을 반환한다.
6. 디스패처 서블릿은 뷰 리졸버를 통해 반환할 뷰를 찾는다.
7. 디스패처 서블릿은 컨트롤러에서 뷰에 전달할 데이터를 추가한다.
8. 데이터가 추가된 뷰를 반환한다.

 

5. 스프링 컨테이너란?

  • 스프링 컨테이너는 자바 객체의 생명 주기를 관리하며, 생성된 자바 객체들에게 추가적인 기능을 제공하는 역할을 한다 여기서 말하는 자바 객체를 스프링에서는 빈(Bean)이라고 부른다
  • Spring 프레임워크는 다른 프레임워크들과 달리 컨테이너 기능을 제공하고 있다. 이와 같은 컨테이너 기능을 제공하는 것이 가능하도록 하는 것이 IoC 패턴의 원리가 적용되서 이다.

 

6. 제어의 역전(IoC) 이란?

제어의 역전이란 객체의 생명주기를 개발자가 아닌 스프링 내부에 존재하는 IoC컨테이너가 주체가 되는 것을 의미한다
즉, 인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신해줍니다
그러므로 객체관리 주체가 컨테이너가 되기때문에 개발자는 비즈니스 로직에 집중할 수 있다.

IoC의 분류

DL(Dependency Lookup) 과 DI (Dependency Injection)

  • DL : 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lockup하는 것
  • DI : 각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것

라이브러리와 프레임워크의 차이

  • 제어의역전의 개념이 적용의 여부 차이
  • 라이브러리를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접 제어한다. 단지 동작히는 중에 필요한 기능이 있을 때 능동적으로 라이브러리를 사용할 뿐이다.
  • 반면에 프레임워크는 거꾸로 애플리케이션 코드가 프레임워크에 의해 사용된다. 보통 프레임워크 위에 개발한 클래스를 등록해두고, 프레임워크가 흐름을 주도하는 중에 개발자가 만든 애플리케이션 코드를 시용하도록 만드는 방식이다.

https://dev-coco.tistory.com/80

 

728x90

7. 의존성 주입(DI)이란?

의존성 주입이란 객체를 직접 생성하는 것이 아닌 외부에서 넣어주는 것을 의미한다 이를 통해 객체들간의 의존성을 낮추며 유연성을 높일 수 있다
https://velog.io/@wlsdud2194/what-is-di

의존성 주입 방법

1. 생성자를 이용한 의존성 주입
2. setter를 이용한 의존성 주입
- 수정자 주입을 사용하면 setter 메서드를 public으로 접근제어의 범위를 설정하기에 외부에서 변경할 수 있다는 단점이 있다
3. 필드를 이용한 의존성 주입
- 코드가 간결하지만, 외부에서 변경하기 힘들며, 프레임워크의 의존적이고 객체지향스럽지 않다

스프링에서 가장 권장하는 방법은 생성자 주입이다

그 이유는 1. 순환참조를 방지한다 2. 불변성을 가진다(final로 선언할 수 있기때문이다) 3. 테스트에 용이하다

https://dev-coco.tistory.com/70

 

8. DAO와 DTO의 차이?

DAO(Data Access Object)

  • DB의 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 객체를 말한다.
  • DB에 접근을 하기위한 로직과 비즈니스 로직을 분리하기 위해서 사용 한다.

DTO(Data Transfer Object)

  • 계층간 데이터 교환을 위한 자바빈즈를 말한다.
    • 여기서 말하는 계층은 Controller, View, Business Layer, Persistent Layer 이다.
  • 일반적인 DTO는 로직을 갖고 있지 않는 순수한 데이터 객체이며, 속성과 그 속성에 접근하기 위한 getter, setter 메소드만 가진 클래스이다.

VO(Value Object)

  • 객체의 불변성을 보장
  • 오직 read만 가능하며 gette만 가능해야한다

 

8. 스프링에서 빈(Bean)을 등록하는 방법?

빈을 등록하는 방법은 기본적으로 2 가지가 있다.

1. 컴포넌트 스캔과 자동 의존관계 설정

컴포넌트 스캔의 원리는 기본적으로 @Component 어노테이션이 있으면 자동으로 스프링 빈으로 등록된다.

 참고로, @Component 어노테이션은  @Controller , @Service, @Repository를 포함한다.

2. 자바 코드로 직접 스프링 빈 등록하기

수동으로 스프링 빈을 등록하려면 자바 설정 클래스를 만들어 사용 해야 합니다.

설정 클래스를 만들고  @Configuration 어노테이션을 클래스 선언부 위에 추가하면 됩니다. 
그리고 특정 타입을 리턴하는 메소드를 만들고, @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성됩니다. 

 

자동 빈 등록을 기본으로 사용하고, 기술적인 문제나 공통 관심사(AOP)를 처리할 때 수동빈을 사용한다 그 이유는 기술적인 문제는 애플리케이션 전반에 걸쳐 광범위하게 영향을 미치기 때문에 어디가 문제인지 명확하게 드러나지 않기에 수동빈을 사용하여 명확하게 들어낸다

 

https://dev-coco.tistory.com/69

 

8. 관점 지향 프로그래밍(AOP, Aspect Oriented Programming) 에 대해 설명?

AOP란?

AOP는 어떤 로직을 기준으로 핵심 관점 부가 관점을 나누고, 관점을 기준으로 모듈화하는 것 이다

업무 로직을 포함하는 기능을 핵심 관점

부가 관점은 핵심 로직을 실행하기 위한 데이터베이스 연결, 로깅, 파일 입출력 등

AOP 목적

소스 코드에서 여러 번 반복해서 쓰는 코드(= 흩어진 관심사, Concern)를 Aspect로 모듈화하여 핵심 로직에서 분리 및 재사용
개발자가 핵심 로직에 집중할 수 있게 하기 위함
주로 부가 기능을 모듈화

AOP 용어

1. Target
- 부가기능을 부여할 대상 (핵심기능을 담고 있는 모듈)
 
2. Aspect
- 부가기능 모듈을 Aspect라고 부른다. (핵심기능에 부가되어 의미를 갖는 모듈)
- 부가될 기능을 정의한 Advice와 Advice를 어디에 적용할지를 결정하는 PointCut을 함께 갖고 있다.
- 어플리케이션의 핵심적인 기능에서, 부가적인 기능을 분리해서 Aspect라는 모듈로 만들어서 설계하고 개발하는 방법
 
3. Advice 
- 실질적으로 부가기능을 담은 구현체
- 타겟 오브젝트에 종속되지 않기 때문에, 부가기능에만 집중할 수 있음
- Aspect가 무엇을 언제 할지를 정의
 
4. PointCut
- 부가기능이 적용될 대상(Method)을 선정하는 방법
- Advice를 적용할 JoinPoint를 선별하는 기능을 정의한 모듈
 
5. JoinPoint
- Advice가 적용될 수 있는 위치
- Spring에서는 메소드 조인포인트만 제공한다.
- 타겟 객체가 구현한 모든 메소드는 조인 포인트가 된다.
 
6. Proxy
- Target을 감싸서 Target의 요청을 대신 받아주는 랩핑 오브젝트.
- 클라이언트에서 Target을 호출하게되면, 타겟이 아닌 타겟을 감싸고 있는 Proxy가 호출되어, 
  타겟메소드 실행 전에 선처리, 후처리를 실행한다.
 
7. Introduction
- 타겟 클래스에 코드변경없이 신규메소드나 멤버변수를 추가하는 기능
 
8. Weaving
- 지정된 객체에 Aspect를 적용해서, 새로운 프록시 객체를 생성하는 과정
- Spring AOP는 런타임에서 프록시 객체가 생성된다.

AOP 특징

  • 프록시 패턴 기반의 AOP 구현체
    • Target 객체에 대한 프록시를 만들어 제공
    • Target을 감싸는 프록시는 런타임 시 생성
    • 접근 제어 및 부가 기능 추가를 위해 프록시 객체 사용
  • 프록시가 호출을 가로챔(Intercept)
    • 프록시는 타겟 객체에 대한 호출을 가로챈 다음 Advice의 부가기능 로직을 수행하고난 후에 타겟의 핵심기능 로직을 호출한다.
      (전처리 어드바이스)
    • 타겟의 핵심기능 로직 메소드를 호출한 후에 부가기능을 수행하는 경우도 있다.
      (후처리 어드바이스)
  • 스프링 Bean에만 AOP 적용 가능
    • 메소드 조인 포인트만 지원하여 메소드가 호출되는 런타임 시점에만 Advice 적용 가능
  • 모든 AOP기능을 제공하지는 않으며 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션의 각종 문제(중복 코드, 프록시 클래스 작성의 번거로움, 객체 간 관계 복잡도 증가)에 대한 해결책 지원 목적

https://dev-coco.tistory.com/81

 

9.  스케일 업과 스케일 아웃이란(대용량 트래픽의 처리)  ?

서버 운영시 서버 용량과 성능을 증가시켜야하는 경우 '스케일 업' '스케일 아웃' 으로 문제를 해결할 수 있다

스케일 업(Scale-up)

스케일 업은 기존의 서버를 보다 높은 사양으로 업그레이드하는 것을 말한다 예를 들어 CPU나 RAM등을 추가하거나 고성능 부품, 서버로 교환하는 방법이다 

이처럼 하나의 서버의 능력을 증강하기 때문에 수직 스케일링(vertical scaling)이라고도 한다.

 

소프트웨어적인 예로는 AWS의 EC2 인스턴스 사양을 micro에서 small, small에서 medium 등으로 높이는 것으로 생각하면 된다.

스케일 아웃(Scale-out)

스케일 아웃(Scale-out)은 장비를 추가해서 확장하는 방식을 말한다.

서버가 여러 대로 나뉘기 때문에 각 서버에 걸리는 부하를 균등하게 해주는 '로드밸런싱'이 필수적으로 동반되어야 한다.

이처럼 여러 대의 서버로 나눠 시스템을 확장하기 때문에 수평 스케일로 불리기도 한다.

 

10.  필터(Filter)와 인터셉터(Interceptor)의 차이?

Filter, Interceptor

  • 애플리케이션에서 자주 사용되는 기능(공통 부분)을 분리하여 관리할 수 있도록 Spring이 제공하는 기능

 

필터와 인터셉터의 흐름

Filter 특징

  • Dispatcher Servlet 이전에 수행되고, 응답 처리에 대해서도 변경 및 조작 수행 가능
    • WAS 내의 ApplicationContext에서 등록된 필터가 실행
  • WAS 구동 시 FilterMap이라는 배열에 등록되고, 실행 시 Filter chain을 구성하여 순차적으로 실행
  • Spring Context 외부에 존재하여 Spring과 무관한 자원에 대해 동작
  • 예외 발생 시 Web Application에서 예외 처리
  • ex. 인코딩 변환, XSS 방어 등
  • 실행 메소드
    • init() : 필터 인스턴스 초기화
    • doFilter() : 실제 처리 로직
    • destroy() : 필터 인스턴스 종료

Interceptor 특징

  • Dispatcher Servlet 이후 Controller 호출 전, 후에 끼어들어 기능 수행
  • Spring Context 내부에서 Controller의 요청과 응답에 관여하며 모든 Bean에 접근 가능
  • 예외 발생 시 @ControllerAdvice에서 @ExceptionHandler를 사용해 예외 처리
  • ex. 로그인 체크, 권한 체크, 로그 확인 등
  • 실행 메소드
    • preHandler() : Controller 실행 전
    • postHandler() : Controller 실행 후
    • afterCompletion() : view Rendering 후

Filter, Interceptor 차이점 요약

  • Filter는 WAS단에 설정되어 Spring과 무관한 자원에 대해 동작하고, Interceptor는 Spring Context 내부에 설정되어 컨트롤러 접근 전, 후에 가로채서 기능 동작
  • Filter는 doFilter() 메소드만 있지만, Interceptor는 pre와 post로 명확하게 분리
  • Interceptor의 경우 AOP 흉내 가능
    • handlerMethod(@RequestMapping을 사용해 매핑 된 @Controller의 메소드)를 파라미터로 제공하여 메소드 시그니처 등 추가 정보를 파악해 로직 실행 여부 판단 가능

 

 

 

 

 



https://steady-coding.tistory.com/457
https://dev-coco.tistory.com/163

728x90
반응형

'Interview' 카테고리의 다른 글

면접 예상 질문 - 운영체제  (0) 2022.09.06
면접 예상 질문 - 알고리즘  (0) 2022.08.27
면접 예상 질문 - 데이터베이스  (0) 2022.08.12
면접 예상 질문 -Java  (0) 2022.07.23
Comments