스터디

백엔드(Web, Spring) 기술 면접 대비

혜유우 2024. 6. 7. 21:31

WAS와 WS의 차이

WAS는 Web Application Server로 비즈니스 로직을 넣을 수 있으며 대표적인 예시로 Tomcat, PHP 등이 있다.

WS는 Web Server로 비즈니스 로직을 넣을 수 없으며 대표적으로 Nginx 등이 있다.

 

Spring Framework?

스프링 프레임워크는 자바 개발을 편리하게 해주는 오픈소스 프레임워크입니다.

경량 컨테이너로서 자바 객체를 직접 관리하기 때문에 객체의 생성부터 소멸까지 라이프 사이클을 관리합니다.

제어의 역전을 통해 컨트롤러의 제어권이 사용자가 아닌 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출합니다.

의존성 주입을 지원합니다.

관점 지향 프로그래밍(AOP)를 지원하여 트랜잭션이나 로깅, 보안과 같이 공통적으로 사용하는 기능의 경우 해당 기능을 분리해 관리할 수 있습니다.

 

@RequestBody, @RequestParam, @ModelAttribute

@RequestBody는 클라이언트가 전송한 JSON 형태의 HTTP body 내용을 MessageConverter를 통해 Java Object로 변환시켜 줍니다.

@RequestParam은 1개의 HTTP 요청 파라미터를 받기 위해 사용합니다.

@ModelAttribute는 HTTP body 내용과 HTTP 파라미터의 값들을 생성자, Getter, Setter를 통해 주입하기 위해 사용합니다.

 

Spring Boot와 Spring Framework의 차이점을 설명해주세요.

가장 큰 차이점은 Auto Configuration의 차이인 것 같습니다. Spring은 프로젝트 초기에 다양한 환경설정을 해야 하지만,
Spring Boot는 설정의 많은 부분을 자동화하여 사용자가 편하게 스프링을 활용할 수 있도록 돕습니다.

 

Spring MVC

MVC는 Model, View, Controller의 약자로 각 레이어 간 기능을 구분하는데 중점을 둔 디자인패턴입니다.

Model데이터 관리 및 비즈니스 로직을 처리하는 부분이며 (DAO, DTO, Service 등)

View비즈니스 로직의 처리 결과를 통해 유저 인터페이스가 표시되는 구간이며

Controller사용자의 요청을 처리하고 Model과 View를 중개하는 역할을 합니다.

 

MVC가 어떠한 흐름으로 요청을 처리하나요?

DispatcherServlet : 클라이언트에게 요청을 받아 응답까지의 MVC 처리과정을 통제한다.
HandlerMapping : 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정한다.
HandlerAdapter : HandlerMapping에서 결정된 핸들러 정보로 해당 메소드를 직접 호출해주는 역할을 한다.
ViewResolver : Controller의 처리 결과(데이터)를 생성할 view를 결정한다

 

제어의 역전(IoC)

모든 객체에 대한(생성, 라이프사이클 등) 제어권을 개발자가 아닌

컨테이너에게 넘기는 것을 말한다.

관점지향 프로그래밍(AOP)

AOP는 핵심 비즈니스 로직에 있는 인증, 로깅, 트랜잭션 처리와 같은 공통 관심사항을 분리하여 모듈화 하는 것을 의미한다.

중복 코드를 제거하고 재활용성을 극대화한다는 점에서 장점

 

스프링에서 Bean 등록 방법

빈을 등록하는 방법은 어노테이션을 사용하거나 설정 클래스를 만드는 방법이 있습니다.

먼저 @Component 어노테이션을 사용합니다. @Controller, @Service, @Repository는 모두 @Component를 포함하고 있습니다.

두번째로는 설정 클래스를 따로 만들어 @Configuration 어노테이션을 붙이고 

빈으로 등록할 메소드를 만들어 @Bean 어노테이션을 붙여주면 자동으로 빈 객체가 생성됩니다.

 

의존성 주입(DI)

의존성 주입이라는 뜻으로 구성요소간의 의존관계를

내부가 아닌 외부의 설정파일 등을 통해 정의하는 것이다.

따라서 객체간의 결합도를 줄이고 코드의 재사용성을 높일 수 있습니다.

의존성 주입은 생성자 주입, 필드 주입, 세터 주입 3가지가 있습니다. (@Autowired)

그 중에서 생성자를 통한 주입 방법이 Spring에서 가장 권장하는 방법입니다.

그 이유는 순환 참조를 방지하고 불변성을 가질 수 있으며 테스트에 용이하기 때문입니다.

 

스프링 빈의 라이프사이클

컨테이너 생성->빈 등록->의존관계 주입->초기화 콜백 메소드 호출 -> 사용 -> 소멸전 콜백 메소드 호출 -> 스프링 종료

 

빈 생명주기 콜백 관리

3가지 방법이 있다.

1. 인터페이스( InitializingBean, DisposableBean )
2. 설정 정보에 초기화 메소드, 종료 메소드 지정
3. @PostConstruct, @PreDestroy 어노테이션 지원

 

Spring Filter와 Interceptor

필터는 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리되는 것으로 스프링 범위 밖에서 처리된다.

Dispatcher Servlet에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가 작업을 처리할 수 있는 기능을 제공한다.

인터셉터는 스프링 컨텍스트에서 동작하며 Dispatcher Servlet이 Controller를 처리하기 전/후에 인터셉터가 끼어들어

요청과 응답을 참조하거나 가공할 수 있는 기능을 제공

 

Lombok

Lombok은 메소드를 컴파일 하는 과정에 개입해서 추가적인 코드를 만들어낸다.

 

 

VO, BO, DAO, DTO

DAO(Data Access Object)는 DB의 데이터에 접근을 위한 객체(Repository 또는 mapper)

BO(Business object)는 여러 DAO를 활용해 비즈니르 소직을 처리하는 객체(Service)

DTO는 각 계층 간의 데이터 교환을 위한 객체

VO(Value Object)는 실제 데이터만을 저장하는 객체

 

 

대용량 트래픽에서 장애가 발생하면?

스케일 업을 통해 하드웨어 스펙을 향상

스케일 아웃을 통해 서버를 여러대 추가해 시스템을 증가

 

Spring의 싱글톤 패턴

스프링에서 bean 생성시 별다른 설정이 없으면 default로 싱글톤이 적용

스프링은 컨테이너를 통해 직접 싱글톤 객체를 생성하고 관리하는데

요청이 들어올 때마다 매번 객체를 생성하지 않고 이미 만들어진 객체를 공유하기 때문에 효율적인 사용이 가능합니다.

장점 1. static 메소드나 private 생성자 등을 사용하지 않아 객체지향적 개발을 할 수 있다.

2. 테스트하기 편리하다

 

Spring의 스코프 프로토타입 빈

프로토타입 빈은 컨테이너에게 빈을 요청할 때마다 매번 새로운 객체를 생성하여 반환해준다.

 

 

@Transactional의 동작 원리

@Transactional을 메소드 또는 클레스에 명시하면 Proxy 객체가 생성되며

Proxy 객체의 메소드를 호출하면 Target 메소드 전후로 트랜잭션 처리를 수행한다.

프록시는 클라이언트가 타겟 객체를 호출하는 과정에만 동작하며

타겟 객체의 메소드가 자기 자신의 다른 메소드를 호출할 때는 프록시가 동작하지 않는다.

 

@Transactional에 readyOnly 속성을 사용하는 이유?

트랜잭션 안에서 수정/삭제 작업이 아닌 ReadOnly 목적인 경우에 주로 사용하며

영속성 컨텍스트에서 엔티티를 관리 할 필요가 없기 때문에

readOnly를 추가하는 것으로 메모리 성능을 높일 수 있고

데이터 변경 불가능 로직임을 코드로 표시할 수 있어 가독성이 높아진다는 장점이 있다.

 

 

JPA란?

자바 진영의 ORM 기술에 대한 API 표준 명세이다.

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

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

 

영속성 컨텍스트란?

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

영속성 컨텍스트의 생명주기는 트랜잭션과 동일해서 트랜잭션이 종료되면 같이 종료된다.

 

영속성 컨텍스트의 장점?

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

 

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

 

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

 

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

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

 

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

 

 

 

JPA N+1 문제가 발생하는 이유 그리고 해결법

N+1이란 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것을 의미한다.

fetch join을 통해 해결할 수 있다.

n+1 문제가 발생하는 이유는 연관관계를 가진 엔티티를 조회할 때 한 쪽 테이블만 조회하고

연결된 다른 테이블은 따로 조회하기 때문이다.

fetch join을 사용하면 미리 두 테이블을 join하여 한 번에 모든 데이터를 가져오기 때문에

N+1 문제를 막을 수 있다.

 

JPA와 같은 ORM을 사용하면 쿼리가 복잡해지는 경우를 어떻게 해결?

JPQL과 Querydsl을 사용

'스터디' 카테고리의 다른 글

운영체제 기술 면접 대비  (0) 2024.06.08
네트워크 기술 면접 대비  (1) 2024.06.08
데이터베이스 기술 면접 대비  (0) 2024.06.08