본문 바로가기
면접

Spring 질문

by L3m0n S0ju 2023. 5. 17.

스프링 프레임워크란?

스프링 프레임워크는 자바 기반의 오픈 소스 애플리케이션 프레임워크입니다. 

 

1. DI는 객체 간의 의존 관계를 설정하는 방식으로, 객체 생성 시에 직접적으로 의존하는 객체를 생성자나 setter 메서드를 통해 전달해주는 방식입니다. 이를 통해 의존성이 강한 객체와 약한 객체를 분리하고, 테스트 용이성과 코드 유연성을 높일 수 있습니다.

 

2. AOP는 애플리케이션 전반에서 공통적으로 사용되는 기능을 모듈화하는 기법으로, 여러 모듈에서 공통으로 사용하는 횡단관심사를 한 곳에서 관리하여 중복 코드를 줄이고 유지보수성을 높일 수 있습니다.

 

3. 스프링 MVC를 사용하면 Model-View-Controller 패턴을 따르는 웹 애플리케이션을 쉽게 구축할 수 있습니다.

 

4. 스프링은 다양한 데이터베이스 및 데이터 소스와의 통합을 지원하며, 테스트를 할 때도 인메모리 기능을 제공해줘서 실제 DB를 사용하는 것처럼 테스트를 할 수 있습니다.


5. 스프링은 트랜잭션 관리를 위한 추상화를 제공하며, 프로그래밍적 또는 선언적인 방식으로 트랜잭션을 다룰 수 있습니다.

 

 


mvc 패턴 사용이유?

MVC란 Model-View-Controller의 약자로 애플리케이션을 세 가지 역할로 구분한 개발 방법론입니다. 사용자가 Controller를 조작하면 Controller는 Model을 통해 데이터를 가져오고 그 데이터를 바탕으로 View를 통해 사용자들에게 시각적인 부분들을 표현합니다.

 

MVC 모델을 통해서 코드를 3가지 역할로 나누어 개발을 할 때 서로 영향을 끼치지 않으면서 코드 간에 종속성이 줄어들면서 생산성이 올라가고 유지보수도 더 원할하게 할 수 있습니다.

 

 

 


CORS 문제란?

CORS란 서로 다른 Origin간에 자원을 공유하는 것을 말하며 기본적으로 브라우저간에 차단되어있습니다.

Origin이란 출처를 말하며, Protocol + Host + Port 를 합친 것을 의미합니다.

CORS 에러는 서버에서 응답 헤더에 특정 헤더를 포함하는 방식으로 해결할 수 있습니다.

예를 들어 Access-Control-Allow-Origin을 통해 특정 브라우저가 리소스에 접근이 가능하도록 허용할 수 있습니다.

 

 

 

 


DI(의존성 주입)이란?


Spring Dependency Injection이란, 각 객체 간 의존관계를 스프링 컨테이너가 개발자가 정의한 Bean 등록 정보를 바탕으로 자동으로 주입해주는 기능입니다.

일반적인 다양한 기존 스프링 프로젝트를 보면, Controller에서 Service나 Repository 객체를 사용 시, new 키워드를 통해 컨트롤러에서 객체를 직접 생성하여 사용하지 않고 의존성 주입을 통해 스프링 컨테이너에 생성된 객체를 받아 사용하고 있는 것을 볼 수 있습니다. @Component, @Service, @Repository, @Controller 등의 어노테이션이 붙은 클래스들은 스프링 실행 시 스캔을 통해 개발자가 정의한 의존성 정보를 자동으로 bean 설정 정보에 등록을 하게 되어 의존성 주입이 동작하게 합니다.

 

예를 들어서 a, b, c 클래스에서 x 클래스를 사용할 때 3개의 다른 객체를 생성해야 하지만 스프링 의존성 주입을 사용하면 한 객체를 공유하면서 싱글톤 패턴을 이용할 수 있습니다.

이를 통해 객체간 결합도를 낮추고, 코드의 양을 줄여주고, 테스트를 용이하게 하여, 개발 및 유지보수를 더 쉽게 하게 하는 장점이 있습니다.

 

 

 

 

 


세션 및 쿠키 대신 Jwt 사용 이유?

 

결론부터 말하면 아래 표와 같다.

인증 방식 토큰 세션
보안성 - WIN
외부 노출시 - WIN
성능 - WIN
비용 WIN -
서버 부하(효율성) WIN -
확장성 WIN -

 

1. 보안성은 아무래도 Jwt는 아이디와 비밀번호를 암호화해서 클라이언트에 저장하고 세션은 서버에 중요한 정보를 서버에 저장하고 세션 ID만 클라이언트에 저장하기 때문에 세션이 더 뛰어나다.

 

2. 외부 노출 시 역시 세션은 ID만 노출되기 때문에 더 안전하다.

 

3. 성능은 세션 ID가 더 데이터가 작아서 조금 성능이 좋을 수 있으나 미미한 것 같다.

 

4. 비용은 당연히 JWT가 더 좋은게 서버에 세션 정보를 저장할 필요가 없으므로 서버 비용이 절감된다.

 

5. 서버 부하도 마찬가지다.

 

6. 확장성은 JWT가 더 뛰어난 이유는 상태가 필요없으므로 서버 간에 독립적으로 요청이 가능하고 서버 간에 세션 동기화나 공유가 필요하지 않기 때문에 확장성에서 훨씬 우수하다.

 

 

 

 

 


연관관계 주인이란?

연관관계 주인이란 외래키를 관리하는 엔티티를 말하는데 보통 외래키가 있는 곳을 주인으로 설정합니다. 연관관계의 주인이 필요한 이유는 테이블에서 외래키 값을 추가할 때 객체에서는 어떤 객체를 기준으로 값을 추가할 지 결정을 해야하기 때문에 연관관계 주인을 정해서 한 객체에서 외래키를 관리하도록 설정합니다.

 

예를 들어서 a랑 b객체가 있는데 a에 있는 b객체에 값을 넣고 b에 있는 a객체에는 값을 넣지 않는 경우 a랑 b의 정보가 다르기 때문에 어떤 것을 기준으로 외래키 값을 추가할 지 결정해야 합니다.

 

다대일 관계에서 다 쪽을 연관관계 주인으로 설정합니다. 만약 일 쪽을 연관관계 주인으로 설정하는 경우 일 객체를 생성할 때 다 쪽의 여러개 데이터를 한번에 주입해서 생성해야하는데 한번에 주입하지 않고 나눠서 주입하고 싶은 경우가 있기 때문에 굉장히 불편하고 확정성이 떨어집니다. 그래서 다대일 관계에서 다 쪽에 연관관계 주인을 설정합니다.

 

 

 

 


테이블 외래키와 객체 참조 차이?

 

객체 참조랑 테이블 외래키의 참조 방식이 다르기 때문에 한 쪽의 방식으로 맞춰야하는데 만약에 테이블 방식으로 맞춘다고 하면 객체에서는 다른 객체의 id 값이 저장이 되는데 id 값을 참조하는 기능은 객체에 없기 때문에 데이터베이스를 통해서 정보를 가져와서 사용해야 합니다. 이런 과정이 불편하기 때문에 객체의 방식에 맞춰서 연관관계를 설정합니다.

 

객체 방식에 맞춰서 연관관계를 설정하면 외래키 같은 경우에는 외래키 하나로 join 문을 통해서 양방향을 다룰 수 있는데 객체는 불가능하기 때문에 상대 객체에서도 현재 객체에 대해서 참조를 해서 테이블처럼 양방향으로 다룰 수 있습니다.

 

 

 

 

 


필터, 인터셉터, AOP는 각각 언제 사용하는 기능인가?

참고: https://goddaehee.tistory.com/154

 

Filter

요청과 응답에서 필터링 역할을 한다. 서블릿 필터는 DispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다.보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용된다.

 


Interceptor

요청에 대한 작업 전/후로 가로챈다고 보면 된다.필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다. 하지만 인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트 내부에서 Controller에 관한 요청과 응답에 대해 처리한다.스프링의 모든 빈 객체에 접근할 수 있다.인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 등의 업무처리에 사용된다.

 

preHandler() - 컨트롤러 메서드가 실행되기 전

postHanler() - 컨트롤러 메서드 실행직 후 view페이지 렌더링 되기 전

afterCompletion() - view페이지가 렌더링 되고 난 후



AOP

OOP를 보완하기 위해 나온 개념 객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 횡단 관심사를 한 곳에서 처리한다. 주로 '로깅', '트랜잭션', '에러 처리'등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용합니다. Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다. Interceptor와 Filter는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

 

AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이다. Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출한다. 반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.

 

AOP의 포인트컷

@Before: 대상 메서드의 수행 전

@After: 대상 메서드의 수행 후

@After-returning: 대상 메서드의 정상적인 수행 후

@After-throwing: 예외발생 후

@Around: 대상 메서드의 수행 전/후

 

 

 


IoC란?

 

사용자가 의존성 객체를 만드는 것이 아니라 스프링이 만들어 놓은 의존성 객체를 사용한다. 스프링은 사용자가 IoC 컨테이너에 등록한 Bean 객체들을 만들어주고 싱글톤 형태로 제공한다.

 

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

정규 표현식  (0) 2023.06.30
데이터베이스 질문  (0) 2023.05.17
DevOps 이것저것  (0) 2023.04.06
하는김에 프론트엔드 면접도...  (0) 2023.04.06
Java 질문  (0) 2023.03.28

댓글