본문 바로가기
Tip & Tech/기술면접

웹개발자 기술면접 정리 _ Spring 관련 질문 취합

by 나비와꽃기린 2021. 7. 14.

* 여러 블로그를 및 서적을 참고하여 개인적으로 정리했던 문서라 출처를 적지 못해

문제가 생기는 부분이 있다면, 문서를 비공개 또는 삭제하도록 하겠습니다.

 

 

스프링이란 무엇입니까?

Spring은 자바 엔터프라이즈 개발을 편하게 해주는 오픈 소스 개발 프레임 워크이다.

 

스프링 특징 간단히

- 크기와 부하의 측면에서 경량.

- 제어 역행(IoC)이라는 기술을 통해 애플리케이션의 느슨한 결합을 도모

- 관점지향 프로그래밍(AOP) 위한 풍부한 지원

- 애플리케이션 객체의 생명 주기와 설정을 포함하고 관리한다는 점에서 일종의 컨테이너(Container)라고 있음

- 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 있음

스프링 특징 자세히

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

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

b. 스프링은 POJO(Plain Old Java Object) 방식 프레임워크.

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

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

c. 스프링은 제어의 역행(IoC : Inversion of Control) 지원.

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

d. 스프링은 의존성 주입(DI : Dependency Injection) 지원

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

e. 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming) 지원

   따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 있다.

f. 스프링은 영속성과 관련된 다양한 서비스 지원

   iBatis Hibernate 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 있는 인터페이스를 제공한다.

g. 스프링은 확장성이 높음.

   스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리가 

   이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.



MVC 구조란?

모델-뷰-컨트롤러의 약자로, 디자인 패턴의 하나이다. 비즈니스 처리 로직과 사용자 인터페이스를 구분시켜 서로 영향없이 개발이 가능하다는 장점이 있다(MVC패턴).

모델(Model)은 어플리케이션이 "무엇"을 할 지에 대한 정의한다. 처리되는 데이터, 데이터베이스, 내부 알고리즘 등 내부 비즈니스에 관한 로직의 처리를 수행한다. 즉 사용자에게 보이지 않는 로직.

뷰(View)는 말 그대로 사용자에게 보여지는 영역이다. JSP등 사용자 인터페이스를 담당한다.

컨트롤러(Controller)는 모델에게 "어떻게"할 것인지를 알려주며, 모델과 뷰 사이를 연결하는 역할을 한다. 사용자의 입출력을 받아 데이터를 처리한다.

 

컨테이너(container)?

컨테이너는 보통 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하도록하는 . 코드의 처리과정을 위임받는다.


Spring container의 종류(BeanFactory ApplicationContext 차이점)

(1)Bean Factory : DI의 기본사항을 제공하는 컨테이너. Bean을 생성하고 분배하는 작업을 한다.

처음으로 getBean()이 호출된 시점에서야 해당 빈을 생성한다.(lazy loading이라함)

(2)ApplicationContext : bean 팩토리와 유사하지만 더 많은 기능을 제공한다. 미리 빈을 생성해 놓아(싱글톤) 빈이 필요할 떄 즉시 사용할 수 있도록 보장한다.

 

컨테이너란? 프레임워크 안에서 인스턴스들의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 부여한다. 내가 작성한 코드의 처리과정을 컨테이너에서 수행한다. 스프링 컨테이너는 스프링 프레임워크 핵심에 위치하여, DI 통해 애플리케이션을 구성하는 컴포넌트들을 관리한다.

 

그렇다면 IoC Conatiner 대해서는 알고 있나요?

IoC 컨테이너란 Bean 즉, IoC Container에서 관리하는 객체의 생성과 관계설정, 사용, 제거 등의 전체 라이프 사이클을 관리해주는 작업을 하는 컨테이너를 IoC 컨테이너라고 부릅니다. IoC Container의 대표적인 명세는 BeanFactory인데 요즘은 이를 상속하는 ApplicationContext를 사용하는 추세입니다. ApplicationContext는 Bean Factory의 기능 뿐만 아니라, 메세지 다국화, 이벤트 발행 기능, 리소스 로딩 기능 등의 여러 기능을 명세하고 있습니다.

 

 

Spring IoC Container Bean 등록 방법에는 무엇이 있는가?

xml 설정파일을 이용해서 Bean 등록, @Annotatation을 통해 Bean 등록하는 방법 등이 존재합니다. 하지만 Annotation 기반의 Bean 등록시에는 Component Scan을 꼭 필요로 하는데요, Component Scan을 직접 등록해 줄 수도 있겠지만 Spring Boot는 Component Scan까지 자동으로 구성해줘, 너무 잘 사용하고 있습니다!!!

 

@SpringBootApplication 에서 아래와 같은 기능을 동시에 실행해주기떄문!

@Configuration 스프링설정으로 사용하겠다는 의미

@EnableAutoConfiguration 지정해둔 설정값들을 자동으로 설정하는 기능을 키는 것을 의미

@ComponenetScan @Component 또는 @Configuration 붙은 클래스들을 bean으로 등록

 

 

MVC 실행순서

요청된 URL dispatcher-servlet 전달 -> 핸들러 매핑(매핑 핸들러가 아닌듯) 해당 URL 매핑된 컨트롤러가 있는지 검사 컨트롤러에 전달 -> 해당 컨트롤러가 로직을 처리 -> 결과를 ModelAndView 객체 생성 담아 dispatcher-servlet 전달 -> dispatcher-servlet 전달 받은 View(jsp) 있는지 검사하기 위해 ViewResolver 보냄 -> ViewResolver 받은 View(jsp) 있는 검사 View 보냄 -> View에서 Model 같이 View(jsp) 그린 후에 dispatcher-servlet으로 전달 -> 최종적으로 컨텐츠를 클라이언트에게 전달.

 

 

Bean 객체란? 자바에서의 POJO(Plain Old Java Object), XML 설정파일을 통한 생명주기, 종속성 등의 메타데이터를 가지고 스프링 컨테이너에서 생성된 객체이다. 컨테이너에서 생성되었다는 점을 제외하면 일반 자바객체와 같다.

 

VO ?

Value Object의 줄임말로, 값을 갖고있는 객체이다. 비즈니스 값을 가져올 때 사용하며, 보통 값을 수정할 수 없는 것으로 한다. DTO와 혼용해서 쓰기도 한다.

 

DTO ?

Data Transfer Object의 줄임말로, VO와 같이 값을 갖고 있는 객체이다. VO와의 차이점은 DB로 치자면 하나의 인스턴스로, 데이터 핸들링에 사용되는 객체이다. DTO를 통해 데이터를 전달할 수 있다.

 

DAO ?

Data Access Object의 줄임말로, 실제 DB에 접속하는 객체이다.

 

AOP (관점지향 프로그래밍) 스프링 프레임워크의 핵심 요소 하나. 비즈니스 로직과 공통 모듈로 분리하고, 핵심 로직 사이사이에 공통 모듈을 끼워 넣는 것을 말함. 이때 공통 모듈을 코드 밖에서 설정된다는 것이 핵심. 인증, 로깅, 트랜잭션 처리에 용이.

 

DL (의존성 검색)

저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean look up

 

DI (의존성 주입)

각 클래스간의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결

 

DI개념

정의 : 각 클래스간의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해 주는것특징

개발자들은 단지 빈설정파일에 의존관계가 필요하다는 정보만을 작성하면 됨, 실행 시 동적으로 의존관계가 형성됨

 

IOC DI간단정리

  IOC : Inversion of Control (제어의 역전)
개발자가 만든 어떤 클래스나 메소드를 다른 프로그램이 대신 실행해주는 것을 제어의 역전

· DI : Dependency Injection(의존성 주입)
클래스 사이의 의존 관계를 (Bean) 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는

 

 

Spring 동작 순서 (아키텍처)

 

Spring Spring Boot의 차이? 사용한 버전? 장단점?

Spring은 약간 xml 지옥과도 같은..  web.xml 부터 시작해 servlet.xml , applicationContext.xml등과 같이 필터,리스너(로깅) ,디펜던시 설정, 팩토리설정,뷰리졸버 설정, 버전설정 다 일일히 개발자가 해줘야 함

하지만 SpringBoot는 버전관리도 스프링부트가 해주기 때문에 호환되는 라이브러리에 대한 종속성이나 버전같은걸 개발자가 신경 쓸 일이 없어진다.(starter 의존성 한줄로 많은걸 자동으로 설정해줌) 또한 내장형톰캣을 가지고 있어서 별도의 톰캣설정이 필요 없어 바로 서버를 실행하여 코딩을 시작할 수 있게끔 환경설정 및 인프라적인 요소에서 많이 자유로워질 수 있다.

 

 

Spring Boot Spring Framework의 차이점은 무엇인가요?

스프링 부트와 스프링 프레임워크의 가장 큰 차이는 Auto Configuration의 차이인 것 같습니다. 한 예로써 Spring MVC 프로젝트를 Spring Framework 기반으로 구성을 한다면, 컴포넌트 스캔, bean 설정, Dispatcher Servlet 설정, View Resolver, JDBC 설정, jar 설정 등의 다양한 설정을 해야하지만 이를 Spring Boot 기반으로 구성함으로써 초기 개발 환경 세팅에 걸리는 리소스를 많이 아낄 수 있다고 생각합니다.

 

 스프링 부트 프로젝트를 생성할 시 스프링 부트에서는 내장 서블릿 컨테이너인 톰캣(tomcat)이 자동적으로 설정됩니다.

 

 

@Service, @Controller @Repository ?

세 개의 특수주석은 응용 프로그램에서 "레이어" 를 분리하는 데 사용됩니다.

  • 컨트롤러는 디스패치, 전달, 서비스 메소드 호출 등의 작업을 수행합니다.
  • 서비스 보류 비즈니스 로직, 계산 등
  • 리포지토리는 DAO (데이터 액세스 개체)이며 데이터베이스에 직접 액세스합니다.

모듈성 AOP 쪼개서 커플링 줄이기 유지보수쉽게

@Component 는 주석 된 bean을 스캔하여 DI 컨테이너에서 사용할 수있게하는 최상위 일반 주석.

@Component 사용하여 구성 요소 클래스를 표시 있지만, @Service, @Controller

등의 특수주석을 사용하는 이유는 예상되는 기능에 적합하도록 함에 있고 또한 연관성이 있게 있다.

 

 

Interceptor filter의 차이점은?

공통점 : Controller가 호출되기 전에 실행된다.!!!

차이점 : filter dispatcher가 호출되기 전에 interceptor dispatcher가 호출되고 난 뒤 호출된다는 차이점이 있다.

어떤상황에 어떤 것을 사용해야 하는 명확한 답은 없지만.. 대개

인코딩이나 보안 같은 web app에 전역적으로 처리해야하는 로직은 filter에서 처리하고

클라이언트의 요청에 따른 인증,권한등의 ‘디테일한’ 처리는 주로 인터셉터에서 처리한다.!!!!

이렇게 로그인세션처리, 권한체크, XSS , 로그 등에 대한 공통처리를 위해 해결할 수 있는 것이  Filter Interceptor

 

 

Bean이 도대체 정확히 무엇인가?

Spring Di컨테이너가 관리하는 객체를 bean

 

Spring에서 BeanFactory 란 무엇입니까?

Spring에서 POJO(plan old java object) bean라고 부른다

Bean는 어플리케이션의 핵심을 이루는 객체이며 Spring IOC 컨테이너에 의해

인스턴스화, 관리, 생성된다.

 

 

POJO?

 특정 환경과 규약에 종속되지 않아 필요에 따라 재사용될 있는 방식으로 설계된 오브젝트라 있다.

 

1.      IT시스템이 발전함에따라 복잡한 기술요건이많아짐 JDK로만은 해결X

2.      그래서 J2EE가나왔지만 Servlet,JSP 서버프로그래밍 가지고는 복잡한 어플리케이션을 만드는데 한계가 있었음.

3.      그래서 나온 것이 EJB (Enterprise Java Bean)

4.      이로써 개발자는 비즈니스 로직에만 집중할 있게 되었는데 EJB 혜택을 위해서는 WAS 구입하던가 IDE 설정의 도움을 받는등의 추가적인 제약이 생김

·        여기서 EJB 경우 implement,extends 클래스간 결합의존도가 높아지는 코드들이 많아지는데…..

1.      따라서 특정환경과 규약에 종속되지 않아 재사용할 있는 방식으로 설계된 pojo   javabean 사용하는 .

pojo기반의 프레임워크가 바로 Spring ..

 

 

 

pring Bean Scope

스프링은 기본적으로 모든 bean singleton으로 생성하여 관리한다.

구체적으로는 애플리케이션 구동 시 JVM 안에서 스프링이 bean마다 하나의 객체를 생성하는 것을 의미한다.

Ex) singleton, prototype, request, session, gloabal session

 

Spring Bean LifeCycle (생명주기)

스프링에서 객체를 관리한다는 것은 필요한곳에 주입하는 것 뿐만 아니라 객체의 생성,소멸 등

즉 생명주기를 관리한다라는 것을 의미한다.

크게 생성, 빈설정, 사용, 소멸 단계를 거치는데 자세히 풀어말하면

스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료 의 단계를 가진다.

1.     어노테이션,xml 등 설정파일을 읽어서 bean 객체를 생성한다

2.     Bean에 의존성을 주입한다.

3.     Bean 객체를 초기화한다.

4.     스프링컨테이너가 종료하면 스프링빈컨테이너는 Bean객체를 소멸시킨다.

객체를 초기화, 소멸시킬때 각각 지정된 메소드를 호출할 수 있는데

 InitializingBean(초기화), DisposableBean(소멸) 을 구현해서 afterPropertiesSet(), destroy() 함수를 구현해주면 된다.

 

AOP? (Aspect Oriented Programming) – 관점지향프로그래밍

프로젝트에서는 메소드 호출 전후의 데이터 확인을 위한 로깅이나 예외 처리데이터 검증과 관련된 코드가 클래스 전반에 걸쳐서 쓰여지는데 이를 OOP로 구현하면 여기저기 반복적인 소스 발생!!

코드중복많아 유지보수 힘듬.. 객체지향프로그래밍인 OOP 단점을 해결하기 위해 나온게  AOP(관점지향프로그래밍)

쉽게말하자면 시스템전반에 산재되어 있는 핵심기능을 모아 분리하여 개발하는 것을 AOP라고함

 

스프링에서 Component Scan이란?

컴포넌트 스캔이 말그대로 빈으로 등록할 컴포넌트를 어노테이션 기반으로 검색해서 자동등록해주는 기능입니다

component-scan으로 체크되는 어노테이션은

@Component, @Repository, @Service, and @Controller

 

 

SpringFramework 간단설명

1) 경량 컨테이너로 자바 객체를 직접 관리한다.

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

2) 스프링은 POJO 방식의 프레임워크

- 특정한 인터페이스를 구현하거나 상속받을 필요가 없어 기존에 존재하는 라이브러리를 지원하기에 용이하고 객체가 가볍다

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

4) 스프링은 의존성 주입을 지원한다. - 각각의 계층이나 서비스들간에 의존성이 존재할 경우 프레임워크가 서로 연결

5) AOP - 랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.

 

Spring Bean을 주입받는 방법에는 무엇이 있나요? (DI방법)

@Autowired 애노테이션으로 필드에 주입받을 수도 있구요, 생성자를 통해서 주입 받을 수 있고, setter를 통해서 주입 받을 수 있습니다. Bean이 주입 될 때 같은 이름 및 같은 타입의 빈이 존재한다면 @Primary 애노테이션으로 우선순위 설정할 수 있고, @Qulifier 애노테이션으로 Bean 이름을 통해서 주입 받을 수 있다.

 

스프링 빈 주입방법 어떤게 있나요?

에는 크게 두가지로 나뉜다

(1)‘컴포넌트 스캔을 이용한 등록방법 (2)‘자바를 통한 직접등록방법

@Service, @Repository 등의 어노테이션은 내부적으로@Component라는 어노테이션을 포함하고 있다. 따라서 스프링컨테이너는 기동시 어노테이션을 찾아 연결관계를 매핑해준다.

(**스프링에서의 빈 등록은 싱글톤 방식으로 한번만 등록해주는 방식이다)

그리고 작게, (1)컴포넌트 스캔을 이용한 등록방법 에는

 

-@Autowired 를 통한 필드주입 (가장간단)

-setter를 사용한 주입방식

-생성자를 사용한 주입방식

 

댓글0