본문 바로가기
면접대비/예상질문

백엔드 신입 면접질문 공부(스프링 Spring & JPA)

by 계범 2022. 3. 20.

주관적인 기준

상: 많이 나올만한 내용

중: 나올수도 있는 내용

하: 잘 안나올 거 같은 내용

@SpringBootApplication이란 무엇인가요?(상)

더보기

 스프링 부트로 프로젝트를 실행할때 Application클래스를 만듭니다.

@SpringApplication는 Application 클래스에 쓰는 어노테이션입니다.

이 어노테이션으로 인해 스프링 부트의 Bean을 읽어와서 자동으로 등록(생성)해줍니다.

(어노테이션안의 @ComponentScan을 통해 @Component, @Controller 등등 Bean을 등록.

@EnableAutoConfiguration을 통해 사전에 정의한 라이브러리들 중 조건에 맞는 Bean을 등록.)

 

@SpringApplication이 있는 위치부터 설정을 읽어가기 때문에 항상 프로젝트의 최상단에 위치해야합니다.

 

SpringApplication.run()을 통해 해당 클래스를 run하면, 내장 WAS를 실행시킵니다.

(내장 WAS의 장점: 외부 WAS를 설치 및 설정해두지 않아도 되기 때문에 매우 편리)

 

DI는 무엇인가요?(상)

더보기
DI(Dependency Injection)은 의존성주입이란 뜻으로, 구성요소간의 의존관계를 내부가 아닌 외부의 설정파일 등을 통해 정의하는 것입니다.(IoC의 일종)

 

주입 방법으론 필드 주입, setter 주입, 생성자 주입 3가지가 있습니다.

 

IoC가 무엇인가요?(상)

더보기
IoC(Inversion of Control)이란 "제어의 역전"이란 의미로, 메서드나 객체의 호출작업을 개발자가 하는 것이 아닌, 외부에서 결정되는 것을 의미합니다. 즉 인스턴스의 생성부터 소멸까지를 IoC 컨테이너가 대신 관리해줍니다.이 과정에서 DI(의존성 주입)를 통해 IoC컨테이너에 주입시킵니다.

 

new Repository() 처럼 직접 생성하는게 아니라, 스프링이 직접 생성해주고 연결을 해줍니다.

 

Bean이란? 등록방법은?(상)

더보기

스프링 IoC 컨테이너가 관리하는 객체들을 Bean이라고 부릅니다.

@Component 어노테이션을 통해 개발자가 직접 작성한 class를 빈으로 등록해줄 수 있습니다.

 

(스프링엔 @Component어노테이션이 붙어있는 클래스의 인스턴스를 만들어 Bean으로 등록해주는 어노테이션 처리기가 있음. @SpringBootApplication 어노테이션 정의를 보면 @ComponentScan 어노테이션이 붙어있음. 이 어노테이션은 어느 지점부터 컴포넌트를 찾아보라고 알려 주는 것. 이를 통해 찾아서 등록해준다.)

 

BeanFactory와 ApplicationContext의 차이점은 무엇입니까?(상)

더보기

BeanFactory는 Bean을 제공하고 관리하는 기본적인 IoC컨테이너 인터페이스를 뜻합니다. 기본 구현은 getBean()이 호출될 때 빈을 인스턴스화합니다.

ApplicationContext는 BeanFactory의 확장된 버전으로, 애플리케이션에 대한 모든 정보, 메타 데이터도 가지고 있습니다. 기본구현은 어플리케이션이 시작될 때 빈을 인스턴스화합니다.

 

(ApplicationContext는 BeanFactory에서 제공하는 기능 + 추가기능들이 있다.

대표적인 추가기능으로 메세지에 대한 국제화 등등이 있다~)

 

스프링 컨테이너의 생명주기는 어떻게 되나요(상)

더보기

ApplicationContext 구현 클래스를 이용한 스프링 컨테이너 초기화(생성), getBean()을 이용한 빈(Bean) 객체 이용, close()를 이용한 스프링 컨테이너 종료가 있습니다.

 

(Bean의 생명주기 : 스프링 컨테이너의 생명주기와 동일

1. 스프링 컨테이너 초기화: 빈 객체 생성 및 주입

2. 스프링 컨테이너 종료: 빈 객체 소멸)

참조 깃 레포

 

스프링에서 AOP가 뭔가요?(상)

더보기

AOP(Aspect Oriented Programming) 는 관점 지향 프로그래밍으로, 로직을 기준으로 중복된 코드들(공통 관심사항)을 뽑아서 Aspect로 모듈화하여 재사용하는 것입니다.

 

(여기에 프록시 패턴이 쓰인다)

참조 블로그

 

Spring을 사용하면 어떤 이점이 있습니까?(상)

더보기

AOP: 시스템 서비스에서 비즈니스 로직을 분리하기위해 AOP를 지원합니다.

IoC 컨테이너: Bean 라이프 사이클 및 프로젝트 별 구성을 대신 관리해줍니다.

MVC 프레임 워크: XML/JSON 응답을 반환할 수 있는 웹 어플리케이션 또는 Restfull 웹 서비스를 만드는데 사용됩니다.

예외처리 : 기술 별 예외를 확인되지 않은 예외로 변환하기위한 편리한 API를 제공합니다.

 

참조 블로그

 

@Controller, @Service, @Repository의 차이를 설명해주세요(상)

더보기

서버에서 처리 과정을 역할별로 분리해둔 것입니다.

 

@Controller는 클라이언트의 요청을 받고 view를 반환합니다.

@Service는 비즈니스 로직을 처리합니다.

@Repository는 DB관리 및 DB CRUD 작업을 처리합니다.

 

(이러한 어노테이션을 통해 스프링 관련 작업 예외를 알려줄 수 있게 됩니다.)

 

DAO, DTO, VO에 대해 설명해주세요(상)

더보기

DAO(Data Access Object) : 데이터베이스의 data에 접근하기 위한 객체입니다.

DTO(Data Transfer Object) : 계층간 데이터 교환을 위한 객체입니다.

VO(Value Object) : 값을 나타내기 위한 객체입니다.(불변,readonly)

 

spring과 spring boot의 차이에 대해 설명해주세요(중)

더보기

스프링부트는 스프링 프레임워크를 사용하기위한 설정 부분을 대부분 자동화하고 내장서버와 보다 편리하게 API를 추가할 수 잇게 도와준 도구입니다. 즉 스프링을 보다 편리하게 사용할 수 있게 해줍니다.

 

spring mvc에 대해 설명해주세요(상)

더보기

스프링 프레임워크에서 제공하는 웹 모듈입니다.

MVC는 Model-View-Controller에 약자입니다.

 

Model은 데이터를 담당합니다.

View는 사용자에게 보여지는 화면을 담당합니다.

Controller는 모델과 뷰를 연결시켜주는 역할을 담당합니다.

 

mvc 패턴의 실행 흐름에 대해 설명해주세요(상)

더보기

1. 디스패처 서블릿이 클라이언트로부터 요청 받습니다.

2. 핸들러매핑에 해당하는 핸들러가 있는지 확인합니다.

3. 핸들러매핑은 해당하는 핸들러가 있으면 핸들러의 이름을 디스패처 서블릿에 알려줍니다. 이 때,핸들러를 실행하기 전/후 처리할 것들을 인터셉터로 만들어줍니다.

4. 디스패처 서블릿은 해당하는 핸들러에게 제어권을 넘겨줍니다. 핸들러는 응답에 필요한 서비스를 호출하고 응답에 들어갈 뷰 이름을 디스패처 서블릿에게 알려줍니다.

5. 디스패처 서블릿은 뷰 이름과 모델을 뷰 리졸버에게 전달합니다.

6. 뷰 리졸버는 해당하는 뷰를 만들어서 디스패처 서블릿에게 전달합니다.

7. 디스패처 서블릿은 해당하는 뷰를 클라이언트에게 응답합니다. 

 

mvc1과 mvc2에 대해 설명해주세요(중)

더보기

mvc1은 클라이언트의 요청을 jsp 페이지가 받아서 처리합니다. 즉 jsp가 컨트롤러와 뷰의 역할을 둘다 했었습니다.

jsp 페이지 내에는 비즈니스 처리를 위한 코드와 브라우저에게 결과를 보여주기 위한 출력 관리 코드가 섞여있었습니다.

 

mvc2에서는 클라이언트의 요청을 서블릿이 받습니다. 서블릿이 해당하는 요청에 알맞게 처리한 후 그 결과를 jsp에게 전달합니다. 즉 서블릿이 컨트롤러 역할, jsp가 뷰역할을 나눠서 담당하게 됩니다. 그로인해 명료한 구조를 가질 수 있게 됩니다.

 

디스패처 서블릿(Dispatcher Servlet)에 대해 설명하세요(상)

더보기

디스패처 서블릿은 HTTP 프로토콜로 들어오는 요청을 가장 먼저 받아서 적합한 컨트롤러에게 전달해주는 프론트 컨트롤러입니다.

 

디스패처 서블릿을 사용하게 되면 공통작업을 코드 중복없이 처리할 수 있습니다.

 

Servlet에 대해 설명하세요(상)

더보기

서블릿은 자바를 기반으로 하는 동적인 웹페이지를 만들어줄 수 있는 프로그래밍 기술입니다.

서블릿을 통해 요청과 응답의 흐름을 메서드 호출만으로 체계적으로 다룰 수 있게 해줍니다.

 

서블릿 컨테이너를 통해 생명주기 관리, 통신 지원, 멀티스레딩 관리, 보안관리를 지원합니다.

 

블로그 참조


Spring Security에 대해 설명하세요(중)

더보기

스프링 시큐리티는 스프링 기반의 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크입니다.

인증(Authenticate,누구인지?)과 인가(Authorize, 어떤것을 할 수 있는지?)를 담당하는 프레임워크를 말합니다.

 

블로그 참조

 

스프링 filter와 interceptor의 차이는 무엇인가요(중)

더보기

필터는 J2EE(자바 기술) 표준 스펙 기능으로 디스패처 서블릿에 요청이 전달되기 전/후에 url패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공합니다.

 

인터셉터는 스프링이 제공하는 기술로써, 디스패처 서블릿이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공합니다.

 

필터는 웹 컨테이너가 관리하고, 보안 관련, 모든 요청에대한 로깅 또는 감사, 이미지/데이터 압축 및 문자열 인코딩 등에 쓰이고,

인터셉터는 스프링 컨테이너가 관리하며, 인증/인가 등과 같은 공통 작업, API호출에 대한 로깅 또는 감사, Controller로 넘겨주는 정보의 가공 등에 쓰입니다.

 

블로그참조

 

Spring Annotation에 대해 설명하세요(중)

더보기

어노테이션은 코드 사이에 주석처럼 쓰이며, 특별한 의미,기능을 수행하도록 하는 기술입니다.

즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있습니다.

 

블로그 참조


@Controller 와 @RestController의 차이에 대해 설명하세요(상)

더보기

@Controller는 주로 View를 반환하기 위해 사용합니다. 뷰리졸버를 통해 View를 찾아 랜더링합니다.

데이터를 반환하고 싶으면 @ResponseBody 어노테이션을 활용하여 Json 형태로 데이터를 반환할 수 있습니다.

@RestController는 2개의 어노테이션이 합친 것으로, json형태로 객체 데이터를 반환해줍니다.

 

JPA란

더보기

JPA(Java Persistence API)는 자바 진영의 ORM 기술에 대한 API 표준 명세입니다.

즉 보다 객체와 데이터베이스간의 관계를 편리하게 이어주는 것입니다.

 

JPA 구현체의 대표적인 것으로 Hibernate라는 ORM프레임워크가 있습니다.

 

영속성 컨텍스트란

더보기

영속성 컨텍스트는 엔티티를 영구 저장하는 환경으로, 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 환경입니다.

 

영속성 컨텍스트의 생명주기는 트랜잭션과 동일합니다. 트랜잭션을 종료하면 같이 종료됩니다.

 

엔티티 생명주기

비영속: 영속성 컨텍스트와 전혀 관계가 없는 상태

영속: 영속성 컨텍스트에 저장된 상태

준영속: 영속성 컨텍스트에 저장되었다가 분리된 상태

삭제: 삭제된 상태

 

블로그 참조


영속성 컨텍스트의 장점

더보기

1차캐시: 똑같은 걸 두번 조회하는 경우, 처음 조회할 때 해당 데이터를 1차 캐시에 올려 두 번째 조회 시에는 쿼리문을 수행하지않고 캐시에서 가져옴으로서 생산성을 높입니다.

 

동일성 보장: 1차캐시에 이미 있는 엔티티이면 그대로 반환하기때문에 여러 번 조회했을 때 동일성을 보장합니다.

 

트랜잭션을 지원하는 쓰기 지연: 커밋이 되기 전까지는 쿼리문을 쓰기 지연 저장소에 모아뒀다가 커밋하는 시점에 한번에 flush합니다.

 

변경 감지(Dirty Checking): 영속성 컨텍스트가 관리하는 영속 상태 엔티티를 대상으로, 해당 엔티티가 변경되면 update쿼리를 수행해줍니다.

1차 캐시에 처음 저장할 때 동시에 스냅샷 필드를 저장하는데,그 후 commit이나 flush가 일어날 때 엔티티의 현재 값과 스냅샷을 비교하고 변경 사항이 있으면 update 쿼리를 수행하는 것입니다.

 

지연로딩: 예를 들어 1:다의 관계가 있을 때, 1만 확인하고 싶을땐 굳이 다의 데이터까지 가져올 필요가 없다. 이럴때 지연로딩으로 설정해두면 다에관해선 가짜 객체인 프록시를 가져옴으로서 해결합니다. 추후 실제로 조회가 필요할때 실제 엔티티를 가져옵니다.

 

블로그 참조


N+1문제와 해결방법

더보기

n+1문제는 하나의 쿼리를 수행하는데 n개의 쿼리가 더 수행되는것을 뜻합니다.

이 문제를 해결하기 위해선 페치조인을 사용하면 됩니다.

 

블로그 참조 

 

댓글