Spring 면접 준비

양동혁·2021년 4월 20일
1

이건 알아야지!

목록 보기
1/2
post-thumbnail

Spring 핵심 3대 요소

DI(Dependency Injection)

객체간의 의존성을 자신이 아닌 외부에서 주입하는 개념으로 DI를 사용하면 모듈간의 결합도가 낮아지고 의존성이 높아진다.

의존성 주입 방법

  • 생성자 주입
    생성자를 통해 의존관계를 주입 받는다.
    생성자 호출 시점에 딱 1번만 주입되는것을 보장하며 불변, 필수 의존관계에 사용한다.

  • 수정자 주입
    setter를 통해 의존관계를 주입하며 선택, 변경 가능성이 있는 의존관계에 사용한다.

  • 필드 주입
    필드에 직접 주입하는 방식으로 외부에서 의존관계 변경이 불가능해 테스트하기 힘들고 DI프레임워크를 사용해야 쓸 수 있는 주입 방법이다.

생성자 주입을 사용하는 이유

  • 대부분의 의존관계는 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다.

  • 생성자 주입은 객체를 생성할 때 한번만 수행되므로 의존관계를 불변하계 설계할 수 있다.

  • 수정자 주입을 사용하면 setter를 public로 열어 두어야 하는데 변경되면 안되는 필드의 setter를 열어 두는것은 좋은 설계 방법이 아니다.

IoC(Inversion of Control)

제어의 흐름을 구현 객체가 관리하는것이 아니라 프레임워크가 관리 하는것으로 객체의 생성, 의존성 관리를 IoC Container가 수행한다.
Spring에서는 ApplicationContext(스프링 컨테이너)를 이용하여 설정 정보를 생성, 등록하고 의존관계를 주입한다.

스프링 컨테이너

빈 메타정보를 이용해 빈 생성 및 의존성관리를 하고 생성된 빈을 제공한다.

AOP(Aspect Oriented Programming)

AOP는 흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법으로 Aspect란 여러 곳에서 쓰이는 코드를 모듈화 한것을 말한다.

AOP 적용 시점 3가지

  • 컴파일 시점(AspectJ)

  • 클래스 로딩 시점 (AspectJ)

  • 런타임 시점 (Spring AOP)

Spring AOP

프록시 기반의 AOP로 Spring Bean 에만 적용 가능하다.

프록시 패턴

기존코드의 변경없이 접근 제어 또는 부가 기능을 추가.

Spring Bean

Spring DI 컨테이너가 관리하는 객체를 Spring Bean이라고 한다. 즉, ApplicationContext가 만들어서 내부에 갖고 있는 객체를 의미한다.

Bean 등록 방법

  • Component Scan
    @ComponentScan과 @Component를 사용해서 빈을 등록하는 방법이다.
    @SpringBootApplication이 @ComponentScan을 포함하기 때문에 해당 클래스가 있는 패키지에서부터 모든 하위 패키지의 클래스 중 @Component가 붙은 클래스를 빈으로 등록한다.

  • 빈 설정 파일에 직접 등록
    빈 설정 파일은 자바설정파일과 xml로 작성할 수 있다.
    자바설정파일은 @Configuration을 붙이며 @Bean을 이용해 직접 빈을 정의 할 수 있다. @Bean이 붙은 메서드의 리턴 값에 해당하는 객체가 빈으로 등록된다.
    @Configuration이 @Component를 포함하기 때문에 빈 설정 파일이 읽힐 때 그 안에 정의된 빈들이 등록된다.

Bean 생성 과정

객체 생성 ➜ 의존관계 설정 ➜ 초기화 ➜ 사용 ➜ 소멸

위와 같은 생명 주기를 가지며 스프링 컨테이너에 의해 생명주기가 관리된다.
@PostConstruct와 @PreDestory를 사용하여 빈 초기화 함수와 소멸 전 콜백함수를 지정할 수 있다.
이 두개의 어노테이션은 외부라이브러리에는 적용 할 수 없기 때문에 외부라이브러리를 초기화, 종료해야하는 경우에는 @Bean의 'initMethod'와 'destroyMethod'를 사용해야 한다.

싱글톤 패턴

애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당 받고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 클래스의 인스턴스가 한개만 생성되는것을 보장한다. (객체를 미리 생성해두고 다음 사용시에는 생성된 객체를 사용)

장점

  • 메모리 영역을 할당받아 하나의 인스턴스만 사용하기 때문에 메모리 낭비를 방지할 수 있다.

  • 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.

단점

  • 의존관계상 클라이언트가 구체 클래스에 의존한다. ➜ DIP위반

  • 클라이언트가 구체클래스에 의존하기 때문에 OCP원칙을 위반할 가능성이 높다

  • 내부 속성을 변경하기 어렵다.

DIP(Dependency Inversion Principle)
: 의존관계를 맺을 때 변화하기 쉬운 것보다 변화하기 어려운 것에 의존하라.

의존관계 설정 시 구체클래스 보다는 인터페이스나 추상 클래스와 의존관계를 맺도록 설계해야 하며 DIP를 만족하는 설계는 변화에 유연한 시스템이 된다.

OCP(Open-Closed Principle)
: 소프트웨너 요소는 확장에는 열려 있으나, 변경에는 닫혀 있어야 한다.

기능의 확장을 하더라도 기존 코드의 변경이 있으면 안된다. OCP를 지키려면 객체를 생성하고 연관관계를 맺어주는 별도의 조립, 설정자가 필요하다.

Bean Scope

빈 스코프란 빈이 존재할 수 있는 범위를 말하며 singleton, prototype, request, session, application이 있다.

  • singleton
    기본 스코프로 스프링 컨테이너의 시작과 종료까지 하나의 인스턴스만 유지되며 가장 넓은 범위의 스코프다.

  • prototype
    스프링 컨테이너가 빈의 생성과 의존관계 주입, 초기화까지만 관여하고 더 이상 관리하지 않는 매우 짧은 범위의 스코프이다.
    빈을 요청할 때 마다 새로운 빈을 반환하며, 그 이후 빈의 관리 책임은 요청한 클라이언트에게 있다.

  • request
    웹 요청이 들어오고 나갈 때 까지 유지되는 스코프로 각각의 HTTP요청마다 별도의 빈이 생성되고 관리된다.

  • session
    웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다.

  • application
    웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프이다.

세션

클라이언트와 웹서버 간에 네트워크 연결이 지속, 유지되고 있는 상태를 말하며 클라이언트가 브라우저를 통해 서버에 접석한 뒤 접속을 종료할 때 까지 유지된다.

vs. 쿠키
쿠키는 클라이언트의 정보를 클라이언트의 메모리에 저장히자만 세션은 고유한 sessionId 파일을 생성하여 서버에 저장한다.

쿠키

서버가 HTTP요청을 수신할 때, 서버는 응답과 함께 Set-Cookie헤더를 설정하여 쿠키를 전송한다.
전송된 쿠키는 브라우저의 쿠키 저상소에 저장되며, 이후 클라이언틔 요청은 HTTP헤더의 Cookie에 해당 쿠기가 포함되어 전송된다.
쿠키에는 sessionId, 만료일, 유효기간, 도메인, 경로 등의 정보가 저장된다.

Autowire

의존관계 설정시 DI 컨테이너에 있는 빈을 자동으로 주입해준다.

과정

DI컨테이너에 타입매칭을 시도하고 매칭되는 빈을 주입한다.
이때, 매칭되는 빈이 여러개라면 필드 이름, 파라미터 이름으로 추가 매칭한다.

매칭되는 빈이 여러개 일때 다른 조회 방법

  • @Qualifier
    빈 등록시에 추가적으로 구분자를 부여하며, 주입시에 해당 구분자를 명시한다.

  • @Primary
    @Primary가 붙은 빈이 우선권을 가진다.

profile
BackEnd Developer, Business Driven Development

0개의 댓글