개인 공부/TIL

[ TIL - CS ] 면접을 위한 CS 공부 11편 - 스프링 -

킴도비 2024. 11. 29. 10:01

🚌 2024년 11월 25일~ 2024년 12월 1일까지의 주제는 스프링이다.

 

💡 공통으로 준비한 질문

1️⃣ 첫번째 접은 글은 내 말로 풀어쓴 정답
2️⃣ 두번째 접은 글은 해석 또는 공부한 내용 또는 추가적으로 궁금한 내용

 

1. IoC(Inversion of Control, 제어의 역전)이 무엇인지 설명해주세요.

더보기
  • IOC란?
    • 객체의 생성부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 의미합니다. 또는 제어 권한을 자신이 아닌 다른 대상에게 위임하는 것입니다.
    • 대부분의 프레임워크에서 사용하는 방법으로, 개발자는 필요한 부분을 개발해서 끼워 넣기의 형태로 개발하고 실행합니다.
    • 이렇게 조립된 코드의 최종 호출은 개발자에 의해서 제어되는 것이 아니라 프레임워크 내부에서 결정된 대로 이뤄지게 됩니다.
  • Spring에서의 IOC
    • Spring 프레임워크에서 지원하는 IOC Container는 우리들이 흔히 개발하고 사용해왔던 일반 POJO의 생명 주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공합니다.
  • 라이브러리와 프레임워크의 차이
    • IOC의 개념이 적용되었나의 차이이며, 라이브러리는 애플리케이션 코드가 흐름을 직접 제어하지만, 프레임워크는 애플리케이션 코드가 프레임워크에 의해 사용됩니다.

 

 

2. DI(Dependency Injection, 의존관계 주입)가 무엇인지 설명해주세요.

더보기
  • DI(Dependency Injection)란?
    • Spring 프레임워크에서 지원하는 IOC의 형태이다.
    • 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동적으로 연결해주는 것을 말한다. 개발자들은 제어를 담당할 필요없이 빈 설정 파일에 의존관계가 필요하다는 정보만 추가해주면 된다.
      • 컨테이너가 실행 흐름의 주체가 되어 애플리케이션 코드에 의존관계를 주입해주는 것
  • 의존성
    • 현재 객체가 다른 객체와 상호작용(참조)하고 있다면 다른 객체들을 현재 객체의 의존이라 한다. 
  • 의존성이 위험한 이유
    • 하나의 모듈이 바뀌면 의존한 다른 모듈까지 변경되어야 한다.
    • 테스트 가능한 어플을 만들 때 의존성이 있으면 유닛 테스트 작성이 어렵다.
    • 유닛테스트의 목적 자체가 다른 모듈로부터 독립적으로 테스트하는 것을 요구한다.
  • 특징
    • 'new'를 사용해 모듈 내에서 다른 모듈을 초기화하지 않으려면 객체 생성은 다른 곳에서 하고, 생성된 객체를 참조하면 된다.
    • 의존성 주입은 Inversion of Control 개념을 바탕으로 한다. 클래스가 외부로부터 의존성을 가져야 한다.
  • 필요한 이유
    • 클래스를 재사용할 가능성을 높이고, 다른 클래스와 독립적으로 클래스를 테스트를 할 수 있다.
    • 비즈니스 로직의 특정 구현이 아닌 클래스를 생성하는데 매우 효과적
  • 세 가지 방법
    • Contructor Injection : 생성자 삽입
    • Method(Setter) Injection : 메소드 매개 변수 삽입
    • Field Injection : 멤버 변수 삽입

 

3. Bean 객체와 Bean 생명주기에 대해 설명해주세요.

더보기
  • Bean이란?
  • Bean 생명 주기
  • Bean 초기화 방법 3가지
    • 빈 초기화 메소드에 @PostConstruct 사용
      • 빈 정의 xml에 <context:annotation-config></context:annotation-config> 추가
    • InitializingBean 인터페이스의 afterPropertiesSet() 메소드 오버라이드
    • 커스텀 init() 메소드 정의
    • 빈 정의 xml에 init-method 속성으로 메소드 이름 지정
    • 또는 빈 초기화 메소드에 @Bean(init-method="init") 지정
  • Bean 소멸 방법 3가지
    • 빈 소멸 메소드에 @PreDestroy 사용
      • 빈 정의 xml에 <context:annotation-config></context:annotation-config> 추가
    • DisposableBean 인터페이스의 destroy() 메소드 오버라이드
    • 커스텀 destroy() 메소드 정의
      • 빈 정의 xml에 destroy-method 속성으로 메소드 이름 지정
  • 권장하는 방법
    • 1번 방법 (권장)
      • 사용 방법이 간결하며 코드에서 초기화 메소드가 존재함을 쉽게 파악 가능하여 xml 설정 방법보다 직관적
    • 2번 방법 (지양)
      • 빈 코드에 스프링 인터페이스가 노출되어 권장하지 않으며 간결하지 않은 방법
    • 3번 방법
      • 빈 코드에 스프링 인터페이스는 노출되지 않지만, 코드만으로 초기화 메소드 호출 여부를 알 수 없는 단점
  • Bean Scope
    • singleton (default)
      • 애플리케이션에서 Bean 등록 시 singleton scope로 등록
      • Spring IoC 컨테이너 당 한 개의 인스턴스만 생성
      • 컨테이너가 Bean 가져다 주입할 때 항상 같은 객체 사용
      • 메모리나 성능 최적화에 유리
    • prototype
      • 컨테이너에서 Bean 가져다 쓸 때 항상 다른 인스턴스 사용
      • 모든 요청에서 새로운 객체 생성
      • gc에 의해 Bean 제거
    • request
      • Bean 등록 시 하나의 HTTP request 생명주기 안에 단 하나의 Bean만 존재
      • 각각의 HTTP 요청은 고유 Bean 객체 보유
      • Spring MVC Web Application에서 사용
    • session
      • 하나의 HTTP Session 생명주기 안에 단 하나의 Bean만 존재
      • Spring MVC Web Application에서 사용
    • global session
      • 하나의 global HTTP Session 생명주기 안에 한 개의 Bean 지정
      • Spring MVC Web Application에서 사용
    • application
      • ServletContext 생명주기 안에 한 개의 Bean 지정
      • Spring MVC Web Application에서 사용

 

4. AOP에 대해 설명해주세요.

더보기
  • AOP(Aspect Oriented Programming)이란?
    • 관점 지향 프로그래밍이란 뜻이며, 어떤 로직을 기준으로 핵심 관점과 부가 관점을 나누고, 관점을 기준으로 모듈화하는 것이다.
    • 핵심 관점은 주로 핵심 비즈니스 로직이며, 부가 관점은 핵심 로직을 실행하기 위한 데이터베이스 연결, 로깅, 파일 입출력 등을 뜻한다.
  • 목적은?
    • 소스코드에서 여러 번 반복해서 쓰는 코드(Concer, 흩어진 관심사)를 Aspect로 모듈화하여 핵심 로직에서 분리 및 재사용한다.
    • 개발자가 핵심 로직에 집중할 수 있게 하기 위함이다.
    • 주로 부가 기능을 모듈화한다.
  • AOP 주요 용어
    • Aspect
      • 흩어진 관심사를 모듈화 한 것
      • Advice + PointCut
    • Target
      • Aspect를 적용하는 곳(클래스, 메소드 등)
    • Advice
      • 실질적으로 수행해야 하는 기능을 담은 구현체
    • JoinPoint
      • Advice가 적용될 위치
      • 끼어들 수 있는 지점
      • ex. 메소드 진입 시, 생성자 호출 시, 필드에서 값 꺼낼 때 등
    • PointCut
      • JoinPoint의 상세 스펙 정의
      • 더욱 구체적으로 Advice가 실행될 지점 지정
    • Weaving
      • PointCut에 의해 결정된 Target의 JoinPoint에 Advice를 삽입하는 과정
  • AOP 적용 방법
    • 컴파일 시 적용
      • AspectJ가 사용하는 방법
      • 자바 파일을 클래스 파일로 만들 때 Advice 소스가 추가되어 조작된 바이트 코드 생성하는 방법
    • 로드 시 적용
      • AspectJ가 사용하는 방법
      • 컴파일 후 컴파일 된 클래스를 로딩하는 시점에 Advice 소스를 끼워넣는 방법
    • 런타임 시 적용
      • Spring AOP가 사용하는 방법
      • 스프링은 런타임 시 Bean 생성
      • A라는 Bean 만들 때 A라는 타입의 프록시 Bean도 생성하고, 프록시 Bean이 A의 메소드 호출 직전에 Advice 소스를 호출한 후 A의 메소드 호출Spring 
  • Spring AOP 특징
    • 프록시 패턴 기반의 AOP 구현체
      • Target 객체에 대한 프록시를 만들어 제공
      • Target을 감싸는 프록시는 런타임 시 생성
      • 접근 제어 및 부가 기능 추가를 위해 프록시 객체 사용
    • 프록시가 Target 객체의 호출을 가로채 Advice 수행 전/후 핵심 로직 호출
    • 스프링 Bean에만 AOP 적용 가능
      • 메소드 조인 포인트만 지원하여 메소드가 호출되는 런타임 시점에만 Advice 적용 가능
    • 모든 AOP기능을 제공하지는 않으며 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션의 각종 문제(중복 코드, 프록시 클래스 작성의 번거로움, 객체 간 관계 복잡도 증가)에 대한 해결책 지원 목적

 

❔ 개인으로 준비한 질문

1. Container에 대해 설명해 주세요.

 

 

2. Spring, Spring MVC, Spring Boot이 차이에 대해 설명해 주세요.

 

 

3. POJO에 대해 설명해 주세요.

 

 

4. DAO와 DTO의 차이에 대해서 설명해 주세요.