24.03.09 (금) 나온 질문 공유
- 웹 서버와 WAS의 기본적인 차이점
- 웹서버는 정적 컨텐츠, WAS는 동적 컨텐츠를 생성하고 비즈니스 로직을 처리
- MSA의 장단점을 설명해주세요
- 장점
- 독립된 서비스 개발 및 배포
- 장애 격리
- 서비스별 스택을 다양하게 가져갈 수 있음
- 단점
- 통합 테스트가 어렵다
- 통신 오버헤드 발생
- 장점
- WAS 만 사용하면 안되는지
- 분리하여 구성했을 때 이점이 명확해서 분리 구성한다.- 서버 부하 방지
- 실제로 대규모 서비스→ 트래픽 분산을 위해 여러 WAS를 둬야함. 로드밸런싱 역할
- 보안 강화 : 웹서버 SSL/TLS 처리 가능, WS, WAS는 다른 포트 사용하므로 WAS에 방화벽쳐서 보안 더 강화할 여지도 있음
- MVC 패턴이 무엇인지 간단하게 설명
- 개념
- View : 사용자가 보는 부분
- Model : 비즈니스 로직 담당
- Controller : 중간을 연결하는 것을 단점
- 장점
- 테스트 용이
- 분리되어 있기 때문에 코드 재사용성 유리
- 유연성과 확장성을 가진다
- 개념
- 서블릿 vs JSP 차이점 설명
- 웹 서버, 웹 컨테이너 → 동적, 정적 처리 가능하며 동적인 처리를 해주는 서버 프로그램 = 서블릿
- 서블릿 : HTML 안에 Java 코드
- JSP → HTML 안에 java 코드 작성
- 서블릿 동작 과정
- MVC 패턴과 모델1과 모델 2의 차이점
- view 와 컨트롤러가 통합됐냐(모델1) 분리됐냐(모델2)의 차이 - MVC 패턴의 단점
- 복잡한 대규모 프로그램의 경우 컨트롤러가 불필요하게 커지는 경우 발생
- 복잡해지면 테스트가 어렵다
- 대안 : 다른 패턴을 사용해라(MVVM)
- MVC 패턴을 사용하는 프레임워크나 라이브러리
- Django, Augular JS - 모놀리식 아키텍처 특징
- 하나로 통합되어 있음
- end-to-end 테스트가 쉬움
- 단순한 구조이기 때문에 초기 개발 용이
[단점]- 모든 것들 빌드 ,배포 해야함
- 하나의 에러가 전체 서버를 죽임
- Apache , Tomcat 멀티스레드인가 멀티 프로세트인가
- 아파치 - 멀티프로세스, 설정에 따라 멀티스레드 같이 사용가능
- 톰캣 - 스레드 풀을 가지고 요청시 스레드를 꺼내서 쓴다
- WAS의 일종인 Tomcat 이름에 Apache Tomcat 풀 네임을 쓰는 이유
- 톰캣이 아파치 기능을 포함하기 때문에 이렇게 부른다 - 스프링 부트는 내장된 서블릿 컨테이너로 아파치 톰캣을 사용한다
스터디 | 웹 2 (웹서버 vs WAS, MSA, Monolithic, MVC 패턴)
- 웹서버 vs WAS (with 서블릿)
- MSA vs Mnolithic
- MVC 패턴
웹서버 vs WAS (with 서블릿) 관련
✅ WS (Web Server) 에 대해 설명해주세요.
ex Apache, Nginx
- HTTP 프로토콜 기반으로 클라이언트에게 정적 컨텐츠 제공하기 위한 서버
- 비즈니스 로직 넣을 수 X
- 사용자의 요청을 가장 먼저 받는다.
- 정적 컨텐츠는 곧장 제공 (WAS 까지 거치지 않고 WS 선에서 바로 자원 제공)
- 동적 컨텐츠 요청은 WAS에 넘기고 그 동적 컨텐츠 응답을 받아 클라이언트에게 전달
✅ WAS (Web Application Server)에 대해 설명해주세요.
ex Tomcat
- DB 조회 혹은 다양한 로직 처리를 요구하는 동적 컨텐츠를 제공하기 위해 만들어진 Application 서버
- 비즈니스 로직 O 로직에 맞게 자원을 생성
- WAS = Web Server + Web Container
✅ WS는 왜 필요한가요 ?
- 웹 서버를 통해 정적 컨텐츠들은 Application Server까지 가지 않고, 앞단에서 빠르게 보내진다.
- 즉, 정적 컨텐츠만 처리 가능하도록 기능 분배하여 서버 부담 줄인다.
- 미리 만들어놓는 건가 ?
✅ WAS는 왜 필요한가요 ?
- 웹 페이지에는 정적, 동적 컨텐츠가 모두 존재한다.
- WS 만 사용하면 원하는 요청에 대한 결과값을 모두 만들어놓아야한다. ???
- 그러면 자원 부족해지는 문제 발생한다.
- 따라서 WAS 를 통해 요청에 맞는 데이터를 DB에서 가져와 비즈니스 로직에 맞춰서 그때 그때 결과를 만들어 제공함으로써 자원을 효율적으로 사용할 수 있게 된다.
✅ WS와 WAS 즉, (Web Server와 Web Application Server) 차이점 설명하시오.
가장 큰 차이점은 ‘동적 컨텐츠를 다룰 수 있는가’ 입니다.
1) 웹 서버는 처리할 수 있는 데이터가 ‘정적 컨텐츠’ (html, css, 이미지) 로 한정됩니다.
2) 반면, 웹 어플리케이션 서버에서는 정적 + 동적 컨텐츠까지도 처리할 수 있습니다.
→ 그 이유는 웹 어플리케이션 서버가 웹 서버에 웹 컨테이너를 붙인 형태이기 때문입니다. 그래서 정적 컨텐츠에 대해서는 WS에서 철하여 응답하고, 동적 컨텐츠일 경우 Web Container로 보내서 동적 컨텐츠에 대한 응답을 해줍니다.
✅ WAS 가 WS 의 기능을 모두 수행하면 안되나 ? WAS만 쓰면 안되나 ?
그렇지 않다. 분리하여 구성했을 때 이점이 명확하기 때문이다.
1) 서버 부하 방지 목적
- WAS가 정적 컨텐츠 요청까지 처리한다면 부하가 커지고 수행 지연이 일어난다.
2) WS에서 여러 대의 WAS를 로드밸런싱 한다.
- 실제 안정적으로 운영되는 웹 서비스 개발을 위해서는 대규모 트래픽에 감당할 수 있도록 ‘고 가용성’ 신경써야 한다.
- 이때 여러 대 WAS에 균등한 트래픽 전송되도록 배분하는 역할을 WS 가 하고, 특정 WAS에 트래픽 가중되거나 운영중에 죽어버린 WAS에 대해 다른 WAS로 분산되도록 할 수 있다.
→ 자원 이용의 효율성 및 장애 극복, 배포 및 유지보수 편의성 위해 둘을 분리하는 게 낫다.
3) 보안 강화
- SSL 에 대한 암호화, 복호화 처리에는 WS(웹 서버) 사용한다.
- 웹 서버와 WAS에 접근하는 포트가 다르기 때문에 WAS에 들어오는 포트에는 방화벽을 쳐서 보안을 강화할 수도 있다.
💡 서블릿, 서븥릿 컨테이너 (=Web Container), 나아가서 Dispatcher Servlet 까지 정리하자.
✅ 서블릿 (Servlet) 에 대해 설명해주세요.
⇒ 서블릭 (Servlet) 이란 ?
- 클라이언트 요청 처리하고 그 결과 반환하는 Servlet 클래스 구현 규칙 지킨 자바 웹 프로그래밍 기술이다.
- WS는 정적인 처리**, WAS는 동적인 처리를 하는데, WAS가 이러한 동적 처리를 할 때 사용하는 서버 프로그램을 ‘서블릿’이라고 한다.**
- 서블릿 존재 전에는 HTTP 요청 메시지를 파싱하는 작업 등 여러 부가 작업을 개발자가 해야해서 개발자가 비즈니스 로직에 온전히 집중하기 어려웠다.
- 서블릿 덕분에 개발자는 실질적인 메인 로직에만 집중할 수 있어졌다.
- Spring MVC에서 Controller로 이용되며, 사용자 요청 받아 처리 후 결과 반환
✅ 서블릿 컨테이너 (=Web Container) 에 대해 설명해주세요.
⇒ Servlet Container = Web Container는 무엇인가 ?
서블릿 컨테이너는 서블릿의 생명주기 관리와 서블릿의 실행 환경을 제공하는 런타임 환경
- 서블릿 컨테이너는 쓰레드 풀에서 쓰레드를 꺼내 할당해주고, HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
- 사용자가 요청한 URL 분석하여 어느 서블릿에 대한 요청인지 찾는다.
- 서블릿 컨테이너에 존재하지 않으면 초기화하고 있다면 가져와서 service() 메소드 호출한다.
- service() 메소드 수행 끝나면 HttpServletResponse 객체에 응답을 보낸다.
- 응답이 완료되면 HttpServletRequest, HttpServletResponse 객체를 소멸시킨다.
✅ 서블릿 컨테이너의 주요 기능은 뭔가요.
- 서블릿 생명주기 관리
- 클라이언트 요청에 따른 서블릿 호출 및 응답 반환
- 멀티 스레드 처리 (여러 클라이언트 요청 동시 처리)
- 세션 관리 (세션 생성, 추적, 제거)
- 보안 관리 (인증, 권한 부여)
- JSP 컴파일 및 생성
cf. 스프링 부트의 서블릿 컨테이너
- 스프링 부트는 내장된 서블릿 컨테이너로 Apache Tomcat을 사용한다.
- 따라서 SPring boot 애플리케이션 실행하면 내부적으로 서블릿 컨테이너 실행되어 웹 어플리케이션을 실행하고 클라이언트의 요청을 처리한다.
✅ 서블릿 생명주기는 무엇인가요 ?
1) init() 메소드
- 서블릿 객체 생성 시 1번만 호출
- 서블릿 초기화 작업 위한 메소드
2) service() 메소드
- 서블릿 객체 이용 시 호출되는 메소드 (즉, 클라이언트 요청할 때마다 호출됨)
- 요청에 대한 응답처리 하기 위한 메소드
3) destroy() 메소드
- 서블릿 객체 소멸 시 1번만 호출
- 서블릿 마무리 작업 위한 메소드
✅ Dispatcher Servlet 은 뭔가요 ?
- Tomcat과 같은 서블릿 컨테이너 통해 들어오는 모든 요청을 제일 앞에서 받는 컨트롤러
- 공통된 작업 처리 후 적절한 세부 컨트롤러로 작업을 위임함
- 각 세부 컨트롤러는 철할 부분은 처리하고 반환할 View를 Dispatcher Servlet에 넘김
✅ Apache(웹 서버 일종)는 멀티 프로세스인가, 멀티 스레드인가 ?
아파치는 기본적으로 멀티 프로세스로 구현되어 있다. 하지만 설정에 따라 멀티 스레드를 같이 운용할 수 있다.
✅ Tomcat (WAS 일종)는 멀티 프로세스인가, 멀티 스레드인가?
톰캣은 요청 처리하기 위한 스레드 풀을 관리하고 있다.
그리고 요청이 들어오면 해당 스레드 풀에서 스레드를 꺼내 요청을 처리하도록 한다.
🎈 근데 왜 Tomcat 이름은 Apache Tomcat 이냐 ?
웹 서버에는 Apache가 있고, WAS 에는 Tomcat 이 있는데, Tomcat의 이름을 Apache Tomcat으로 붙여 쓰는 이유는 2008년에 릴리즈된 Tomcat 5.5버전부터 정적 컨텐츠 처리 기능 추가되었는데, 이 기능이 순수 Apache를 사용하는 것에 비해 성능적 차이가 전혀 없고 Tomcat이 Apache 기능을 포함하게 되었기 때문에 붙여 부른다고 한다.
MSA vs Mnotithic 관련
- 모놀리식 아키텍처와 MSA에 대해 아시나요?
- 두개의 차이는 무엇인가요?
- 어떤 장점과 단점이 존재하나요?
✅ Monolithic Architecture 에 대하여 설명해주세요.
- 애플리케이션 구성 요소가 1개로 되어있는 형태
- 모든 시스템의 구성요소가 한 프로젝트에 통합되어 있는 형태
✅ Monolithic Architecture의 장단점을 설명해주세요.
장점
- End-to-End 테스트 용이 (즉, 끝에서 끝까지 애플리케이션 시작~끝까지의 테스트 비용이 적다
- 개발 초기에는 단순한 구조 때문에 개발 용이하다는 게 장점
단점
- 작은 수정사항에도 전체를 빌드/배포해야 되는 문제
- 한 개의 에러가 전체 서버를 죽이는 문제
- 규모가 커질수록 복잡성 증
✅ MSA (MicrosService Architecture) 에 대하여 설명해주세요.
- Monolithic Architecture의 한계점을 극복하고자 등장
- 애플리케이션 내의 다양한 서비스를 구성 요소화 시켰다.
- MSA는 1개의 시스템을 독립적으로 배포 가능한 각각의 서비스로 분할한다.
- 각각의 서비스느 RESTful API를 통해 데이터를 주고받으며 1개의 큰 서비스를 구성한다.
- 즉, 각 서비스가 독립적이기 때문에 업데이트 용이
✅ MSA (MicrosService Architecture)의 장단점을 설명해주세요.
장점
- 각 도메인 별 서비스 배포 운용 하므로 (결합도 낮아짐)
- 배포가 유연함
- 일부 서비스에 장애 발생해도 전체 서비스에 장애 발생 X
- 각 서비스들은 서로 다른 언어와 프레임워크로 구성 가능
- 재사용성 및 확장성 좋다.
단점
- 서비스가 분리되어 있어, 테스팅이나 트랜잭션 처리가 어렵다.
- 서비스 간 RESTful API로 통신하기 때문에 그에 대한 비용 발생
- 서비스 간 호출이 연속적이라 디버깅 어렵다.
✅ 모놀리식 아키텍처 특징
- Simplicity (심플함) : 한 개의 서비스로 운용하기 때문에 구조는 심플
- Consistency (일관성) : 한 개의 서비스에서 프로세스가 돌아가기 때문에 일관성 유지 가능
- cf. MSA의 경우 다양한 서비스를 통하기 떄문에 일관성 유지 어려울 수 있다.
- Inter-module refactoring (모듈 간 리팩토링) : 한 개의 서비스에서 통신 오가기 때문에 모듈 간 리팩토링 용이
- cf. MSA의 경우 각기 다른 서비스에서의 통신 있기 때문에 상당히 어려운 편
✅ 마이크로서비스 아키텍처 특징
- Partial Deployment (부분 배포) : 서비스가 부품화되어 있어 업데이트 용이
- Availability (가용성) : 자동배포 바탕이 되므로 하루에 새로운 배포 이루어지더라도 서비스는 끊임없이 제공된다.
- Preserve Modularity (모듈성 유지) : 서비스들이 분리되어 있어서 상호모듈 간 영향 X 깨끗한 종속성 갖는다.
- Muliple Platforms (다중 플랫폼, 언어) : 서비스 분리되어 있어서 상황에 맞게 여러 프로그래밍 언어 사용 가능
MVC 패턴 관련
✅ MVC 패턴이란 ?
Model-View-Controller 구조로 아키텍처 설계하기 위한 디자인 패턴이다.
- Model : 비즈니스 로직 처리 (Service, DAO 등)
- View : 사용자 UI
- Controller : Model과 View 사이 잇, 경로별 매핑하는 역할
✅ Spring MVC 란 ?
웹 어플리케이션 개발을 위한 MVC 디자인 패턴 기반의 웹 프레임워크이다.
역시 구성요소는 Model, View, Controller 구조이다.
✅ Spring MVC 구성 컴포턴트
- Dispatcher Servlet : 클라이언트 요청 가장 먼저 받아들이는 서블릿(요청에 맞는 컨트롤러에게 요청 전달)
- Handler Mapping : 해당 요청이 어떤 컨트롤러에게 온 요청인지 검사
- Controller: 클라이언트 요청에 대한 처리 결과는 Dispatcher Servlet에 전달
- ViewResolver : View 이름 통해 알맞은 View 찾음
- View : 사용자에게 보여줄 UI
✅ Spring MVC 작동 원리
- 클라이언트는 URL을 통해 요청 전송
- 디스패처 서블릿은 핸들러 매핑을 통해 해당 요청이 어느 컨트롤러에게 온 요청인지 찾는다.
- 디스패처 서블릿은 핸들러 어댑터에게 요청의 전달 맡긴다.
- 핸들러 어댑터는 해당 컨트롤러에 요청 전달한다.
- 컨트롤러는 처리 결과를 반환할 뷰 이름 반환한다.
- 디스패처 서블릿은 View Resolver를 통해 반환할 뷰 찾는다.
- 디스패처 서블릿은 컨트롤러에서 뷰에 전달할 데이터를 추가한다.
- 데이터가 추가된 뷰를 반환한다.
✅ MVC 패턴 등장 이유 설명해주세요.
세 구성요소로 독립적으로 개발하는 것이 ‘생산성’ 좋기 때문이다.
- 구성요소들의 재사용 가능
- 확장성 증가
- 중복 코드 줄어듬
- 각 요소에 집중하며 개발 가능
✅ MVC 패턴의 모델1과 모델2 차이점을 설명해주세요.
1) MVC 모델 1 : 뷰와 컨트롤러의 역할이 합쳐짐
- JSP가 View와 Controller를 모두 JSP가 담당하는 형태
- 사용자의 요청을 JSP가 받고 Java Bean 호출하여 처리하고 반환
2) MVC 모델 2 : 뷰와 컨트롤러 역할이 분리됨
- JSP 와 Servlet 모두 사용하여, View와 Controller를 분리한다.
- 웹 브라우저의 요청은 컨트롤러가 받고, 모델에서 요청에 대한 결과를 도출한 뒤 컨트롤러가 뷰 선택하여 데이터 전달하면 뷰는 오직 화면 출력만 한다.
1) Model1 은 View와 Controller를 JSP에서 모두 구현하는 구조이다.
- 따라서 클라이언트 요청을 받는 것도 JSP, Model과 상호작용하여 변경된 Model 사용하여 View를 다시 그려내는 것도 JSP이다.
- 즉, 사용자 요청 처리와 응답 처리를 모두 JSP에서 구현하는 구조이다.
2) Model2 는 Model1과 다르게 View와 Controller가 분리된 구조 가진다.
- Controller와 View를 분리함으로써 클라이언트 요청 처리 부분과 응답 처리 부분을 분리하여 각 로직을 독립적으로 수행할 수 있다.
✅ MVC 패턴 규칙 (주의할 점)
1) Model은 Controller와 View 에 의존하지 않아야 한다.
- 즉, Model 내부에 Controller와 View 관련 코드 있으면 안됨 오직 비즈니스 로직 처리에 집중
2) View는 Model에만 의존해야 하고, Controller에는 의존하면 안된다.
- View 내부에 Model의 코드만 있을 수 있고, Controller의 코드가 있으면 안된다.
3) View가 Model로부터 데이터 받을 때는 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야 한다.
4) Controller는 Model과 View에 의존해도 된다.
- Controller 내부에는 Model과 View의 코드 있을 수 있다.
5) View가 Model로부터 데이터 받을 때 반드시 Controller 경유하여 받아야 한다.
✅ 왜 MVC 패턴을 사용해야 하나요 ? | 장점
- 역할 명확히 분리하여 서로 간 결합도 낮출 수 있다.
- 코드 재사용성 및 확장성 높인다.
- 서비스 유지보수 테스트 용이해진다.
- 개발자 간 커뮤니케이션 효율성 높일 수 있다.
✅ MVC 패턴 사용 시 단점은 ? | 단점 및 한계점
프로그램이 복잡하고 대규모화되면 ‘Controller’ 너무 커진다.
개발 유지보수 용이하도록 설계된 모델임에도, 일정 수준 프로그램이 복잡해지면 수정 시 테스트 어렵고 하나의 수정이 다른 부분에 영향을 미치는 역효과도 있을 수 있다.
[MVC 패턴의 한계]
Model과 View가 서로의 정보를 갖고있지 않은 독립적 상태라곤 하지만, Controller를 통해 소통이 이뤄지기 때문에 의존성이 완벽히 분리될 수는 없다.
복잡한 대규포 프로그램의 경우 다수의 View 와 Model이 Controller를 통해 연결되기 때문에 되려 Controller가 불필요하게 커지는 현상이 발생한다. Massive-View-Controller 현상
✅ MVC 패턴의 대안이 있나 ? [대안은 다른 패턴 사용]
- MVVM 패턴 : 뷰와 모델 간 데이터 바인딩 쉽게 구현하고자 할 때, 뷰와 모델 간 의존성 해결하기 위해 MVVM 패턴 사용할 수 있다.
- FLUX 아키텍처 : 복잡한 애플리케이션에서 상태 관리 효과적으로 하고자 할 , Acrion과 상태를 이용하여 예측 가능한 데이터 흐름을 구현하고 자할 때 사용
- Redux 아키텍처 : 상태 관리를 중심으로 구현하고자 할 때 불변성을 강조하여 상태 관리 복잡성을 줄이고자 할 떄 사용
✅ MVC 패턴 사용하는 프레임워크나 라이브러리
→ Spring Framework, Django, Angular JS 등 더 많다.
https://velog.io/@yukina1418/모놀리식-아키텍처와-MSA
https://dev-coco.tistory.com/164
https://mangkyu.tistory.com/95
https://devdange.tistory.com/entry/Web-Model1-Model2-MVC-패턴의-구조와-장단점
https://velog.io/@come_true/WAS와-WS의-차이점
https://medium.com/@heoh06/프론트엔트-기술면접-mvc-패턴-c0639999820a
https://codechasseur.tistory.com/25
'[스터디] CS 기술 면접 준비 > CS_웹 Web 공통' 카테고리의 다른 글
CS 기술 질문 | 웹 1 (OAuth, JWT, CSR과 SSR, Third Party) 관련 [질문 모음] (27) | 2024.02.29 |
---|