본문 바로가기
Spring

Spring 면접 질문 모음

by gudwnsgur 2021. 11. 21.
728x90

[ EJB : Enterprise Java Bean ]

∘  Servlet, JSP, JDBC 등과 같은 JAVA SE 종류중 하나

∘  애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션

∘  JSP는 화면 처리, EJB는 업무 로직을 처리한다.

∘  단점 

    · 실행속도가 느리다 : 분산환경을 지원을 위해 객체를 직렬화 하는 과정이 필요

    · 단위 테스팅이 어렵다 : EJB 컨테이너에 종속적이기 때문에 컨테이너에 배포 후 테스트 가능

    · API가 복잡하다 : EJB 컨테이너에 종속적이라 이식성이 떨어진다.

 

스프링 프레임워크는 EJB가 지닌 단점들을 커버할 수 있도록 개발되어 많은 인기를 끌게 된다.

 

 


[ Spring이란 ]

∘  자바(JAVA) 플랫폼을 위한 오픈소스 애플리케이션 프레임워크이다.

∘  자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량 애플리케이션 프레임워크이다.

∘  자바 개발을 위한 프레임워크로 종속 개체를 생성해주고, 조립해주는 도구

 

ⅰ. 경량 컨테이너로서 자바 객체를 직접 관리

     ∘  각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.

ⅱ. 스프링은 POJO 방식의 프레임워크

     ∘  일반적인 J2EE 프레임워크에 비해 구현을 위해 특정한 인터페이스를 구현하거나 상속받을 필요가 없어

        기존에 존재하는 라이브러리 등을 지원하기에 용이하고 객체가 가볍다.

ⅲ. IoC 지원

     ∘  컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드를 호출한다.

ⅳ. DI 지원

     ∘  각각의 계층이나 서비스들간 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.

ⅴ. AOP 지원

     ∘  트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우

         해당 기능을 분리하여 관리할 수 있다.

ⅵ. 영속성과 관련 다양한 서비스를 지원

     ∘  iBatisHibernate 등 이미 완성도가 높은

        데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.

ⅶ. 스프링은 확장성이 높다.

 

 

Spring의 장점

 

ⅰ. 단순화된 단위 테스팅

     ∘  의존성 주입으로 단위 테스팅을 단순화 

     ∘  생산성 향상. 결함 조기발견. 지속적인 통합 빌드에서 자동화된 단위테스트 가능

ⅱ. 복잡한 코드 감소

     ∘  DB Connect, Exception, Transaction, Logging 등의 복잡한 코드를 줄인다.

ⅲ. 아키텍처의 유연성

     ∘  스프링 프레임워크는 모듈식으로 독립적인 구성을 지닌다.

     ∘  웹 데이터에서 스프링 MVC 프레임워크를 제공한다.

     ∘  Spring Beans로 비즈니스 로직을 위한 경량 구현체를 제공한다.

 

 

 


[ Spring Boot ]

 

ⅰ. 라이브러리 관리 자동화

     ∘  spring-boot-start를 통해 라이브러리 의존성을 간단히 처리할 수 있다.

ⅱ. 설정의 자동화

     ∘  프로젝트에 추가된 라이브러리 기반으로 실행환경을 자동 설정해준다.

     ∘  개발에 필요한 라이브러리들을 추가하면 관련 스프링 설정을 자동 처리해준다.

ⅲ. 라이브러리 버전 자동 관리

     ∘  스프링 부트 버전에 해당하는 스프링 라이브러리와 서드파티 라이브러리를 호환버전으로 제공

     ∘  라이브러리 버전 문제를 겪을 필요가 없고, XML 설정 과정이 필요없어진다.

ⅳ. 테스팅 환경 & 내장 TOMCAT

     ∘  JUnit 등 테스트 관련 라이브러리들이 포함되어 있어 테스트케이스 작성이 쉽다.

     ∘  Tomcat 서버를 내장하고 있어 따로 설치할 필요가 없다.

ⅴ. 독립적으로 실행 가능한 JAR

     ∘  스프링에서는 일반 자바프로젝트를 JAR 파일로, 웹 프로젝트라면 WAR 파일로 패키징 해야한다.

     ∘  부트는 웹 애플리케인셔 JAR 파일로 패키징하여 사용할 수 있다.

 

 

 


[ 스프링 컨테이너 ]

∘  스프링에서 사용할 객체들을 담고있는 것.

∘  ApplicationContext(인터페이스)를 스프링 컨테이너라 한다.
∘  등록된 스프링 빈을 생성하고 의존관계를 주입하고 생명주기를 관리해준다.

∘  AppConfig에 설정을 구성한다는 뜻의 @Configuration 어노테이션을 붙인다.

∘  각 메서드에 @Bean을 붙여 스프링 컨테이너에 스프링 빈으로 등록할 수 있다.

∘  스프링 컨테이너는 등록된 스프링 빈을 싱글톤 패턴으로 생성하고 관리한다.

 


[ 스프링 Bean ]

∘  스프링 Bean이란 자바 객체이다.

∘  스프링 컨테이너에서 만들어지는 객체를 스프링 빈이라고 부를 뿐 일반 자바 객체와 다르지 않다.

∘  참고로 자바 빈은 스프링 빈과는 다르게 DTO, VO 등과 유사한 개념이다.

 

∘  스프링 빈(bean)은 쓰레드 세이프 하지 않다.


 

[ Context ]

∘  Contextsystem을 핸들링 하기위해 존재한다.

   즉, 리소스 값 처리, 데이터베이스 및 기본 설정에 대한 액세스 권한 획득 등과 같은 서비스를 제공한다.

   Context는 현재 application이 동작하는 동안의 모든 환경을 핸들링한다고 생각하면 쉽다.

∘  어떤 루틴이 실행될 때 변수값들, 이전에 실행된 함수들의 내부상태 등을 말하는 것.

∘  동일한 루틴이 여러번 실행되더라도 컨텍스트에 따라 다른 결과가 나올 수 있다.


 

[ pom.xml ]

∘  빌드/배포와 관련된 설정을 담고 있는 파일 MAVEN에서 메타 정보로 사용하는 파일

∘  자바 라이브러리를 관리하기 위한 저장소


 

[ POJO ]

∘  특정 환경과 규약에 종속되지 않아 필요에 따라 재사용할 수 있는 방식으로 설계된 Object

∘  EJB는 가벼운 서비스조차 무겁게 만들어졌고, 기능 대체를 위해 전체 코드를 수정해야 하는 문제점이 존재

   Java의 기본 개념인 객체 지향에 집중하고 특정 클래스&라이브러리에 종속되지 말자는 의미에서 나온 개념

 


[ DI ]

∘  객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입 시켜주는 방식

∘  모듈 간의 결합도가 낮아지고 유연성이 높아진다.

∘  Bean 설정파일에 의존관계 정보를 추가하면 컨테이너가 자동으로 연결

∘  장점

    ·  Unit Test가 용이해진다.

    ·  코드의 재활용성이 높아진다.

    ·  객체간 종속성을 줄일 수 있다.

    ·  결합도를 낮추면서 유연한 코드를 작성할 수 있다.

    ·  @Autowired가 있으면 스프링 컨테이너가 찾아서 관계를 연결한다.

 

 

A 객체에서 B, C객체를 사용(의존)할 때 A 객체에서 직접 생성 하는 것이 아니라 외부(IOC컨테이너)에서 생성된 B, C객체를 조립(주입)시켜 setter 혹은 생성자를 통해 사용하는 방식이다.


[ IoC ]

∘  프로그램의 흐름(객체나 메서드의 호출)을 개발자가 아닌 프레임워크가 주도하는 것

  객체의 생성부터 생명주기 관리를 컨테이너가 도맡아하는 것

∘  @Autowired Bean을 주입하는 것 또한 IoC이다.

∘  제어권이 컨테이너로 넘어옴으로써 DI, AOP등이 가능해졌다.

 

 


[ AOP : 관점지향 프로그래밍]

∘  어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것

∘  흩이진 관심사를 묶어 Aspect로 모듈화하고 핵심 비즈니스로직과 분리하여 재사용하는 것

∘  @Aspect 어노테이션으로 해당 클래스가 Aspect를 나타내는 클래스임을 명시하고 @Component를 통해 빈에 등록 

 

 


[ Servlet ]

∘  클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술

∘  자바를 사용하여 웹을 구현하기 위한 기술

∘  Spring MVC에서 Controller로 이용되며, 사용자의 요청을 받아 처리한 후에 결과를 반환

 

 Servlet 컨테이너

∘  서블릿 컨테이너는 웹서버와 통신하기 위해 웹 소켓을 생성/특정 포트에 리스팅/스트림을 생성하는 등의

    복잡한 일들을 할 필요 없게 만들어준다.

∘  서블릿 컨테이너의 대표적인 예는 Tomcat

∘  컨테이너는 요청이 들어올 때마다 자바 스레드를 만든다.

 

 Dispatcher Servlet 

∘  TOMCAT 과 같은 서블릿 컨테이너를 통해 들어오는 모든 요청을 제일 앞에서 받는 컨트롤러

∘  공통된 작업을 처리한 후에, 적절한 세부 컨트롤러로 작업을 위임

∘  각각의 세부 컨트롤러는 처리할 부분을 처리하고 반환할 viewDispatcher Servlet에 넘기게 됩니다.

 

 

 vs. JSP

 


[ Spring MVC ]

 

 

∘  Spring MVC란 웹 애플리케이션 개발을 위한 MVC 패턴 기반의 웹 프레임워크

∘  Spring MVC는 애플리케이션의 구성요소를 Model, View, Controller로 분리

 

∘  또한 Spring MVC는 아래와 같은 컴포넌트들로 구성 

ⅰ. Dispatcher Servlet  : 클라이언트의 요청을 먼저 받아들이는 서블릿으로, 요청에 맞는 컨트롤러에게 요청을 전달

ⅱ. Handler Mapping  : 해당 요청이 어떤 컨트롤러에게 온 요청인지 검사

ⅲ. Controller  : 클라이언트의 요청을 받아 처리(Service - DAO - DB)하여 결과를 디스패처 서블릿에게 전달

ⅳ. ViewResolver  : View의 이름을 통해 알맞은 View를 찾음

ⅴ. View  : 사용자에게 보여질 UI 화면

 

 

 

∘  장점

    ·  DI를 통해 컴포넌트 간의 결합도를 낮출 수 있어 단위 테스트 용이

    ·  IoC를 통해 Bean(객체)의 라이프싸이클에 관여하지 않고 개발에 집중할 수 있다.

∘  단점

    ·  XML을 기반으로 하는 프로젝트 설정은 너무 많은 시간을 필요로 함

    ·  톰캣과 같은 WAS를 별도로 설치해주어야 함

∘  해결책(Spring Boot)

    ·  자동설정(AutoConfiguration)을 도입하여 Dispatcher Servlet 등과 같은 설정 시간을 줄여줌

    ·  프로젝트의 의존성을 독립적으로 선택하지 않고 spring-boot-starter로 모아두어 외부 도구들을 사용하기 편리함

    ·  내장 톰캣을 제공하여 별도의 WAS를 필요로 하지 않음


[ DAO / DTO / VO ]

DAO :  DB에 접근하여 실제 데이터를 조회 또는 조작하는 클래스, Repository 또는 Mapper에 해당함

DTO : 데이터를 주고 받기 위해 사용하는 클래스

VO : 실제 데이터만을 저장하는 클래스

 


 

[ Spring의 싱글톤 패턴 ]

∘  1개의 클래스당 1개의 객체만을 생성됨을 보장하고 이 객체를 사용하는 디자인 패턴

∘  Spring에서는 스프링 컨테이너가 관리하는 객체인 Bean을 싱글톤패턴으로 구현하여 제공 (변경 가능)

 

∘  Spring에서는 객체를 싱글톤으로 관리하여 객체지향적 개발을 할 수 있다.

∘  스프링 컨텍스트에 의해 제어

∘  Java 싱글톤 패턴이 Thread Safety를 자동으로 보장하지 못하는 반면 Spring 싱글톤은 보장한다.

 

∘  특징

    ·  객체를 여러번 생성하지 않아도 되기 때문에 그에 따르는 비용이 적다.

    ·  객체가 무조건 한번만 생성되는것을 보장할 수 있다.

    ·  한번 만들어서 여러곳에서 사용하면 수정하기 힘들다.

    ·  test하기 어렵다.

 

 

 


[ Annotation @ ]

∘  어노테이션은 메타데이터(Metadata), 코드를 설명하기 위한 데이터라고 정의할 수 있다.

∘  @를 이용한 주석, 자바 코드에 주석을 달아 특별한 의미를 부여한 것이다.

 

∘  컴파일러가 특정 오류를 억제하도록 지시하는 것과 같이

   프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공, 코드에 정보를 추가하는 정형화된 방법이다.

∘  @Override 어노테이션처럼 컴파일러를 위한 정보를 제공하기 위한 용도이다.

∘  스프링 프레임워크의 @Controller 어노테이션처럼 런타임에 리플렉션을 이용해 특수 기능을 추가하기 위한 용도

 

 

 


 

[ SQL Mapper vs ORM ]

자바에서는 데이터의 영속성(Persistence)를 위한 JDBC를 지원해주는데, JDBC에서 DB에 접근하여 SQL을 수행하고, 결과값을 다시 dataType으로 매핑시켜주는 작업을 개발자가 일일히 수행해야 하는 번거로움이 있다.

 

SQL Mapper와 ORM은 개발자가 직접 JDBC Programming을 하지 않도록 기능들을 제공해주는 Persistence Framework 종류이다.

 

 

SQL Mapper

∘  ObjectSQL의 필드을 매핑하여 데이터를 객체화하는 기술.

∘  SQL문을 직접 작성하고 쿼리 수행결과를 어떠한 객체에 매핑하여 줄 지 바인딩하는 방법. SQL 의존적인 방법

ex) JdbcTemplate, Mybatis

 

o MyBatis

     ∘  SQLxml파일로 분리하여 관리하고, SQL결과와 객체 인스턴스의 매핑을 도와주는 역할을 수행.

     ∘  동적쿼리를 지원하여 다이나믹하게 변경되는 쿼리 작성가능.

    단점

       ·  SQL을 개발자가 직접 작성하는 문제.

       ·  DBMS에 종속적인 문제.

       ·  비슷한 쿼리를 반복적으로 작성해야하는 문제

       ·  객체와 관계형 테이블 구조간 패러다임 불일치 발생.

 

ORM

∘  ObjectDB테이블을 매핑하여 데이터를 객체화하는 기술.

∘  CRUD 관련 메소드를 사용하면 자동으로 SQL이 만들어져 개발자가 반복적인 SQL을 직접 작성할 필요가 없다.

∘   DBMS에 종속적이지 않다.

∘  복잡한 쿼리의 경우 JPQL을 사용하거나 SQL Mapper를 혼용하여 사용할 수 있다.

∘  Java ORM 기술에 대한 인터페이스 표준 : JPA라고 하고, 이를 구현한 가장 대표적인 기술이 Hibernate이다.

ex) Hibernate, EclipseLink, DataNucleus

   장점

       ·  DBMS에 의존하지 않음으로써 도메인과 비즈니스 로직 설계에 더 집중할 수 있는 장점

       ·  요구사항 변화에 빠른 대처 가능한 장점

       ·  복잡한 통계성 쿼리보다는 실시간 처리용 쿼리에 적합

 


[ Spring Security ]

∘  Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크

  '인증'과 '권한'에 대한 부분을 Filter 흐름에 따라 처리

∘  Spring Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에

    개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다는 장점이 있다.

 

 


[ Spring WebFlux ]

∘  Blocking + 동기 방식으로 동작하는 Spring MVC의 한계점을 극복하기 위해 Spring5에 처음 등장

 

 기존의 Spring MVC에서는 HTTP 요청들을 큐에 넣어두고, 멀티쓰레드를 기반으로 동작

∘  이러한 방식은 응답성이 상대적으로 떨어지기 때문에 비동기적으로 요청을 처리하기 위한 방법이 필요하게 되었고,       리액티브 프로그래밍을 통해 비동기 데이터 스트림으로 Non-Blocking 애플리케이션을 개발하기 위한

   Spring WebFlux 프레임워크가 등장

 


[ CDN : Content Delivery Network ]

∘  CDN은 물리적으로 떨어져 있는 사용자에게 컨텐츠를 더 빠르게 제공하기 위해 고안된 기술입

∘  느린 응답속도와 다운로드 시간을 극복하기 위해 서버를 분산시켜 캐싱해두고, 빠르게 다운받을 수 있게 한다.

 

∘  CDN은 콘텐츠에 대한 요청이 발생하면 사용자와 가장 가까운 위치에 존재하는 서버로 매핑시켜,

   요청된 파일의 캐싱된(사전 저장된) 버전으로 요청을 처리

∘  서버가 파일을 찾는 데 실패하는 경우 CDN 플랫폼의 다른 서버에서 콘텐츠를 찾은 다음 엔드유저에게 응답을 전송

728x90

'Spring' 카테고리의 다른 글

Spring Batch란?  (0) 2022.03.22
[Spring] Spring의 Event 처리 과정  (0) 2022.03.15
스프링 핵심 원리  (0) 2021.11.11

댓글