Spring 면접 질문 번역 (Spring Interview Question 번역 1탄)

effiRin·2022년 7월 1일
1

Translation

목록 보기
1/1
post-thumbnail

📌 출처 : https://www.interviewbit.com/spring-interview-questions/

위 사이트에 있는 interview Question과 답인데, 설명이 상당히 자세하고, 첨부된 그림이 좋아서 겸사겸사 번역했다. (물론 다 이해하지는 못했지만)
괜시리 오랜만에 영어 공부도 하고 싶었고...
이 글을 바탕으로 스프링을 더 자세히 공부해보는 걸로~


혹시 지나가다가 보이는 (이 글을 볼 사람이 있을지 모르겠지만) 오역이 있다면 지적해주시면 감사하겠습니다.

❗❗ 의역 남발 주의 ❗❗



[Spring Interview Questions]



0. Intro

  • 스프링 프레임워크는 자바 어플리케이션 개발을 더 빠르고, 쉽고, 안전하게 하기 위해 개발되었다.
  • 오픈 소스이며, 가볍고, build하기 쉬운 프레임워크이다.
  • 또한 의존성 주입(Dependency Injection), Spring MVC, Spring JDBC, Spring Hibernate, Spring AOP, EJB, JSF, 등과 같은 다양한 프레임워크를 수용하면서, 프레임워크들의 프레임워크로 여겨지기도 한다.
  • 스프링의 중요한 요소는 어플리케이션의 인프라 지원 기능이다.
  • 스프링은 엔터프라이즈 레벨 어플리케이션의 ‘plumbing’을 제공하는 데에 초점을 맞추고, 개발자들이 특수한 개발 환경에 의존하지 않고 온전히 어플리케이션 레벨 비즈니스 로직에 집중하도록 한다.
  • Spring에서 개발된 애플리케이션은 더 안정적이고 확장 가능하며 구축 및 유지 보수가 매우 간단하다.
  • 스프링은 개발자들이 어플리케이션의 비지니스 객체들을 관리하는 것을 돕는 수단으로써 개발되었다.
  • 방대한 기능과 유연성 때문에, 스프링은 엔터프라이즈 레벨의 자바 기반 어플리케이션을 개발할 때 가장 사랑받는 프레임워크가 되었다.


1. 스프링 프레임워크란?

  • 엔터프라이즈 레벨 어플리케이션을 개발할 때 복잡도를 줄이기 위한 자바 프레임워크다.
  • 스프링은 '프레임워크들의 프레임워크'로도 불리는데, 스프링은 다른 중요한 프레임 워크들을 지원하기 때문이다. JSF, Hibernate, Structs, EJB 등…

  • 다음과 같은 타입으로 일반화되는 약 20가지의 모듈들이 있다.

Core Container
Data Access/Integration
Web
AOP (Aspect Oriented Programming)
Instrumentation
Messaging
Test

⇒ 이처럼 Spring은 프로그래머가 애플리케이션 개발에 집중할 수 있도록 모든 인프라 관련 측면을 처리한다.



2. 스프링 프레임워크의 기능

  • Spring 프레임 워크는 J2EE 애플리케이션 개발을 위해 강력하고 응집력 있는 프레임워크를 제공하고, 필요한 설정 요소 선택을 위해 계층화된 아키텍처 패턴을 따른다.
  • Spring의 AOP(Aspect Oriented Programming - 관점 지향 프로그래밍)는 애플리케이션의 비즈니스 로직을 다른 시스템 서비스와 분리하여 통합 개발을 지원한다.
  • Spring은 다른 프레임워크로 쉽게 전환할 수 있는 MVC 웹 애플리케이션 프레임워크를 제공한다.
  • 환경 설정(the configurations) 생성 및 관리를 제공하고 애플리케이션 개체의 수명 주기를 정의한다.
  • Spring은 IoC(Inversion of Control)라는 특별한 디자인 원칙을 가지고 있다. 이는 의존적인 객체를 만드는 것 대신에 객체에 의존성을 주도록 지원한다.
  • Spring은 가볍고, 자바 기반의, 느슨하게 결합된 프레임워크이다.
  • Spring은 컨테이너가 없는 환경에서도 트랜잭션 관리를 위한 일반 추상화 계층을 제공한다.
  • Spring은 기술별 예외(JDBC, Hibernate 또는 기타 프레임워크에서 발생)를 일관되고 확인되지 않은 예외로 변환하는 편리한 API를 제공한다 이는 추상화를 도입하고 예외 처리를 크게 단순화한다.


3. Spring 설정 파일이란?

Spring 설정 파일(Spring configuration file)은 기본적으로 주로 클래스 정보를 포함하고, 해당 클래스가 어떻게 설정되고 서로 연결되는지 설명해주는 XML 파일이다. XML 설정 파일은 상세하고 깔끔하다는 특징이 있다.



4. IoC(Inversion of Control) 컨테이너란?

Spring Container는 Spring Framework의 핵심을 형성한다. Spring Container는 의존성 주입을 사용하여 객체를 생성하고, 그들의 전반적인 생명 주기를 설정하고 다루며, 어플리케이션 컴포넌트를 관리한다.

객체를 생성하고, 객체의 전체 수명 주기를 설정 및 관리하면서 개체를 연결하여 어플리케이션의 설정 요소를 관리한다. 작업을 수행하기 위한 Spring Container에 대한 지침은 XML 설정, Java Annotation(주석), 또는 자바 코드 중 하나로 제공될 수 있다.



5. 의존성 주입이란?

  • 의존성 주입의 핵심 개념은 객체를 만들 필요가 없다는 것이다. 그래서 (인터뷰에서 물어보면) 그저 어떻게 객체들이 생성되는지만 설명하면 된다.

  • 컴포넌트와 서비스를 우리가 코드에서 직접적으로 연결할 필요가 없다. 설정 파일(configuration file)에 있는 컴포넌트가 어떤 서비스에 필요한지 설명해주면 된다. 그러면 스프링의 IoC 컨테이너가 서비스와 컴포넌트를 함께 묶어줄 것이다.

자바에서 의존성 주입을 하는 2가지 방법

  1. 생성자 주입 : IoC 콘테이너는 여러 인수로 클래스 생성자(class constructor)를 생성하는데, 이 인수들은 각자 다른 클래스에 대한 종속성을 나타낸다.
  2. Setter 주입 : spring container는 bean을 인스턴스화하기 위해서 인수가 없는 정적 팩토리 메소드(static factory method) 또는 기본 생성자(default constructor)를 호출한 후 bean의 setter 메소드를 호출한다.


6. 생성자와 setter 주입의 차이를 설명해라

  • 세터 주입은 부분 주입이 허락되지만, 생성자는 부분주입이 허락되지 않는다.
  • 생성자 주입은 setter 속성이 오버라이드(override 재정의)가 안되고, setter 주입도 마찬가지다.
  • 생성자 주입은 수정이 완료되면 새로운 인스턴스를 생성한다. 그러나 setter 주입은 새로운 인스턴스의 생성이 불가능하다
  • bean이 속성을 많이 가진 경우, 생성자 주입이 선호된다. 만약 속성이 거의 없다면 setter 주입이 선호된다.


7.스프링 Bean은 무엇인가?

  • Bean은 사용자의 어플리케이션의 뼈대를 형성하는 객체이면서, Spring IoC 콘테이너가 관리하는 객체이다.
  • Spring bean은 IoC 컨테이너에 의해 인스턴스화되고, 설정되며, 연결되고, 관리된다.
  • Beans은 사용자가 (XML 또는 java 어노테이션 설정을 통해) 컨테이너에 공급하는 설정 메타데이터(configuration metadata)와 함께 생성된다.


8. 설정 메타데이터 (configuration meta data)는 스프링 컨테이너에 어떻게 제공되는가?

  • 3가지 방식이 있다.
  1. XML 기반의 설정 : bean 설정과 bean의 의존성(dependencies)은 XML 설정 파일에서 지정된다. 이는 아래와 같은 bean tag로 시작된다.
   <bean id="interviewBitBean" class="org.intervuewBit.firstSpring.InterviewBitBean">
    <property name="name" value="InterviewBit"></property>
   </bean>
  1. 어노테이션 기반의 설정 : XML 접근 방식 대신에, 관련 클래스, 메소드, 필드 선언에 어노테이션을 활용하여 컴포넌트 클래스 자체에 빈을 설정할 수 있다.

어노테이션 연결(wiring)은 기본적으로 스프링 컨테이너에서 활성화되지 않는다. 이는 아래에서 볼 수 있듯, 스프링 XML 설정 파일에서 활성화되어야 한다.

<beans>
<context:annotation-config/>
<!-- bean definitions go here -->
</beans>
  1. 자바 기반의 설정 : 스프링 프레임워크는 새로운 Java 설정 지원의 일부로써 핵심 기능을 도입했다. 이는 @Configuration 이란 어노테이션 클래스와 @Bean이란 메소드를 사용한다.

<참고>

@Bean 어노테이션은 요소(element)와 같은 역할을 한다.

@Configuration 클래스는 동일한 클래스에서 다른 @Bean 메소드를 호출함으로써 inter-bean dependencies(빈들 사이의 의존성)을 정의할 수 있다.



9. 스프링에서 사용할 수 있는 bean 범위는 무엇인가?

  • 스프링 프레임워크는 5가지의 범위를 지원한다.
  1. 싱글톤(Singleton) : 싱글톤을 사용하는 동안에는 bean 정의의 범위는 IoC 콘테이너 당 단일 인스턴스(a single instance)가 된다.
  2. 프로토타입(Prototype) : (프로토타입을 사용하는 동안에는 bean 정의 범위) 객체 인스턴스들의 수에 제한이 없다.
  3. 요청(Request) : bean 정의의 범위가 HTTP 요청인 경우
  4. Session : bean 정의의 범위가 HTTP-session인 경우
  5. Global-session : bean 정의의 범위가 Global HTTP session인 경우

<참고> 마지막 3,4,5번은 오직 사용자가 web-aware ApplicationContext containers를 사용할 경우에만 이용 가능하다.



10. Spring Bean Factory Container에서 Bean life cycle에 대해 설명해라.

  • Bean 수명 주기는 다음과 같다.

    • IoC 컨테이너는 XML 파일의 bean 정의를 통해 빈을 인스턴스화한다.
    • 그 다음 Spring은 빈 정의에서 지정된 대로 의존성 주입을 사용해 모든 속성을 덧붙인다.
    • Bean Factory 컨테이너는 Bean ID를 가져오는 setBeanName()BeanNameAware 메소드를 호출하고, 그에 상응하는 bean은 BeanNameAware 인터페이스로 구현할 것이다.
    • 그 다음 Bean Factory는 자체 인스턴스를 전달함으로써 setBeanFactory() 메소드를 호출한다. (BeanFactoryAware 인터페이스가 Bean에 구현되었을 시에)
    • 만약BeanPostProcessors가 bean과 연관되어 있으면 preProcessBeforeInitialization() 메소드가 작동된다.
    • 만약 init-method가 지정되면, 그 다음 이 메소드가 호출된다.
    • 마지막으로, 만약 생성 후 실행해야 하는 빈과 연관이 있는 BeanPostProcessor가 있다면 postProcessAfterInitialization() 메소드가 호출될 것이다.



11. Bean Wiring이란 무엇인가

  • Spring 컨테이너 내에서 Bean들이 함께 결합될 때, 이를 '연결된다(be wired)'라고 하거나, 이러한 현상을 'Bean wiring'이라고 한다.
  • Spring 컨테이너는 어떤 빈이 필요하고, 빈을 연결하는 동안 빈들이 서로 어떻게 의존하는지 알아야 한다. 이는 XML / annotation / Java 코드 기반 설정을 통해 제공된다.


12. autowiring이란 무엇이고, autowiring의 다른 방법 이름은 무엇이 있는가?

IoC 컨테이너는 애플리케이션 빈들 사이의 관계를 자동 연결한다. Spring은 BeanFactory의 내용을 검사하여, 자동으로 연결해야 하는 빈을 공동 작업자(collaborators)가 해결할 수 있도록 한다. 이 프로세스의 다른 방법은 다음과 같다.

  • no : autowiring이 없음을 의미하며 기본 설정이다. 명시적인 bean 참조(explict bean reference)가 wiring에 사용되어야 한다.
  • byName : Bean의 이름에 따라 Bean의 의존성을 주입한다. 이는 설정에 따라 동일한 이름으로 정의된 빈과 속성을 일치시키고 연결한다.
  • byType유형에 따라 빈 종속성을 주입한다.
  • constructor : 생성자는 해당 클래스의 생성자를 호출함으로써 bean 의존성을 주입한다. 이는 많은 수의 매개 변수(parameter)를 가진다.
  • autodetect : 먼저 컨테이너는 생성자에 의한 autowire를 사용하여 연결을 시도하고, 가능하지 않은 경우 byType으로 autowire를 시도한다.


13. autowiring의 한계는?

  • 재정의 가능성 : 의존성은 autowiring을 override한 <constructor-arg><property> 설정을 사용하여 지정된다.
  • 데이터 유형 제한 : 원시적 데이터 타입 (Primitive data type)문자열, 클래스는 자동 연결할 수 없다.
profile
모종삽에서 포크레인까지

0개의 댓글