본문 바로가기

Computer Science

[스프링] CS 질문 리스트 정리

반응형
SMALL

 

과거의 공부 기록을 복습하고 정리한다.

 

🗂️ WAS(Web Application Server)와 WS(Web Server)의 차이에 대해 설명해주세요.

역할과 처리하는 내용에 차이가 있습니다.
WAS는 웹 애플리케이션의 비즈니스 로직과 데이터 처리를 담당하고, WS는 정적인 웹 리소스를 서비스합니다.
WAS와 WS는 종종 함께 사용되어 웹 애플리케이션을 제공하는 데 필요한 기능을 모두 제공합니다.

 

✍️ WAS

- 웹 서버(WS)의 기능도 가지면서, 보다 복잡하고 고급 기능을 제공한다.

- Tomcat, PHP 등

 

✍️ WS

- 주로 프록시로 동작하여 요청을 WAS로 전달하거나 로드 밸런싱, 캐시 등의 역할을 수행한다.

- NginX, Apache 등

 


🗂️ 스프링 프레임워크에 대해 설명해주세요.

자바 개발을 편하게 해주는 오픈 소스 프레임워크입니다.
경량 컨테이너로서 자바 객체를 직접 관리하고, 제어의 역전을 통해 애플리케이션의 느슨한 결합을 도모합니다. 또한, 의존성 주입관점지향 프로그래밍을 지원합니다.

 

 

스프링 부트와 스프링 프레임워크의 차이에 대해 설명해주세요.

스프링은 프로젝트 초기에 다양한 환경설정을 해야 하지만,
스프링 부트는 설정의 많은 부분을 자동화하여 사용자가 편하게 스프링을 활용할 수 있도록 합니다. 또한, 내장된 톰캣을 제공하여 서버를 바로 실행할 수 있도록 합니다.

 


🗂️ @RequestBody, @RequestParam, @ModelAttribute의 차이를 설명해주세요.

RequestBody는 HTTP 요청의 Body 내용을 자바 객체로 매핑해주는 어노테이션입니다.
RequeestParam은 클라이언트가 전달하는 값을 핸들러(컨트롤러)의 매개변수로 1:1 매핑하는 어노테이션입니다.
ModelAttribute는 클라이언트가 전달하는 값을 오브젝트 형태로 매핑해주는 어노테이션입니다.

 


🗂️ Spring MVC에 대해 설명해주세요.

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

 

✍️ Model: 데이터 관리 및 비즈니스 로직 처리

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

✍️ Controller: 사용자의 요청을 처리하고 Model과 View를 중개

 

 

MVC는 어떤 흐름으로 요청을 처리하나요?

1. 클라이언트는 URL을 통해 요청을 전송합니다.
2. 디스패처 서블릿은 핸들러 매핑을 통해 해당 요청이 어느 컨트롤러에게 온 요청인지 찾습니다.
3. 디스패처 서블릿은 핸들러 어댑터에게 요청의 전달을 맡깁니다.
4. 핸들러 어댑터는 해당 컨트롤러에게 요청을 전달합니다.
5. 컨트롤러는 비즈니스 로직을 처리한 후에 반환할 뷰의 이름을 반환합니다.
6. 디스패처 서블릿은 뷰 리졸버를 통해 반환할 뷰를 찾습니다.
7. 디스패처 서블릿은 컨트롤러에서 뷰에 전달할 데이터를 추가합니다.
8. 데이터가 추가된 뷰를 반환합니다.

 


🗂️ 제어의 역전(IoC)에 대해 설명해주세요.

제어의 역전은 개발자가 직접 흐름을 제어하는 것이 아니라, 외부의 프레임워크나 라이브러리가 제어 흐름을 대신하게 되는 것입니다. 스프링에서는 객체에 대한 제어권을 IoC 컨테이너가 가지고 있습니다.

 


🗂️ 스프링에서 빈(Bean)을 등록하는 방법에 대해 설명해주세요.

빈을 등록하는 방법은 2가지가 있습니다.
@Component 어노테이션을 사용할 수 있고,
@Configuration 어노테이션을 사용하여 설정 클래스를 만들고, 해당 클래스 안에서 빈으로 등록할 메서드를 만들어 @Bean 어노테이션을 추가하면 자동으로 해당 타입의 빈 객체가 생성됩니다.

 

스프링 빈의 라이프 사이클은 어떻게 관리될까요?

1. 스프링 IoC 컨테이너가 생성됩니다.
2. 스프링 빈이 생성됩니다.
3. 의존관계가 주입됩니다.
4. 초기화 콜백 메서드가 호출됩니다.
5. 빈을 사용할 수 있습니다.
6. 소멸 전 콜백 메서드가 호출됩니다.
7. 스프링이 종료됩니다.

 

✍️ 빈 생명 주기 콜백 관리

- 인터페이스: InitializingBean, DisposableBean

- 메서드 지정: 초기화, 종료

- 어노테이션: @PostConstruct, @PreDestroy

 


🗂️ 의존성 주입(DI)에 대해 설명해주세요.

DI는 필요한 객체를 직접 생성하는 것이 아닌, 외부로부터 객체를 받아서 사용하는 것입니다.
이를 통해 객체 간의 결합도를 줄이고, 코드의 재사용성을 높일 수 있습니다.

 


🗂️ 스프링 필터와 인터셉터에 대해 설명해주세요.

필터는 요청과 응답을 거른 뒤 정제하고,
인터셉터는 작업 전후로 요청이나 응답을 가로채 가공합니다.

 

✍️ 필터: 디스패처 서블릿에 요청이 전달되기 전후에 url 패턴에 맞는 모든 요청에 대해 부가 작업 처리 (Ex. 인증인가 작업, 요청 검사 등)

✍️ 인터셉터: 디스패처 서블릿이 컨트롤러를 요청하기 전후에 끼어들어 요청/응답을 참조하거나 가공 (Ex. 데이터 가공 등)


🗂️ 관점지향 프로그래밍(AOP)에 대해 설명해주세요.

핵심 비즈니스 로직에 있는 공통 관심사항을 분리하여 각각 모듈화하는 것입니다.
중복 코드 제거, 재활용성 극대화, 변화에 용이하다는 장점이 있습니다.
로깅, 트랜잭션 처리 등에 사용됩니다.

 


🗂️ 서블릿(Servlet)에 대해 설명해주세요.

클라이언트의 요청을 처리하고, 그 결과를 반환하는 자바 웹 프로그래밍 기술입니다.

 

 

동작 방식에 대해 설명해주세요.

1. 사용자가 URL을 입력하면 HTTP 요청이 서블릿 컨테이너로 전송됩니다.
2. 요청을 받은 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성합니다.
3. 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾습니다.
4. 해당 서블릿에서 서비스 메서드를 호출한 후 GET, POST 여부에 따라 doGet() 또는 doPost()를 호출합니다.
5. 호출된 메서드는 동적 페이지 생성 후 HttpServletResponse 객체에 응답을 보냅니다.
6. 응답이 끝나면 HttpServletRequest, HttpServletResposne 두 객체를 소멸시킵니다.

 


🗂️ 스프링의 싱글톤 패턴에 대해 설명해주세요.

스프링에서 빈 생성 시 싱글톤 패턴이 적용됩니다.
컨테이너에서 직접 싱글톤 객체를 생성하고 관리하는데, 요청이 들어올 때마다 만들어진 객체를 공유하기 때문에 효율적입니다.

 

 

🗂️ 스프링의 스코프 프로토타입 빈(Scopte Prototype Bean)에 대해 설명해주세요.

싱글톤 빈과 다르게, 컨테이너에게 빈을 요청할 때마다 매번 새로운 객체를 생성하여 반환해주는 것입니다.
빈의 Scope 설정은 어노테이션을 통해 설정할 수 있습니다.

 


🗂️ @Transactional 동작 원리에 대해 설명해주세요.

어노테이션을 메서드 또는 클래스에 명시하면, AOP를 통해 타깃이 상속하고 있는 인터페이스 또는 타깃을 상속한 프록시 객체가 생성됩니다. 프록시 객체의 메서드를 호출하면 타깃 메서드 전후로 트랜잭션이 처리됩니다.

 

 

@Transactional을 스프링 빈의 메서드 A에 적용했고, 해당 빈의 메서드 B가 호출되었을 때, B 메서드 내부에서 A 메서드를 호출하면 어떤 요청 흐름이 발생할까요?

호출된 A 메서드는 프록시로 감싸진 메서드가 아니므로 트랜잭션이 적용되지 않습니다.
타깃 객체의 메서드가 자기 자신과 다른 메서드를 호출할 때는 프록시를 통해 동작하지 않습니다.

 

 

메서드 A가 존재하고, 그 내부에서 로컬 트랜잭션 3개가 존재하는 상황에서, @Transactional을 메서드 A에 적용하면 어떤 요청 흐름이 발생할까요?

기본 설정이라는 가정 하에, 로컬 트랜잭션 3개가 메서드 A의 트랜잭션에 합류됩니다. 즉, 하나의 트랜잭션으로 묶입니다.

 

 

@Transactional에 readOnly 속성을 사용하는 이유에 대해 설명해주세요.

영속성 컨텍스트에서 엔티티를 관리할 필요가 없을 경우, readOnly를 사용하여 메모리 성능을 높일 수 있습니다.
또한, 데이터 변경을 허용하지 않기 때문에 데이터 변경이 없는 로직일 경우 안전성을 높일 수 있습니다.

 

✍️ readOnly 속성이 없다면 영속성 컨텍스트에서 엔티티가 관리되어 1차 캐싱부터 변경 감지까지 수행된다.

 


🗂️ JPA N+1 문제에 대해 설명해주세요.

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

 

 

어떻게 해결할 수 있을까요?

페치조인(Fetch Join)을 사용해 해결할 수 있습니다.
이를 통해 조인된 테이블의 모든 데이터를 한 번에 가져오기 때문에 N+1 문제를 해결할 수 있습니다.

 


🗂️ ORM을 사용하면서 쿼리가 복잡해질 경우 어떻게 해결할 수 있을까요?

QueryDSL을 사용하여 유연한 쿼리를 작성할 수 있게 합니다.
JPA의 경우 JPQL을 사용하여 직접 쿼리를 작성할 수도 있습니다.

 


References

https://okky.kr/questions/990588

https://velog.io/@kwontae1313/%EC%A0%9C%EC%96%B4-%EC%97%AD%EC%A0%84IoC%EA%B3%BC-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85DI

https://dev-coco.tistory.com/95

https://velog.io/@jinyeong-afk/%EA%B8%B0%EC%88%A0-%EB%A9%B4%EC%A0%91-WSWeb-Server%EC%99%80-WASWeb-Application-Server%EC%9D%98-%EC%B0%A8%EC%9D%B4#wsweb-server%EC%99%80-wasweb-application-server%EC%9D%98-%EC%B0%A8%EC%9D%B4

반응형
LIST