Spring 면접

yshjft·2022년 9월 4일
0

Spring, JPA

목록 보기
3/16

빈 생성 주기

스프링 컨테이너 생성 → 객체 생성 → 의존 관계 주입 → 초기화 콜백(@Postconstruct) → 사용 → 소멸전 콜백(@PreDestroy) → 소멸 및 스프링 종료

빈 스코프

빈 스코프란 컨테이너에서 빈이 존재할 수 있는 범위를 의미한다.

  • 싱글톤(singleton)
    • 스프링 IoC 컨테이너 내에 단 하나의 객체만 존재한다.
    • 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프(앱이 종료될 때까지 있는다.)
    • @Scope(“singleton”)
  • 프로토타입(prototype)
    • 모든 요청에 새로운 객체를 생성한다.
    • 스프링 컨테이너는 빈의 생성과 초기화까지만 관여하는 가장 짧은 범위의 스코프(PreDestroy 실행 안됨 )
    • @Scope(“prototype”)

웹 스코프
웹 스코프는 프로토타입 스코프와 마찬가지로, 여러 명의 클라이언트 요청에 대해서 개별적인 빈을 반환하게 된다. 하지만 HTTP 요청이 나갈 때까지 유지되므로, 종료 메서드도 실행된다는 점이 프로토타입 스코프와 다르다.(웹 환경에서만 작동한다.)

  • 리퀘스트(request)
    • 웹 요청이 들어오고 나갈 때까지 유지되는 스코프
  • 세션(session)
    • 웹 세션이 생성되고 종료될 때까지 유지되는 스코프
  • 어플리케이션(application)
    • 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프
  • 웹소켓(websocket)
    • 웹소켓과 동일 생명주기를 가지는 스코프

DI 종류

  • 생성자 주입
    • 생성자를 이용한 의존성 주입 방법
    • 1번만 호출되기 때문에 필수 불편한 경우 사용
    • 가장 추천 되는 방법
      • 순환 참조 방지
      • 불변하게 설계 가능
      • 뜻하지 않게 의존성을 빠뜨리는 일을 방지할 수 있다.
  • setter 주입
    • setter를 이용한 의존성 주입 방법
    • 선택적 가변적인 경우 사용
  • 필드 주입
    • @Autowired 사용하여 의존성 주입
      • 컨테이너에서 타입(인터페이스 또는 오브젝트)을 이용해 대상 객체를 검색하고 할당할 수 있는 빈 객체를 찾아 주입
    • 프레임워크 의존적인 코드가 된다
    • 참고하면 좋을듯 : https://www.inflearn.com/questions/340767

Front-contoller(Dispatcher Servlet)의 장점

  • 모든 요청을 하나의 controller에서 처리하므로 작업을 한곳에서 수행 가능
    • 트랙킹 또는 보안 적용시 훨씬 편함(효율성 증가)

POJO

  • 평범한 구식 자바 객체(Plain Old Java Object)
  • 프레임워크 인터페이스나 클래스를 구현하거나 확장하지 않은 단순한 클래스
  • Java에서 제공하는 인터페이스 외에 종속되지 않는 객체(특정 환경에 종속되지 않는다)
    • 코드가 간결
    • 테스트 자동화에 유리하다.

스프링 애플리케이션은 POJO를 이용해서 만든 애플리케이션 코드라, POJO가 어떻게 관계를 맺고 동작하는지를 정의해놓은 설계 정보로 구분된다. 스프링의 주요기술인 IoC/DI, AOP, PSA는 애플리케이션을 POJO로 개발할 수 있게 해주는 가능 기술이다. DI는 유연하게 확장가능한 오브젝트를 만들어두고 그 관계는 외부에서 다이내믹하게 설정해준다. 이런 DI의 개념을 스프링은 애플리케이션 전반에 걸쳐 적용한다. 

Spring은 왜 만들어졌나?

다형성 만으로 OCP, DIP를 지킬 수 없었고 이를 위해 등장한 것이 Spring이다.

ex) OCP 위반

MemberService : 클라이언트 코드

MemberRepository m = new MemoryMemberRepository(); // 기존 코드
MemberRepository m = new JdbcMemberRepository(); // 변경 코드

구현객체를 변경하려면 클라이언트 코드를 변경해야 한다.

ex) DIP 위반

MemberService : 클라이언트 코드

MemberRepository m = new MemoryMemberRepository(); // MemberService가 구현 클래스를 직접 선택

Spring이 등장하기전 하나의 기능을 구현하기 위해 클래스 간 상속, 인터페이스 구현 등 클래스 간의 의존도가 커지는 상황이 왔고 이를 해결하고자 “간단한 자바 오브젝트로 돌아가자”라는 말을 시작으로 두 가지 오픈소스(J2EE design and development의 예제 코드, 하이버네이트 ORM 프레임워크)가 등장하면서 스프링이 시작되었다.

Spring 프레임워크란?

자바 엔터프라이즈 개발을 위한 오픈소스 어플리케이션 프레임워크

  • 프레임워크란?
    • 개발할 때 설계 기본이 되는 구조나 환경으로 상호 협력하는 클래스와 인터페이스의 집합이다.
  • 프레임워크와 라이브러리 차이
    • 프레임워크 : 전체적인 흐름을 프레임워크가 가지고 있다. 프로그래머는 프레임워크 안에서 필요한 코드 작성한다.
    • 라이브러리 : 전체적인 흐름을 프로그래머가 가지고 있다. 자신이 원하는 기능을 구현하고 싶을 때마다 가져다 사용할 수 있다.

Spring 특징

  • IOC/DI
  • AOP
  • PSA(Portable Service Abstraction)
    • Service Abstraction : 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것이 서비스 추상화
    • 다수의 기술을 공통의 인터페이스로 제어할 수 있게하는 것(하나의 추상화로 여러 서비스들을 묶어 놓은것)

싱글톤 패턴의 문제점

  • DIP 위반 → OCP 위반

SOLID 원칙의 대부분은 인터페이스 설계와 관련이 되어있다. 의존성을 concrete class(구현 클래스)가 아닌 Interface에 두면, 실제 concrete class의 구현이 변경되어도 이를 사용한 코드는 큰 영향을 받지 않는다. 그렇기 때문에 SOLID원칙(OCP, LSP, ISP, DIP등)을 지키기 위해서는 인터페이스로 설계를 해야한다. 하지만 싱글톤을 이용하는 경우 대부분 인터페이스가 아닌 콘크리트 클래스의 객체를 미리 생성해놓고 정적 메소드를 이용하여 사용하게 된다. 이는 여러 SOLID원칙을 위반할 수 있는 가능성을 열어둠과 동시에, 싱글톤을 사용하는 곳과 싱글톤 클래스 사이에 의존성이 생기게 된다. 클래스 사이에 강한 의존성, 즉 높은 결합이 생기게 되면 수정, 단위테스트의 어려움 등 다양한 문제가 발생한다.
참고

  • 문제 해결

    • ApplicationContext = IoC Container + Singleton Registry

    • 스프링 컨테이너는 기본적으로 객체 인스턴스를 싱글톤으로 관리하는 싱글톤 컨테이너 역할을 한다.

    • 싱글톤 객체를 생성 및 관리하는 기능을 싱글톤 레지스트리(singleton registry)라고 한다.

      • 스프링은 싱글톤 레지스트리를 이용하여 싱글톤 패턴의 단점을 해결하며 객체를 싱글톤으로 유지할 수 있다.

        • 스프링 레지스트리는 CGLIB(Code Generator Library, 바이트 코드 조작 라이브러리)을 이용하여 싱글톤을 보장한다.

          • 스프링 프레임워크는 @Configuration 어노테이션이 달린 클래스에 속한 @Bean들을 스프링 컨테이너에 등록할 때 해당 클래스의 빈들에게 싱글톤 패턴을 적용하기 위해 임의의 다른 클래스를 만들어서 스프링 빈으로 등록한다.

          • @Bean이 붙은 메서드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고, 스프링 빈이 없으면 생성해서 스프링 빈으로 등록하고 반환하는 코드가 동적으로 만들어진다.

        • private, static, DIP 위반, OCP 위반을 일으키는 싱글톤 구현 코드 없이 싱글톤을 사용할 수 있다.

        • @Configuration을 적용해야만 CGLIB 기술이 적용된다.

  • 싱글톤 패턴 주의 사항
    • 무상태(stateless)로 설계
    • (스프링 환경의 경우)필드 대시 ThreadLocal을 사용할 것을 권장

Spring, Spring MVC, Spring Boot

  • Spring

    • 자바 엔터프라이즈 개발을 위한 오픈 소스 프레임워크
  • Spring MVC

    • 웹 어플리케이션 개발에 있어 MVC 패턴을 적용할 수 있도록 Spring에서 제공하는 프레임워크
  • Spring Boot

    • Spring 설정들을 자동화하는 Spring 기반의 프레임워크
  • Spring MVC와 Spring Boot 차이

    • 설정의 자동화
      • Spring MVC : 수동 설정
      • Spring Boot : 자동 설정
    • WAS 내장 여부
      • Spring MVC : WAS 설치 필요
      • Spring Boot : WAS 내장

MVC 패턴이란

  • Model
    • 데이터를 저장하는 컴포넌트
    • 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
    • 다른 구성 요소에 대해서 알지 말아야 한다.
    • 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야만 한다.
  • View
    • 사용자 인터페이스 컴포넌트
    • 모델이 가지고 있는 정보를 따로 저장해서는 안된다
    • 다른 구성 요소에 대해서 알지 말아야 한다.
    • 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야만 한다.
  • Controller
    • 사용자의 요청을 처리하고 Model과 View를 중계하는 컴포넌트
    • 모델이나 뷰에 대해서 알고 있어야 한다.
    • 모델이나 뷰의 변경을 모니터링 해야 한다.
  • 장점
    • 각각의 컴포넌트의 역할에 집중하여 효율적인 처리가 가능
    • 유지 보수성, 확장성, 유연성 증가

리플렉션이란

구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드나 변수에 접근할 수 있게 하는 자바 API. 작성 시점에는 어떤 클래스를 사용할 지 모르는 상태인데 런타임 시점에 클래스를 가져와 실행해야 할 때 사용된다. 

layered architecture

참고할 것

profile
꾸준히 나아가자 🐢

0개의 댓글