기술면접 (Spring)

너구리로소이다·2023년 5월 10일
0

skill-Interview

목록 보기
2/2

💡WAS(Web Application Server)와 WS(Web Server)의 차이를 설명해주세요.

웹서버는 정적인 데이터를 처리하는 서버입니다. 이미지나 단순 html 같은 정적인 리소스들을 전달하며 WAS만을 이용할 경우보다 빠르고 안정적으로 기능을 수행합니다. WAS는 동적인 데이터를 위주로 처리하는 서버입니다. DB와 연결되어 사용자와 데이터를 주고받고 조작이 필요한 경우 WAS를 활용합니다.

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

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

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

필터는 톰캣과 같은 웹컨테이너에 의해 관리가 되며, Dispatcher Servlet에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리 할 수 있는 기능을 제공합니다. 인터셉터는 스프링 컨텍스트에서 동작하며, Dispatcher Servlet이 controller를 호출하기 전/후에 인터셉터가 끼어들어 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공
필터는 요청과 응답을 거른 뒤 정제하는 역할을 합니다.
필터 사용 사례 :
* 보안 및 인증/인가 관련 작업
* 모든 요청에 대한 로깅 또는 검사
* 이미지/데이터 압축 및 문자열 인코딩
* Spring과 분리되어야 하는 기능
인터셉터를 요청에 대한 작업 전/후로 가로채 요청과 응답을 참조하거나 가공하는 역할을 합니다.
인터셉터 사용 사례 :
* 세부적인 보안 및 인증/인가 공통 작업
* API 호출에 대한 로깅 또는 검사
* Controller로 넘겨주는 정보(데이터)의 가공

💡⭐Spring WebFlux에 대해 설명해주세요.

리액티브 프로그래밍을 통해 비동기 데이터 스트림으로 Non-Blocking 애플리케이션을 개발하기 위한 Spring WebFlux 프레임워크

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

AOP는 핵심 비즈니스 로직에 있는 공통 관심사를 분리하여 각각 모듈화하는 것을 의미하며, 인증,로깅, 트랜잭션 처리에 용이합니다. 가장 큰 특징은 중복 코드 제거, 재활용성의 극대화, 변화수용의 용이성이 좋다는 점입니다.

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

의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아서 사용하는 것입니다. 생성자주입, 필드주입, 세터주입의 3가지 방법이 있으며, Spring에서 권장하는 방법은 생성자를 통한 주입이며, 그 이유는 순환참조 방지, 불변성을 가짐, 테스트에 용이하기 때문입니다.

💡@RequestBody, @RequestParam, @ModelAttribute의 차이를 설명해주세요.

@RequestBody 는 클라이언트가 전송하는 JSON 형태의 HTTP Body 내용을 MessageConverter를 통해 Java Object로 변환시켜주는 역할을 하고, 값을 주입하지 않고 값을 변환 시키므로(Reflection을 사용해 할당), 변수들의 생성자, Getter,Setter가 없어도 정상적으로 할당된다. @RequestParam 은 1개의 HTTP 요청 파라미터를 받기 위해 사용합니다. @RequestParam은 필수 여부가 true이기 때문에, 기본적으로 반드시 해당 파라미터가 전송되어야 합니다. 전송되지 않으면 400Error를 유발할 수 있으며, 반드시 필요한 변수가 아니라면 required의 값을 false로 설정해줘야 합니다. @ModelAttribute 는 HTTP Body 내용과 HTTP 파라미터의 값들을 생성자,Getter,Setter를 통해 주입하기 위해 사용합니다. 값 변환이 아닌 값을 주입시키므로 변수들의 생성자나 Getter,Setter가 없으면 변수들이 저장되지 않는다.

💡Spring Boot와 Spring Framework의 차이점을 설명해주세요.

가장 큰 차이점은 Auto Configuration의 차이인 것 같습니다. Spring은 프로젝트 초기에 다양한 환경설정을 해야 하지만, Spring Boot는 설정의 많은 부분을 자동화하여 사용자가 편하게 스프링을 활용할 수 있도록 돕습니다. spring boot starter dependency만 추가해 주면 설정은 끝나고, 내장된 톰캣을 제공해 서버를 바로 실행할 수 있습니다.

💡Spring MVC에 대해 설명해주세요.

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

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

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

💡DispatcherServlet, HandlerMapping, HandlerAdapter, ViewResolver에 대해 설명해주세요.

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

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

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

💡IoC 컨테이너에 대해 설명해주세요.

인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해줍니다. 객체관리 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에 집중할 수 있는 장점이 있습니다. * POJO(Plain Old Java Object)란? 주로 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object를 지칭한다. Java Bean 객체가 대표적이다. 간단하게 getter / setter를 생각하면 될 것 같다.

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

빈을 등록하는 방법은 두가지가 있는데 하나는 1. 컴포넌트 스캔과 자동 의존관계 설정하는 것이고, @Component 어노테이션을 사용하는 것입니다. 이는 @Controller, @Service, @Repository는 모두 @Component를 포함하고 있습니다. 2. 자바 코드로 직접 스프링 빈 등록하는 것이고, 설정 클래스를 따로 만들어 @Configuration 어노테이션을 붙이고, 해당 클래스 안에서 빈으로 등록할 메소드를 만들어 @Bean 어노테이션을 붙여주면 자동으로 해당 타입의 빈 객체가 생성됩니다.

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

먼저 스프링 Bean의 LifeCycle은 스프링 IoC 컨테이너 생성하고, 스프링 빈 생성, 의존관계 주입합니다. 초기화 콜백 메소드 호출하여 사용하고 소멸전에 콜백 메소드를 호출하며 종료합니다.
3가지 방법으로 빈 생명주기 콜백을 관리합니다. 먼저, 1.인터페이스, 2.설정정보에 초기화 메소드, 종료 메소드 지정, 3.@PostConstruct, @PreDestroy 어노테이션 지원

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

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

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

클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술 입니다. 스프링 mvc에서 컨트롤러로 이용되며, 사용자의 요청을 받아 처리한 후에 결과를 반환합니다.

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

1.사용자가 url을 입력하면 http Request가 서블릿 컨테이너로 전송됩니다.
2.요청 받은 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성합니다.
3.web.xml을 기반으로 사용자가 요청한 url이 어느 서블릿에 대한 요청인지 찾습니다.
4.해당 서블릿에서 service메소드를 호출한 후 get,post여부에 따라 doGet() 또는 doPost()를 호출합니다.
5.응답이 끝나면 HttpServletRequest, HttpServletResponse 객체를 소멸시킵니다.

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

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

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

스케일 업을 통해 하드웨어 스펙을 향상거나 스케일 아웃을 통해 서버를 여러대 추가해 시스템을 증가합니다.

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

스프링에서 bean 생성시 별다른 설정이 없으면 default로 싱글톤이 적용됩니다.
스프링은 컨테이너를 통해 직접 싱글톤 객체를 생성하고 관리하는데, 요청이 들어올 때마다 매번 객체를 생성하지 않고, 이미 만들어진 객체를 공유하기 때문에 효율적인 사용이 가능합니다.
이를 통해 static 메소드나 private 생성자 등을 사용하지 않아 객체지향적 개발을 할 수 있으며,테스트하기 편리하다.

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

프로토타입 빈은 싱글톤(default bean) 빈과는 달리 컨테이너에게 빈을 요청할 때마다 매번 새로운 객체를 생성하여 반환해줍니다.

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

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

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

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

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

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

💡@Transactional에 readOnly 속성을 사용하는 이유에 대해서 설명해주세요.

트랜잭션 안에서 수정/삭제 작업이 아닌 ReadOnly 목적인 경우에 주로 사용하며, 영속성 컨텍스트에서 엔티티를 관리 할 필요가 없기 때문에 readOnly를 추가하는 것으로 메모리 성능을 높일 수 있고, 데이터 변경 불가능 로직임을 코드로 표시할 수 있어 가독성이 높아진다는 장점이 있습니다.

💡⭐JPA N + 1 문제와 발생하는 이유 그리고 해결하는 방법을 설명해주세요.

N+1이란 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것을 의미합니다.
해결 방법에는 여러 방법이 있지만 가장 많이 사용되는 방법은 Fetch Join을 사용해 해결하는 방법입니다.
N+1 문제가 발생하는 이유는 연관관계를 가진 엔티티를 조회할 때 한 쪽 테이블만 조회하고 연결된 다른 테이블은 따로 조회하기 때문인데, Fetch Join을 사용하면 미리 두 테이블을 Join하여 한 번에 모든 데이터를 가져오기 때문에 N+1문제를 애초에 막을 수 있습니다.

💡JPA와 같은 ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는게 좋을까요?

일단 JPA 자체는 정적인 상황에서 사용하는걸 권장하기 때문에 복잡한 쿼리와 동적인 쿼리에 대한 문제가 발생하게 되는데, 그럴때는 JPQL과 Querydsl을 사용할 것을 권장하고 있습니다.

💡Spring에서 CORS 에러를 해결하기 위한 방법을 설명해주세요.

Servlet Filter를 사용하여 커스텀한 CORS 설정을 합니다.
WebMvcConfiguer를 구현한 Configuration 클래스를 만들어서 addCorsMappings()를 재정의합니다.
Spring Security에서 CorsConfigurationSource를 Bean으로 등록하고 config에 추가합니다.
profile
일단 해보자 뭐든 되겠지 😄

0개의 댓글