TIL - 0726

서블릿과 스프링 그리고 스프링5

서블릿

  • 리퀘스트에 대한 처리를 동적으로 만들어줄 때 사용하는 자바로 만들어진 API
    • HTTP 한단계 추상화해서 표준화(인터페이스)한 것 : 서블릿을 구현하면 됨
    • 서블릿을 추상화한 것이 스프링 : HTTP > 서블릿 > 스프링
  • 톰캣(WAS) 서버에서 관리됨 : 서블릿의 구현체는 서블릿 컨테이너에서 라이프사이클(컨테이너의 역할)을 관리 - 초기화부터 제거까지
    • 서블릿이라는 표준이 있어서 좋은 점은 서블릿 컨테이너를 다른 것으로 바꿔도 똑같이 동작할 수 있음 : jetty가 있음
    • 톰캣은 HttpServlet을 상속받아야 컨테이너에서 관리하고, 스프링 컨테이너는 POJO를 어노테이션으로 설정하면 관리함 : 스프링과 같이 쓰면 DispatcherServlet 하나만 관리(Front-Controller 패턴, HttpServlet을 상속받고 있음)

스프링5(스프링부트 2.x)

  • 서블릿, Netty 둘다 사용 가능함
    • Netty 라는 또다른 인터페이스 : HTTP 추상화
    • 스프링이 그만큼 객체지향적으로 설계가 되어있어서 HTTP 추상화 구현체를 다른 것으로 사용해도 적용이 가능하다는 것
  • Netty의 좋은점 : non-blocking/Async를 기반으로 MVC 기능을 지원 : 멀티쓰레드가 아니라 싱글쓰레드 기반
    • 대용량 데이터를 다루는, 많은 요청을 다루는 처리(IOT - 잠깐잠깐이지만 많은 요청이 옴)에 대해서는 유리함 : 멀티쓰레드 기반은 요청 당 쓰레드를 점유하는 비용이 있어서, 하나의 쓰레드로 처리하는게
    • 성능상 큰 이점을 보이지 못해서 아직까지 활발하게 사용되지는 못하고 있지만 차츰 공부해서 준비해야겠지? 언제 쓰일지 모르니깐
  • 그렇다면 서블릿 컨테이너를 사용하지 못하는데 WAS 기능은? Netty가 서버 기능까지 함

AOP와 스프링 AOP(Aspect)

서블릿 필터와 인터셉터, Aspect(스프링 AOP)

  • 인프라 로직(기본적으로 들어가는 로직, 비즈니스 로직은 아니지만 서비스에 도움을 주는 로직) 중복을 제거할 수 있음
    • 추가해주거나 제거할 때 각각 해줘야하는 것을 하나로 모을 수 있음
  • AOP 개념임

서블릿 필터(interface Filter)

  • 서블릿 처리 전과 서블릿 처리 후에 대한 처리를 할 수 있음
    • 서블릿 단에서 사용됨
    • 스프링을 사용하면 사용하는 서블릿은 DispatcherServlet만 있음
  • 서블릿 컨테이너에서 관리하고 있기 때문에 스프링 컨테이너에 있는 빈을 알 수 없음 : 인터셉터와의 차이점
    • 예시 : CharacterEncodingFilter - ISO 8859-1이 클라이언트가 보내는(HTTP 메세지) 기본적인 인코딩 형식인데, 한글은 깨지므로 utf-8로 필터링 쉽게 할 수 있게 만들어진 서블릿 필터 (반대로도, 스프링에서 제공하는 서블릿 필터)
  • 서블릿 필터 체인 : 필터를 여러개 이어 붙여 필터링 할 수 있음
  • 서블릿 필터를 스프링빈으로 선언해서 스프링 컨테이너에 등록된 빈을 사용할 수 있게도 할 수 있음
    • 서블릿 필터 똑같은 위치에 있지만, 스프링빈을 사용할 수 있게하려면 해당 방법을 사용하면 됨 : 씨큐리티의 Config 파일

인터셉터

  • 컨트롤러 전 처리 후 처리를 만들 수 있음 : 서블릿 필터와 하는 일은 같음
    • 주의할 것 ! : 컨트롤러는 서블릿이 아니라 스프링 빈(POJO)임
  • 똑같이 전 처리, 후 처리(컨트롤러 전 처리 후 처리)를 할 수 있으나 스프링 컨테이너에서 관리하는 빈(자원)을 사용할 수 있다는 점이 다름

스프링 시큐리티 필터

  • 필터인데, 빈으로 관리하고 있음
    • 스프링 컨테이너의 빈을 사용할 수 있음
  • rememberme 기능 세팅하면 쿠키 expired 기간을 자동 설정할 수 있음
  • 권한 설정 부분에 대한 걸러내는 패턴을 설정할 때 무시하는 것도 만들어야함

AOP

  • 인프라성(시간 체크, 인코딩 형식 변경, 트랜잭션) 로직의 중복을 제거해서 깔끔한 코드를 만드는 것
    • Aspect를 추가해서 전처리 후처리를 깔끔하게 제공할 수 있음
  • 서블릿 필터와 인터셉터는 웹과 관련된 처리를 하고, 그외 라면 Aspect를 만들어서 AOP를 함
  • AOP를 하려면 3요소를 알아야함 - Aspect(3요소의 집합체) : 타겟, 어드바이스, 포인트컷
    • 포인트컷 : @Transactional, 타겟의 위치(묶음)
    • 타켓 : 메소드
    • 어드바이스 : 스프링 라이브러리 어딘가에 위치함
  • weaving(실로 짠다, 꿰다) : 타겟(비즈니스 로직)과 어드바이스(인프라 로직)을 분리해놨다가 포인트컷을 통해 하나로 합칠 수 있음(적용 시킨다는 것)
    • 비즈니스 로직과 인프라 로직을 분리할 수 있어서 코드가 굉장히 깔끔해짐

[프로젝트]spring-security OAuth - JWT

쿠키와 서버 N대 확장

  • 같은 도메인이라면 쿠키가 어느 서버에서 만들어져도 상관없음 : 쿠키에 대한 값을 가져올 수 있으니 각각의 서버는 JWT에 대한 key만 똑같이 가지고 있으면 유효한 JWT라는 것만 알 수 있음
    • 세션의 경우에는 서버에서 데이터를 가지고 있어야하기때문에 상태 동기화나 로드밸런서가 같은 서버만 연결시켜주거나 해야함

자바

DTO

  • 도메인에 비즈니스 로직이 중요한 것이 없다면 DTO를 사용하지않아도 됨