카테고리 없음

Spring 면접 정리

JUNGKEUNG 2024. 12. 22. 12:51
반응형

WAS(We Application Server)와 WS(We Server)의 차이를 설명하세요

WAS (Web Applicaion Server)

  • 비즈니스 로직을 넣을 수 있음
  • Tomcat 등 (종류 더 조사)

WS(Web Server)

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

 

 

FrameWork VS Library 

프레임 워크 : 뼈대나 기반구조를 뜻하고, 제어의 역전 개념이 적용된 대표적인 기술이다. 소프트웨어에서의 프레임워크는 '소프트웨어의 특정 문제를 해결하기 위해서 상호협력하는 클래스와 인터페이스의 집합'이라 할 수 있으며, 완성된 어플리케이션이 아닌 프로그래머가 완성시키는 작업을 해야 한다. 

 

객체 지향 개발을 하게 되면서 통합성, 일관성의 부족이 발생되는 문제를 해결할 방법 중 하나라고 할 수 있다.

프레임워크의 특징

  • 특정 개념들의 추상화를 제공하는 여러 클래스나 컴포넌트로 구성되어 있습니다.  
  • 추상적인 개념들이 문제를 해결하기 위해 같이 작업하는 방법을 정의합니다. 
  • 컴포넌트들은 재사용이 가능합니다. 
  •  높은 수준에서 패턴들을 조작화 할 수 있습니다.

라이브러리(Library)

라이브러리는 단순 활용가능한 도구들의 집합을 말합니다.

즉, 개발자가 만든 클래스에서 호출하여 사용, 클래스들의 나열로 필요한 클래스를 불러서 사용하는 방식을 취하고 있습니다.

 

 

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

라이브러리와 프레임워크의 차이는 제어 흐름에 대한 주도성이 누구에게/어디에 있는가에 있습니다.

즉, 어플리케이션의 Flow(흐름)를 누가 쥐고 있느냐에 달려 있습니다.

프레임워크는 전체적인 흐름을 스스로가 쥐고 있으며 사용자는 그 안에서 필요한 코드를 짜 넣으며 반면에 라이브러리는 사용자가 전체적인 흐름을 만들며 라이브러리를 가져다 쓰는 것이라고 할 수 있습니다.

다시 말해, 라이브러리는 라이브러리를 가져다가 사용하고 호출하는 측에 전적으로 주도성이 있으며 프레임워크는 그 틀안에 이미 제어 흐름에 대한 주도성이 내재(내포)하고 있습니다.

프레임워크는 가져다가 사용한다기보다는 거기에 들어가서 사용한다는 느낌/관점으로 접근할 수 있습니다.

 

Spring Framework에 대해 설명해주세요.

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

  • 경량 컨테이너로서 자바 객체를 직접 관리
    • 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
  • 제어의 역전(IoC)이라는 기술을 통해 어플리케이션의 느슨한 결합을 도모
    • 컨트롤의 제어권이 사용자가 아닌 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
  • 의존성 주입(DI, Dependency Injection)을 지원
    • 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜 준다.
  • 관점 지향 프로그래밍(AOP, Aspect-Orented Programming)을 지원
    • 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.

 

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

제어의 역전(IoC)란 모든 객체에 대한(생성, 라이프사이클 등) 제어권을 개발자가 아닌 IoC 컨테이너에게 넘긴 것을 말합니다.
스프링에서는 IoC 컨테이너에 객체들을 생성하면 객체끼리 의존성을 주입(DI, Dependency Injection)하는 역할을 하고
컨테이너에 등록한 객체들을 '빈'이라고 합니다.

 

의존성 주입(DI, Dependency Injection)에 대해 설명해 주세요.

의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아서 사용하는 것입니다.
이를 통해 객체 간의 결합도를 줄이고 코드의 재사용성을 높일 수 있습니다.

의존성 주입은 생성자 주입, 필드 주입, 세터 주입의 3 가지 방법이 있습니다.
이 중 Spring에서 가장 권장하는 의존성 주입 방법은 생성자를 통한 주입 방법입니다.
그 이유는 1. 순환 참조를 방지 2. 불변성을 가짐 3. 테스트에 용이하기 때문입니다.

 

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

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

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

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

 

@RequstBody, @RequestParam, @ModelAtribute의 차이를 설명해 주세요.

@RquestBody : 클라이언트가 전송하는 JSON 형태의 HTP Body 내용을 MessageConverer를 통해 Java Object로 변환시켜 주는 역할을 한다. 

값을 주입하지 않고 값을 변환시키므로 (Reflection을 사용해 할당), 변수들의 생성자, Getter, Seter가 없어도 정상적으로 할당된다.

 

 

 @RequestParam : 1개의 HTTP 요청 파라미터를 받기 위해 사용한다. @RequestParam은 필수여부가 True이기 때문에, 기본적으로 반드시 해당 파라미터가 전송되어야 한다. 전송되지 않으면 400 Error를 유발할 수 있으며, 반드시 필요한 변수가 아니라면 required의 값을 false로 설정해줘야 한다.

 

 

@ModelAttribute : HTTP Body 내용과 HTTP 파라미터의 값들을 생성자, Getter, Setter를 통해 주입하기 위해 사용한다.

값 변환이 아닌 값을 주입시키므로 변수들의 생성자나 Getter, Setter가 없으면 변수들이 저장되지 않는다.

 

 

Spring Boot과 Spring Framework의 차이점을 설명해 주세요

가장 큰 차이점은 Auto Configuration의 차이인 것 같다. Spring은 프로젝트 초기에 다양한 환경설정을 해야 하지만, SpringBoot는 설정의 많은 부분을 자동화하여 사용자가 편안하게 스프링을 활용할 수 있도록 돕는다. 

Spring boo starter dependency만 추가해 주면 설정은 끝내고, 내장된 포맷을 제공해 서버를 바로 실행할 수 있다.

Auto Configuraion이란?
스프링부트는 자동 구성(Auto Configuraion) 기능을 제공하는데, 일반적으로 수많은 빈들을 자동으로 등록해 주는 기능이다. 이러한 기능으로 인해 반복적으로 빈을 등록하고 설정하는 부분을 줄이고 편리한 개발을 할 수 이게 도와주며 스프링 부트의 핵심적인 장점이라 할 수 있다.

 

Spring MVC에 대해 설명하시오

  • MVC는 Model, View, Controller의 약자이며, 각 레이어 간 기능을 구분하는데 중점을 둔 디자인 패턴입니다.
  • Model은 데이터 관리 및 비즈니스 로직을 처리하는 부분이며, (DAO, DTO, Service 등)
  • View는 비즈니스 로직의 처리 결과를 통해 유저 인터페이스가 표현되는 구간입니다. (html, jsp, tymeleaf, mustache 등 화면을 구성하기도 하고, Rest API로 서버가 구현된다면 json 응답으로 구성되기도 한다.)
  • Controller는 사용자의 요청을 처리하고 Model과 View를 중개하는 역할을 합니다. Model과 View는 서로 연결되어 있지 않기 때문에 Controller가 사이에서 통신 매체가 되어줍니다.

 

MVC는 어떠한 흐름으로 요청을 처리하는지 설명해 주세요.

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

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

 

 

 


스프링에서 빈(Bean)을 등록하는 방법에 대해 말해보세요.

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

1. 우선 가장 쉬운 방법으로 @Component 어노테이션을 사용하는 것입니다.
@Controller, @Service, @Repository는 모두 @Component를 포함하고 있습니다.

2. 설정 클래스를 따로 만들어 @Configuration 어노테이션을 붙이고,
해당 클래스 안에서 빈으로 등록할 메소드를 만들어 @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성됩니다.


스프링 빈의 라이프사이클은 어떻게 관리되는지 설명해 주세요.

먼저 스프링 Bean의 LifeCycle은 다음과 같습니다.

스프링 IoC 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 메서드 호출 → 사용 → 소멸 전 콜백 메소드 호출 → 스프링 종료

스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 관리합니다.

1. 인터페이스( InitializingBean, DisposableBean )
2. 설정 정보에 초기화 메서드, 종료 메소드 지정
3. @PostConstruct, @PreDestroy 어노테이션 지원

 

 

@Component / @Bean 차이

둘 다 IoC 컨테이너에 Bean을 등록하기 위해 사용한다.

  • @Component는 class를 기반으로 실행시점에 인스턴스 객체를 생성한다. @Controller, @Service, @Repository 등 모두 @Component를 포함하고 있으며 실행시점에 자동으로 의존성을 주입한다.
  • @Bean은 method 기반으로 메서드에서 반환하는 객체를 인스턴스 객체로 생성한다

 

CORS 에러 방안

1. Filtre를 사용하여 Cors 설정

2. WebMvcConfigurer를 구현한 Configuration 클래스를 만들어 addCorsMappings()를 재정의

3. Spring Securiy에서 CorsConfigurationSource를 Bean으로 등록하여 config에 추가

4. Controller 클래스에 @Crossorigin 어노테이션

 

 

 

Annoaion에 대해 설명하세요

프로그램에게 추가적인 정보를 제공하는 메타데이터입니다. annotation을 정의하고, 원하는 위치에 배치한 후, 코드가 실행되는 도중 자바 리플렉션을 이용해 추가 정보를 획득해 기능을 실행하는 방식으로 동작한다.

 

Spring 컨테이너에서 객체가 호출되면, 객체의 인스턴스를 생성하게 되는데 이때 자바 리플렉션이 필요하게 된다.

 

 

Spring에서 제공하는 대표적인 Annotation 몇 가지만 예를 들어주세요

  • @ComponentScan
    • @Component, @service, @Repository, @controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 Bean을 등록해 주는 애노테이션
    • 전부 다 @Component를 사용하지 않고 @Repository 등으로 분리해서 사용하는 이유는, 예를 들어 @Repositroy는 DAO에서 발생할  있는 unckecked exception들을 스프링의 DataAccessException으로 처리할 수 있기 때문이다.
    • 가독성에서도 해당 애노테이션을 갖는 클래스가 무엇을 하는지 단 번에 알 수 있다.
  • @EnableAutoConfiguration
    • autoConfiguration도 Configuration 중 하나에 해당한다.
    • spring.factories 내부에 여러 Configuration들이 있고 조건에 따라 Bean이 등록하게 되는데 메인 클래스 @SpringBootApplicion을 실행하면 @EnableAutoCOnfiguration에 의해 spring.factories 안에 있는 수많은 자동 설정들이 조건에 따라 적용되어 수많은 Bean들이 생성된다.
    • 간단하게 정리하면, Application Context를 만들 때 자동으로 빈 설정이 되도록 하는 기능이다.

 


Lombok 라이브러리에 대해 알고 있나요? 알고 있다면 롬복이 만드는 메서드들이 생성되는 시점은 언제인가요?

Lombok은 메서드를 컴파일하는 과정에 개입해서 추가적인 코드를 만들어냅니다. 이것을 어노테이션 프로세싱이라고 하는데,
어노테이션 프로세싱은 자바 컴파일러가 컴파일 단계에서 어노테이션을 분석하고 처리하는 기법을 말합니다.
(Lombok 라이브러리를 추가할 때 CompileOnly, AnnotationProcessor를 추가하는 이유도 된다.)


 서블릿(Servlet)에 대해 설명해 주세요.

클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술입니다.
Spring MVC에서 Controller로 이용되며, 사용자의 요청을 받아 처리한 후에 결과를 반환합니다.
간단히 - 자바를 사용해 웹을 만들기 위해 필요한 기술

 

서블릿의 동작 방식에 대해 설명해 주세요.

  1. 사용자(Client)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송됩니다.
  2. 요청받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성합니다.
  3. web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾습니다.
  4. 해당 서블릿에서 service메서드를 호출한 후 GET, POST여부에 따라 doGet() 또는 doPost()를 호출합니다.
  5. doGet() or doPost() 메서드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보냅니다.
  6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킵니다.

 

VO와 BO, DAO, DTO에 대해 설명해 주세요.

  • DAO(Data Access Object) DB의 데이터에 접근을 위한 객체를 말합니다. (Repository 또는 Mapper에 해당)
  • BO(Business Object) 여러 DAO를 활용해 비즈니스 로직을 처리하는 객체를 말합니다. (Service에 해당)
  • DTO(Data Transfer Object) 각 계층 간의 데이터 교환을 위한 객체를 말합니다. (여기서 말하는 계층은 Controller, View, Business Layer, Persistent Layer)
  • VO (Value Object) 실제 데이터만을 저장하는 객체를 말합니다.

 대용량 트래픽에서 장애가 발생하면 어떻게 대응할 것인가요?

스케일 업을 통해 하드웨어 스펙을 향상 / 스케일 아웃을 통해 서버를 여러 대 추가해 시스템을 증가


Scope의 종류

  • 싱글톤
    • Spring 프레임워크에서 기본이 되는 스코프스프링 컨테이너의 시작과 종료까지 1개의 객체로 유지됨
  • 프로토 타입
    • 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않는 스코프
    • 요청이 오면 향상 새로운 인스턴스를 생성하여 반환하고 이후에 관리하지 않음
    • 프로토타입을 받는 클라이언트가 객체를 관리해야 함
    • request: 각각의 요청이 들어오고 나갈 때까지 유지되는 스코프
    • session: 세션이 생성되고 종료될 때까지 유지되는 스코프
    • application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프 

 

스코프에서 프로토타입과 웹 설정 하는 이유

 

프로토타입 스코프 사용 이유

1) 매번 독립적인 인스턴스가 필요할 때

  • 요청마다 객체의 상태가 달라져야 하는 경우, 독립적인 객체를 생성해서 처리하기 위해 사용합니다.
  • 예: 여러 사용자 요청에서 서로 다른 상태를 가진 계산기 객체, 데이터 처리 객체 등.

2) 메모리 효율성

  • 컨테이너가 더 이상 객체를 관리하지 않으므로 메모리 관리의 부담을 줄일 수 있습니다.
  • 필요할 때 객체를 생성하고, 사용 후 클라이언트(사용자 코드)가 직접 관리하므로 컨테이너의 불필요한 부하를 줄임.

3) 멀티스레드 환경에서 안전

  • 프로토타입 스코프는 항상 새로운 인스턴스를 생성하기 때문에 스레드 간 객체 공유로 인한 문제(race condition, 데이터 충돌 등)가 발생하지 않습니다.
  • 예: 다수의 사용자 요청에서 각 사용자마다 새로운 인스턴스를 생성해야 할 때.

 

웹 스코프를 사용하는 이유

각 요청이나 세션, 애플리케이션 수준에 적합한 객체 관리

웹 애플리케이션에서는 요청(Request), 세션(Session), 애플리케이션(Application)마다 필요한 객체의 생명 주기가 다릅니다. 이를 효율적으로 관리하기 위해 스코프를 사용합니다.

Request 스코프의 사용 이유

  • 요청마다 초기화된 데이터를 처리하고, 요청이 끝나면 메모리를 해제.
  • 같은 요청 내에서 동일한 객체를 사용해야 할 때.
  • 예: 사용자가 검색 요청을 보내면, 요청 처리 중에만 유지되는 임시 데이터를 관리.

Session 스코프의 사용 이유

  • 사용자가 로그인하거나 세션 동안 유지해야 할 데이터를 관리.
  • 예: 로그인 정보, 장바구니 데이터.
  • 세션이 종료되면 자동으로 데이터가 사라지므로 수동으로 메모리를 해제할 필요 없음.

Application 스코프의 사용 이유

  • 애플리케이션 전체에서 공통으로 사용해야 하는 데이터를 관리.
  • 객체를 한 번만 생성하고 모든 요청과 세션에서 공유하므로 메모리 효율적.
  • 예: 설정 정보, 전역 캐시 데이터, 애플리케이션 수준의 공통 데이터(예: 통계 정보).

 

Spring의 싱글톤 패턴에 대해 설명해 주세요.

스프링에서 bean 생성 시 별다른 설정이 없으면 default로 싱글톤이 적용됩니다.
스프링은 컨테이너를 통해 직접 싱글톤 객체를 생성하고 관리하는데,
요청이 들어올 때마다 매번 객체를 생성하지 않고, 이미 만들어진 객체를 공유하기 때문에 효율적인 사용이 가능합니다.
이를 통해 다음과 같은 장점을 얻을 수 있습니다.

  • static 메서드나 private 생성자 등을 사용하지 않아 객체지향적 개발을 할 수 있다.
  • 테스트하기 편리하다.

 

Spring의 스코프 프로토 타입 빈에 대해 설명해 주세요.

프로토타입 빈은 싱글톤(default bean) 빈과는 달리 컨테이너에게 빈을 요청할 때마다 매번 새로운 객체를 생성하여 반환해 줍니다.
이렇게 빈의 scope를 간단하게 관리해 줄 수 있는 것이 spring의 장점입니다.
빈의 scope 설정은 @Scope 어노테이션으로 설정하며, 프로토타입 scope로 설정하려면 @Scope(”prototype”)와 같이 문자열로 지정해 줍니다.


 @Transactional의 동작 원리에 대해 설명해 주세요.

@Transactional을 메서드 또는 클래스에 명시하면, AOP를 통해 Target이 상속하고 있는 인터페이스 또는 Target 객체를 상속한 Proxy 객체가 생성되며, Proxy 객체의 메서드를 호출하면 Target 메소드 전 후로 트랜잭션 처리를 수행합니다.


 

 @Transactional를 스프링 Bean의 메소드 A에 적용하였고, 해당 Bean의 메소드 B가 호출되었을 때, B 메소드 내부에서 A 메소드를 호출하면 어떤 요청 흐름이 발생하는지 설명해 주세요.

프록시는 클라이언트가 타겟 객체를 호출하는 과정에만 동작하며, 타겟 객체의 메소드가 자기 자신의 다른 메소드를 호출할 때는 프록시가 동작하지 않습니다.
즉, A 메소드는 프록시로 감싸진 메소드가 아니므로 트랜잭션이 적용되지 않은 일반 코드가 수행됩니다.

 

 

 Spring Filter와 Interceptor에 대해 설명하고, 사용 예시를 설명해주세요.

필터는 말 그대로 요청과 응답을 거른 뒤 정제하는 역할을 합니다.
스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 되는 것이고, 스프링 범위 밖에서 처리됩니다.
Dispatcher Servlet에 요청이 전달되기 전 / 후에 url 패턴에 맞는 모든 요청에 대해 부가 작업을 처리할 수 있는 기능을 제공합니다.
사용 사례 :

  • 보안 및 인증/인가 관련 작업
  • 모든 요청에 대한 로깅 또는 검사
  • 이미지/데이터 압축 및 문자열 인코딩
  • Spring과 분리되어야 하는 기능

인터셉터는 요청에 대한 작업 전 / 후로 가로채 요청과 응답을 참조하거나 가공하는 역할을 합니다.
웹 컨테이너에서 동작하는 필터와 달리 인터셉터는 스프링 컨텍스트에서 동작합니다.
Dispatcher Servlet이 Controller를 호출하기 전 / 후에 인터셉터가 끼어들어 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공
사용 사례 :

  • 세부적인 보안 및 인증/인가 공통 작업
  • API 호출에 대한 로깅 또는 검사
  • Controller로 넘겨주는 정보(데이터)의 가공

 

  • 필터에 대한 동작 방식
    • Interceptor와 Filter는 Servlet 단위에서 실행된다. 반면 AOP는 메소드 앞에 Proxy패턴의 형태로 실행된다.

 


A 라는 Service 객체의 메소드가 존재하고, 그 메소드 내부에서 로컬 트랜잭션 3개(다른 Service 객체의 트랜잭션 메소드를 호출했다는 의미)가 존재한다고 할 때, @Transactional을 A 메소드에 적용하면 어떤 요청 흐름이 발생하는지 설명해주세요.

트랜잭션 전파 수준에 따라 달라지는데, 만약 기본 옵션인 Required를 가져간다면 로컬 트랜잭션 3개가 모두 부모 트랜잭션인 A에 합류하여 수행됩니다.
그래서 부모 트랜잭션이나 로컬 트랜잭션 3개나 모두 같은 트랜잭션이므로 어느 하나의 로직에서 문제가 발생하면 전부 롤백이 됩니다.