[Spring] 백엔드 면접 질문 정리 - 4
스프링 프레임워크의 주요 특징은 무엇인가요?
스프링 프레임워크는 제어의 역전을 통한 의존성 주입이 가장 대표적인 특징입니다. 각 컴포넌트에서 필요한 의존성 주입을 프레임워크가 담당하여 처리해줍니다. 이것은 컴포넌트 스캔 방식을 통해 구현되어있습니다.
컴포넌트 스캔의 과정은 다음과 같습니다. 모든 컴포넌트 어노테이션을 스캔합니다. 이후 싱글톤 패턴으로 객체를 하나씩생성하고 컨테이너가 보관합니다. 이렇게 생성된 컴포넌트들은 각각 필요한 객체에 의존성으로 주입되거나 혹은 사용됩니다.
그리고 관점지향 프로그래밍이라는 개념을 통해 중복되는 코드와 로직, 혹은 비즈니스 로직과 상관없는 코드를 분리하기 용이하게 도와줍니다. 스프링 프레임워크는 POJO plain old java object로 이루어져 있으며 퓨어한 자바 문법으로 이루어 져있기 때문에 다른 라이브러리나 프레임워크에 종속되지 않고 이식이 쉽다는 장점이 있습니다.
스프링의 IoC(Inversion of Control)와 DI(Dependency Injection)에 대해 설명해주세요.
스프링은 컴포넌트 스캔을 통해 제어의 역전과 의존성 주입을 이뤄냅니다.
첫번째로 스프링을 실행시키면 컴포넌트 어노테이션을 모두 읽습니다. service와 repository, configuration 어노테이션도 모두 컴포넌트 어노테이션을 상속하기 때문에 동일하게 컴포넌트로 인식합니다.
그리고 스프링 빈을 생성합니다. 빈은 싱글톤 패턴으로 프레임워크에서 하나만 존재합니다.
이렇게 생성된 빈은 이제 di container를 통해 각각 객체가 필요로하는 의존성을 주입합니다. 이것이 바로 제어의 역전입니다. 의존성의 주입을 프로그래머가 아닌, 프레임워크가 관리하게 되는것입니다.
스프링 빈(Bean)이란 무엇이며, 스프링 컨테이너와 어떤 관계가 있나요?
스프링 빈(Bean)은 스프링 IoC 컨테이너가 생성하고 관리하는 자바 객체로, 기본적으로 싱글톤 패턴으로 애플리케이션 내에서 하나의 인스턴스만 존재합니다.
스프링 컨테이너는 이러한 빈의 생성, 설정, 의존성 주입, 생명주기 관리를 담당하며, 컴포넌트 스캔(@Component, @Service 등)이나 자바 설정 클래스(@Configuration, @Bean)를 통해 등록된 빈들을 찾아 인스턴스화하고 의존 관계를 설정합니다.
컨테이너는 BeanFactory와 이를 확장한 ApplicationContext 인터페이스로 구현되며, 빈 객체들 간의 협력 관계를 조율하여 IoC와 DI 원칙을 실현함으로써 느슨한 결합도와 높은 응집도를 가진 애플리케이션 구축을 가능하게 합니다.
@Component, @Service, @Repository, @Controller 어노테이션의 차이점은 무엇인가요?
큰 차이는 없습니다. 모두 컴포넌트 어노테이션을 상속받고있기 때문에 컴포넌트 스캔의 대상이됩니다.
명시적로 service repository controller를 지정해주는 용도로 사용됩니다.
스프링 MVC 구조에 대해 설명해주세요.
스프링 MVC는 Model-View-Controller 아키텍처 패턴을 구현한 웹 프레임워크로, 중앙에 DispatcherServlet이라는 프론트 컨트롤러가 모든 요청을 받아 처리합니다.
클라이언트 요청이 들어오면 DispatcherServlet은 HandlerMapping을 통해 적절한 컨트롤러를 찾고, 컨트롤러는 비즈니스 로직을 처리한 후 데이터(Model)와 뷰 이름을 반환합니다.
그 후 ViewResolver가 뷰 이름을 실제 View 객체로 변환하고, View는 Model 데이터를 사용해 최종 응답을 생성하여 클라이언트에게 반환합니다.
이러한 구조는 @Controller, @RequestMapping과 같은 어노테이션을 통해 쉽게 구현할 수 있으며, 관심사의 분리와 재사용성을 높여 유지보수가 용이한 웹 애플리케이션 개발을 가능하게 합니다.
스프링 부트(Spring Boot)의 장점은 무엇인가요?
스프링 부트는 자바 기반 애플리케이션 개발을 획기적으로 간소화한 프레임워크로, 다양한 장점을 제공합니다. 자동 구성(Auto Configuration) 기능을 통해 개발자가 복잡한 설정 작업에 시간을 낭비하지 않도록 하며, 내장 서버(Tomcat, Jetty 등)를 포함해 별도의 웹 서버 설치 없이 독립 실행형 애플리케이션 개발이 가능합니다. 또한 스타터 의존성(Starter Dependencies)을 통해 특정 기능 구현에 필요한 라이브러리들을 간편하게 추가할 수 있고, 프로덕션 환경에서의 모니터링과 관리를 위한 Actuator를 제공합니다. 이러한 특징들로 인해 개발 생산성이 크게 향상되며, 마이크로서비스 아키텍처와의 뛰어난 호환성을 바탕으로 현대적인 클라우드 네이티브 애플리케이션 개발에 이상적인 선택이 됩니다.
스프링의 AOP(Aspect-Oriented Programming)에 대해 설명해주세요.
관점 지향 프로그래밍의 약자로, 어플리케이션에서의 공통 분모를 분리하고 비즈니스 로직을 퓨어하게 만들도록 도와주는 스프링의 기능입니다. 가장 널리 알려진 예시로 로깅처리가 있습니다. 매번 불필요하게 로깅처리를 하지 않고, aop를 이용해 로깅처리를 전역적으로 관리하게 되면 비즈니스 로직과 로깅을 분리시키게 되고 응집도가 높아지는 결과를 만들 수 있습니다. aop는 프록시 패턴을 기반으로 구현합니다.
스프링 시큐리티(Spring Security)에 대해 간단히 설명해주세요.
스프링 시큐리티(Spring Security)는 스프링 기반 애플리케이션의 인증(Authentication)과 권한 부여(Authorization)를 담당하는 강력한 보안 프레임워크입니다. 주요 기능으로는 사용자 인증 처리, 권한 기반 접근 제어, CSRF(Cross-Site Request Forgery) 방어, 세션 관리, 암호화 등이 있습니다.
스프링 시큐리티는 서블릿 필터 체인을 기반으로 동작하며, 요청이 컨트롤러에 도달하기 전에 보안 검사를 수행합니다. 다양한 인증 방식(폼 로그인, OAuth, JWT 등)을 지원하고, 메서드 수준의 보안 적용도 가능해 세밀한 권한 제어가 가능합니다.
설정은 Java 기반 구성이나 XML을 통해 가능하며, 최소한의 설정만으로도 기본적인 보안 기능을 활성화할 수 있어 개발자 친화적입니다. 또한 커스터마이징이 용이해 다양한 보안 요구사항을 충족시킬 수 있습니다.