day54 🌕

장미·2022년 8월 6일
0

오늘의 성과

목록 보기
54/129

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 섹션 7 수강

+) 22. 08. 13. 정리 추가

섹션 7. 로그인 처리2 - 필터, 인터셉터 수강 완료!!

애플리케이션에서 여러 로직에 공통으로 관심이 있는 것을 공통 관심사(cross-cutting concern)라고 한다.
이러한 공통 관심사는 스프링의 aop로도 해결할 수 있지만, 웹과 관련된 공통 관심사는 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이 좋다. 웹과 관련된 공통 관심사를 처리할 때는 HTTP의 헤더나 URL 정보들이 필요한데, 서블릿 필터나 스프링 인터셉터는 HttpServletRequest를 제공한다.

필터 제한

로그인 사용자
HTTP 요청 ➡️ WAS ➡️ 필터 ➡️ 서블릿 ➡️ 컨트롤러

비로그인 사용자
HTTP 요청 ➡️ WAS ➡️ 필터(적절하지 않은 요청이라 판단, 서블릿 호출 X)

필터를 적용하면 필터가 호출된 다음에 서블릿이 호출된다.

필터 인터페이스

public interface Filter {
	public default void init(FilterConfig filterConfig) throws ServletException {}
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
    public default void destroy() {}
}

필터 인터페이스를 구현하고 등록하면 서블릿 컨테이너가 필터를 싱글톤 객체로 생성하고 관리한다.

  • init(): 필터 초기화 메서드. 서블릿 컨테이너가 생성될 때 호출된다.
  • doFilter(): 고객의 요청이 올 때마다 해당 메서드가 호출된다. 필터의 로직을 구현하는 부분.
  • destroy(): 필터 종료 메서드. 서블릿 컨테이너가 종료될 때 호출된다.

필터를 등록하는 방법은 여러 가지가 있지만, 스프링 부트를 사용한다면 FilterRegistrationBean으로 등록하면 된다.

  • setFilter(new LogFilter()): 등록할 필터를 지정한다.
  • setOrder(1): 필터는 체인으로 동작하기 때문에 순서가 필요하다. 낮을수록 먼저 동작한다.
  • addUrlPatterns("/*"): 필터를 적용할 URL 패턴을 지정한다. 한 번에 여러 패턴을 지정할 수 있다.

스프링 인터셉터 흐름

HTTP 요청 ➡️ WAS ➡️ 필터 ➡️ 서블릿 ➡️ 스프링 인터셉터 ➡️ 컨트롤러

스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장한다.
스프링 인터셉터는 서블릿 필터보다 더 편리하고, 더 다양한 기능을 지원한다.

스프링 인터셉터 인터페이스

public interface HandlerInterceptor {
	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {}
    default void postHandle(HttpServletRequest request, HttpServletResponse response, Object Handler, @Nullable ModelAndView modelAndView) throws Exception {}
    default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object Handler, @Nullable Exception ex) throws Exception {}
}

인터셉터는 컨트롤러 호출 전(preHandle), 호출 후(postHandle), 요청 완료 이후(afterCompletion)와 같이 단계적으로 잘 세분화되어 있다.
서블릿 필터는 단순히 request, response만 제공했으나, 인터셉터는 어떤 컨트롤러(handler)가 호출되는지 호출 정보도 받을 수 있다. 그리고 어떤 ModelAndView가 반환되는지 응답 정보 또한 받을 수 있다.

postHandle, afterCompletion
예외가 발생하면 postHandle은 호출되지 않는다. afterCompletion은 예외가 발생해도 호출되는 것을 보장한다.

인터셉터 등록

  • addInterceptor(): 인터셉터를 등록한다.
  • order(): 인터셉터의 호출 순서를 지정한다. 낮을수록 먼저 호출된다.
  • addPathPatterns(): 인터셉터를 적용할 URL 패턴을 지정한다.
  • excludePathPatterns(): 인터셉터에서 제외할 패턴을 지정한다.

필터와 비교해 보면 인터셉터는 addPathPatterns(), excludePathPatterns()로 매우 정밀하게 URL 패턴을 지정할 수 있다.


커널

+) 22. 08. 27. 추가!! 🔥

커널은 운영체제의 가장 기본이 되는 기능을 실행하는 부분으로, 응용 프로그램이나 주변 장치가 올바르게 작동하도록 통제하고 디스크나 메모리 등의 자원을 배분하거나 응용 프로그램의 실행 등을 처리한다.

- 지형 공간정보체계 용어사전

운영체제는 커널과 시스템 프로그램으로 구분된다. 커널은 운영체제의 핵심부로, 컴퓨터 자원들을 관리하는 역할을 수행한다.

  • 컴퓨터 자원: CPU, 메모리, 파일, 네트워크, 입출력 장치 등

커널의 핵심 기능

  • 프로세스 관리: 프로세스에 CPU를 배분하고 작업에 필요한 환경을 제공한다.

  • 메모리 관리: 프로세스에 작업 공간을 배치하고 실제 메모리보다 큰 가상 공간을 제공한다.

  • 파일 시스템 관리: 데이터를 저장하고 접근할 수 있는 인터페이스를 제공한다.

  • 입출력 관리: 필요한 입력과 출력 서비스를 제공한다.

  • 프로세스 간 통신 관리: 공동 작업을 위한 각 프로세스 간 통신(IPC) 환경을 제공한다.


커널은 항상 컴퓨터 자원만 바라본다. 그렇기 때문에 사용자와의 상호작용은 전혀 지원하지 않는다.
이 때 필요한 것이 바로 시스템 프로그램이다. 대표적인 시스템 프로그램으로는 쉘(Shell)이 있다.
쉘은 사용자가 컴퓨터에게 전달하는 명령을 해석하는 프로그램이다. 즉, 커널과 사용자 간의 다리 역할을 수행한다.
→ 사용자는 쉘을 통해 커널에게 명령을 내릴 수 있다.

커널의 가장 큰 역할은 컴퓨터의 물리적인 자원(하드웨어)과 추상화 자원을 관리하는 것이다.
여기서 추상화란, 하나뿐인 하드웨어를 마치 여러 개인 것처럼 보여지도록 하는 기술을 말한다.

커널은 하나의 하드웨어 자원을 여러 사용자들을 위한 여러 개의 추상화된 객체로 관리한다.
커널이 물리적 자원을 추상화하면 다음과 같이 용어가 달라진다.

물리적 자원 이름 → 추상화한 자원 용어

✔️ CPU → 태스크(Task)
✔️ 메모리(memory) → 페이지(page), 세그먼트(segment)
✔️ 디스크(disk) → 파일(file)
✔️ 네트워크(network) → 소켓(socket)

커널의 5가지 관리자

  • 태스크 관리자: 물리적 자원인 CPU를 추상 자원인 태스크로 제공한다.

  • 메모리 관리자: 물리적 자원인 메모리를 추상 자원인 페이지나 세그먼트로 제공한다.

  • 파일 시스템 관리자: 물리적 자원인 디스크를 추상 자원인 파일로 제공한다.

  • 네트워크 관리자: 물리적 자원인 네트워크 장치를 추상 자원인 소켓으로 제공한다.

  • 디바이스 드라이버 관리자: 각종 외부 장치(프린터, GPU 등)에 대한 접근을 제공한다.


컴퓨터 시스템의 구성

커널 아키텍처에 따른 운영체제의 분류

  • 모놀리식 커널(Monolithic Kernel)
    운영체제의 모든 서비스를 하나의 커널에 구현(DOS, Linux, UNIX 등)

  • 마이크로커널(Microkernel)
    운영체제의 핵심 부분만 커널로 구현(프로세스 관리, 가상 메모리, 기본 프로세스 통신(IPC))
    (Mach OS(Mac OS X에 적용), QNX, Windows NT 등)

명령어 수행 과정에서 CPU는 메모리에 항상 이번에 수행해야 할 instruction의 주소를 건네준 후 instruction과 관련된 데이터나 코드를 받아서 실행한다.
이 과정에서 지금 현재 상태가 유저 모드인지 커널 모드인지 중요하다.
커널 모드의 경우, CPU는 어떠한 영역의 메모리라도 접근하고, 모든 instruction을 실행할 수 있다. 즉, 모든 영역의 접근이 허용된다는 뜻이다.
하지만 유저 모드의 경우, 오직 자신의 메모리 영역(stack, heap, bss, data, text 영역)에만 접근할 수 있다.

→ 이러한 모드를 나눈 이유는, 커널에서 운영체제를 실행시키기 위한 중요한 자원들을 관리하기 때문에 일반 사용자가 접근하지 못하도록 하기 위함이다.

마이크로커널

장점

  • 운영체제의 기능 확장이 쉽다.
  • 새로운 하드웨어로 이식(porting)이 쉽다.
  • 커널 모드에서 동작하는 코드가 적기 때문에 신뢰성이 높다.
  • 보안성이 높다.

단점

  • 사용자 공간과 커널 공간 사이의 빈번한 전환과 통신으로 성능이 저하된다.

커널이 자원을 관리하는 이유는, 사용자가 물리적인 하드웨어에 접근하고 사용할 수 있도록 제공하기 위함이다.
즉, 커널은 사용자가 하드웨어에 접근하고 통신하기 위한 중간 다리 역할을 수행한다고 볼 수 있다.

사용자 → 시스템 프로그램(Shell 등을 사용) → 커널 → 컴퓨터 자원 접근


참고 자료

  1. Su Bak, “(OS) 커널(Kernel)이란?”, https://medium.com/@su_bak/os-%EC%BB%A4%EB%84%90-kernel-%EC%9D%B4%EB%9E%80-b6b8aae8d0b4

  2. console.log('🧏🏻');, “[OS] 커널(kernel)이란 ?”, https://velog.io/@ragnarok_code/OS-%EC%BB%A4%EB%84%90kernel%EC%9D%B4%EB%9E%80

  3. Young Hyun Bae, “03-1 운영체제의 구조”, https://youtu.be/OMjApxyavQ8


내일 인준, 지원 만나서 발표할 거 정리!!!

profile
김뉴비

0개의 댓글

관련 채용 정보