기술 면접 질문 - Spring

young.h·2022년 8월 14일
0

CS

목록 보기
4/6
post-thumbnail

스프링 기본

스프링 프레임워크란?

자바 기반의 오픈 소스 프레임워크로 특정 기술에 종속되지 않고 객체 지향 언어의 특징을 잘 살려내는 프레임워크 입니다. 스프링은 DI컨테이너(의존성 주입)를 사용해서 객체를 관리하여 제어의 역전과 의존성 주입을 통해 결합도를 낮추게 됩니다.

제어의 역전이란 객체의 생성부터 생명주기의 관리까지 다른 대상에게 위임하는 것이고 의존성 주입이란 스프링에서 지원하는 제어의 역전의 형태로
클래스 사이의 의존 관계를 컨테이너가 자동으로 연결해주는 것 입니다.

DI란 무엇인가요?

스프링에서 지원하는 제어의 역전의 형태로
클래스 사이의 의존 관계를 컨테이너가 자동으로 연결해주는 것 입니다.

IOC란 무엇인가요?

객체의 생성부터 생명주기의 관리까지 다른 대상에게 위임하는 것입니다.

Filter vs Intercepter 차이?

Filter는 WAS단에 설정되어 Spring과 무관한 자원에 대해 동작하고, Interceptor는 Spring Context 내부에설정되어 컨트롤러 접근 전, 후에 가로채서 기능 동작합니다.
필터는 request/response 조작이 가능하지만 인터셉터는 불가하며
필터의 경우 모든 요청에 대한 로깅을 하거나 이미지, 데이터 압축 또는 문자열 인코딩에 사용하며 인터셉터는 인증/인가, 컨트롤러로 넘겨주는 정보의 가공, API 호출에 대한 로깅을 할 때 사용합니다.

스프링 부트와 레거시 차이점

기존의 스프링은 설정에 너무 많은 시간을 필요로 하였으며 톰캣과 같은 WAS를 별도로 설치해주어야하는 불편함이 있었는데, 이를 해결하기 위해 나온 것이 스프링 부트입니다.
스프링 부트는 스프링을 편하게 사용할 수 있도록 지원하는 것으로 톰캣 같은 웹 서버 내장, 외부 라이브러리 자동 구성, 단독으로 실행 가능한 스프링 애플리케이션을 쉽게 생성해줍니다.

스프링 Bean이 무엇인지?

스프링 컨테이너 안에 들어있는 객체로 필요할 때 컨테이너에서 가져와서 사용 @Bean 을 사용하거나 xml 설정을 통해 일반 객체를 Bean으로 등록할 수 있고, Bean으로 등록된 객체는 쉽게 주입하여 사용 가능합니다.

bean의 생명주기?

객체 생성 -> 의존 설정 -> 초기화 -> 사용 -> 소멸 스프링 컨테이너가 생명주기 관리를 해줍니다. 스프링 컨테이너 초기화 시 빈 객체를 생성, 의존 객체 주입하며 컨테이너 종료 시 빈 객체 소멸합니다.

Bean Scope

singleton (default) 애플리케이션에서 Bean 등록 시 singleton scope로 등록됩니다. Spring IoC 컨테이너 당 한 개의 인스턴스만 생성되며 컨테이너가 Bean을 가져다 주입할 때 항상 같은 객체 사용하게 됩니다. 메모리나 성능 최적화에 유리하다는 장점이 있습니다. prototype 컨테이너에서 Bean 가져다 쓸 때 항상 다른 인스턴스 사용합니다. 모든 요청에서 새로운 객체를 생성하며 gc에 의해 Bean 제거합니다. 그럼 빈의 트랜잭션 관리는 어떻게 할까?

bean 등록 방법에는 어떤 게 있는지?

IoC Container에 Bean을 등록하는 방법으로는 xml 설정파일을 이용하는 방법, Configuration 클래스에서 애노테이션을 사용해서 Bean을 등록하는 방법, Bean 등록을 하고 싶은 클래스에서 애노테이션을 통해서 Bean을 등록하는 방법이 존재합니다. 마지막의 경우 Component Scan이 꼭 필요하지만 Spring Boot의 경우 Component Scan까지 자동으로 구성해줘서 스프링 환경을 매우 편리하게 사용할 수 있습니다.

bean 주입 방법

@Autowired를 어노테이션을 이용한 필드 주입
setter를 사용한 주입
@RequiredArgsConstructor 어노테이션을 이용한 생성자 주입 세가지 방법이 있는데 마지막 생성자 주입이 가장 권장됩니다. 필드 주입의 경우 가장 짧은 코드로 구현이 가능하지만 추후 변경할 수 있는 방법이 없고
setter 주입의 경우 public 메서드에서 개발자가 임의로 호출할 수 있기 때문에 보안상의 문제가 있기 때문에 권장되지 않습니다.
생성자 주입의 경우 null을 주입하지 않는 한 널포인트익셉션이 발생하지 않고
final 키워드를 사용하여 객체의 불변을 유지할 수 있는 장점이 있습니다.

Spring MVC 설명해주세요.

요청이 dispatcherServlet 으로 들어오면
-> handlerMapping을 통해 적절한 컨트롤러를 찾고
디스패쳐 서블릿은 핸들러 어댑터에게 요청의 전달을 맡깁니다.
-> handelerAdaptor 에서 해당 컨트롤러에게 요청을 전달합니다.
-> controller는 비지니스 로직을 처리한 후에 뷰의 이름을 반환합니다.
-> 디스패쳐 서블릿은 뷰 리졸버를 통해 반환할 뷰를 찾고 데이터를 추가합니다.
-> 데이터가 추가된 뷰를 반환합니다.

AOP

성능검사, 로깅, 권한체크 등의 횡단 관심사
인프라 로직: 애플리케이션 전 영역에 나타날 수 있으며
중복코드를 만들어 낼 가능성 때문에 유지보수가 힘들어집니다.
또한 비즈니스 로직과 함께 있으면 비즈니스 로직을 이해하기 어려워짐
부가 기능.

용어
1. target : 어떤 대상에 부가 기능을 부여할 것인가
2. advice: 어떤 부가 기능? before, After Returning, AfterThrowing, After, Around
3. Joint point: 어디에 적용할 것인가? 메서드, 필드, 객체 등

  • 스프링에서는 메서드만 한정
  1. Point cut: 실제 advice가 적용될 지점, Spring AOP에서는 advice가 적용될 메서드를 선정

구현방법
컴파일하는 시점에, 클래스 로드시에(클래스 로더가 메모리에 올릴 때)
프록시 패턴(스프링) 타겟 클래스를 부가기능으로 감싸는 프록시로 감싸서 실행.

Servlet 이란 무엇인가요?

Servlet이란 특정한 타입의 네트워크 요청에 응답하기 위한 Java EE의 인터페이스 즉, 명세입니다. 보통 구현체로 HttpServlet을 사용하며 Spring MVC에서는 DispatcherServlet을 Front Controller로 사용합니다.

Servlet과 WAS(Servlet Container)의 관계는 어떻게 되나요?

Servlet Container는 설정 파일(web.xml)을 읽고, servlet 클래스를 식별한 다음 ClassLoader를 사용하여 JVM에 로드하고 요청에 알맞는 Servlet을 실행합니다.Servlet Container는 요청이 들어올 때마다 서블릿을 생성하며 하나의 서블릿에는 하나의 쓰레드가 할당됩니다.

Spring batch

사용 이유

일괄 처리에 필요한 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 기능을 제공하기 때문입니다.

멱등성 유지 방법

멱등성이란 연산을 여러번 적용하더라도 결과가 달라지지 않는 성질을 말합니다.
잡 파라미터 조정

스프링 배치 메타 데이터 테이블은 어떤 게 있는지? (상태값, 메타 테이블)

  • BATCH_JOB_INSTANCE : 잡의 생성정보
  • BATCH_JOB_EXECUTION : 잡의 실행 정보
  • BATCH_JOB_EXECUTION_PARAM : 잡에서 사용되는 파라미터 정보
  • BATCH_JOB_EXECUTION_CONTEXT: 작업 중 사용되는 모든 정보가 기록됨
  • BATCH_STEP_EXECUTION: 배치 step의 실행정보를 담는 테이블
  • BATCH_STEP_EXECUTIOIN_CONTEXT: step에서 사용되는 모든 정보가 기록

배치 중간에 실패하면 어떻게 처리했는지?

skip, retry 기능을 사용했습니다.

tasklet model vs reader, processor, writer 차이점

데이터 처리과정이 tasklet안에서 한번에 이루어 지기 때문에 배치 작업이 단순한 쿼리 수행 혹은 db 프로시저를 트리거하는 역할이라면 태스클릿을 사용하는 게 좋습니다.

배치 실행 방법

젠킨스를 통해서 스케줄링하고 실행함

Spring-security

1. 사용자가 로그인 정보와 함께 인증 요청을 한다.(Http Request)
2.  AuthenticationFilter가 요청을 가로채고, 가로챈 정보를 통해 UsernamePasswordAuthenticationToken의 인증용 객체를 생성한다.
3. AuthenticationManager의 구현체인 ProviderManager에게 생성한 UsernamePasswordToken 객체를 전달한다.**
4. AuthenticationManager는 등록된 AuthenticationProvider(들)을 조회하여 인증을 요구한다.
5. 실제 DB에서 사용자 인증정보를 가져오는 UserDetailsService에 사용자 정보를 넘겨준다.
6. 넘겨받은 사용자 정보를 통해 DB에서 찾은 사용자 정보인 UserDetails 객체를 만든다.
7. AuthenticationProvider(들)은 UserDetails를 넘겨받고 사용자 정보를 비교한다.
8. 인증이 완료되면 권한 등의 사용자 정보를 담은 Authentication 객체를 반환한다.
9. 다시 최초의 AuthenticationFilter에 Authentication 객체가 반환된다.
10. Authenticaton 객체를 SecurityContext에 저장한다.

oAuth에 대해 알고 있는지?

인터넷 사용자들이 비밀번호를 제공하지 않고
다른 웹사이트 상의 자신들의 정보에 대해
웹사이트나 애플리케이션의 "접근 권한"을 부여할 수 있는 공통적인 수단(표준)이다.
OAuth를 통해서 많은 서비스들이 ID & PW가 아닌 Access Token(접근 토큰)을 통해서 서비스를 이용할 수 있습니다.

Acess Token

OAuth를 통해 최종적으로 발급되는 정보로 보안에 취약한 방식인 ID & PW 방식의 로그인을 대체해준다.접근 토큰에는 자원 서버에서 사용할 수 있는 기능의 범위(Scope)와 접근 가능한 유효 시간에 대한 정보가 담겨있다.

efresh
보편적으로 접근 토큰과 함께 재발급용 토큰을 같이 전달한다.
접근 토큰의 유효기간이 종료되어 새로운 접근 토큰을 발급받아야 할 때 재발급 토큰이 사용된다.

0개의 댓글