월루를 꿈꾸는 대학생

[MVC-1] 웹 애플리케이션 이해 본문

Programing/Spring Boot

[MVC-1] 웹 애플리케이션 이해

하즈시 2023. 7. 25. 22:55
728x90

웹은 http 기반이고 html, json , image 등 거의 모든 형태의 데이터 전송이 가능
서버간에 데이터 주고 받을 때도 http를 사용

웹서버
  • http 기반 동작
  • *정적 리소스 제공 *
  • 정적 (파일) htmol , css , js , 이미지, 영상 등등
  • nginx , apache

    Uploading file...48p1g
웹 애플리케이션 WAS (Web Application Server)
  • http 기반 동작
  • 웹서버 기능 포함 + 정적 리소스 제공
  • 프로그램 코드 실행해서 애플리케이션 로직 수행 -> 요청온 사용자마다 다르게 표현 가능 프로그래밍 할 수 있으니까
    • 동적 html ,http api (json)
    • 서블릿 , jsp , 스프링 mvc
  • ex ) 톰캣

웹서버와 was 차이

  • 웹서버는 정적 리소스 (파일) / was는 애플리케이션 로직
  • 자바의 경우 서블릿 컨테이너 기능 제공하면 was
  • was는 애플리케이션 코드 실행하는데 특화
웹 시스템 구성 - was ,db
  • was 와 db만으로도 시스템 구성 가능
  • was는 정적 리소스 및 애플리케이션 로직 제공 가능
  • was에서 너무 많은 역할을 담당해버리면 서버가 과부화 될 수 있음
  • 또 우선순위 및 비싼 애플리케이션 로직을 정적 리소스 때문에 실행하기 어려울 수도 있음
  • was가 장애나면 오류 화면도 못봄


그래서 정적 리소스의 경우 웹 서버가 처리하도록 함

웹 시스템 구성 - web ,was ,db
  • 정적 리소스를 앞단에 두고 앞에서 정적은 다 처리함 그 후 동적이 필요하면 웹서버에서 was로 넘겨서 처리하도록 함
  • 중요 처리는 was에 전달

다음과 같이 구성하는 경우 환경에 따라 증설을 할 수 있으니까 효율적으로 리소스 관리가 가능하다

  • 보통 정적 리소스만 제공하는 웹 서버는 안 죽음 -> was, db 장애시 오류화면 제공 가능

서블릿

html form데이터 전송

post 전송

  • 클라이언트로 부터 request 요청을 받으면 http메세지를 만들어서 서버에 전달함

서버에서 처리할 업무는 많음

보면 tcp대기부터 소켓종료까지 엄청나게 많은데 그 중 비즈니스 로직은 단 한 부분밖에 없으니까 저거 하나 하기위해 그 앞에 뒤에 있는 많은 로직을 처리하는 것은 비효율적이다

그래서 비즈니스 로직만 집중할 수 있도록 그 나머지 처리들은 서블릿이 대신해준다

서블릿
@WebServlet(name ="helloServlet", urlPatterns = "/hello")
public calss HellowServlet extends Hrrpservlet{
    @Overrride
    protected void service(HttpServletReqeust request , HttpServletResponse response){
    // 애플리케이션 로직 
    }
}
  • urlPatterns(/hello) url 호출되면 서블릿 코드가 실행이됨!
  • HttpServletRequest : http 요청 정보 편리하게 씀 : 요청정보 파싱등등
  • HttpServletResponse : http 응답 정보 편리하게 씀 : 응답메서지 생성등등
  • HttpServlet만 상속시키면 됨

http 요청시
  1. 리퀘스트가 들어옴
  2. was에서 request , response객체를 새로 만듦
  3. 서블릿 객체를 호출
  4. 서블릿 객체에서 reqeust , response객체를 사용해서 수정 등등함
  5. was에서 response객체에 담긴 데이터를 기준으로 응답을 만들어서 보냄


서블릿 컨테이너가 있는데 이걸 알아서 만들어주고 호출해줌
was가 내려가면 자동 종료

서블릿

서블릿 컨테이너

  • 싱글톤으로 관리
    • 요청 올 때마다 계속 만드는 것은 비효율
    • 최초 로딩 시점에 서블릿 객체 미리 만들고 재활용한다
    • 모든 고객 요청은 동일한 서블릿 객체에 접근함
    • 서블릿 컨테이너 종료할 때 함께 종료됨
    • 공유 변수 사용주의
  • jsp도 서블릿으로 변환되어 사용됨
  • 동시 요청위한 멀티 쓰레드 처리 지원함 : 서버 지원이 10000명 넘게 요청해도 멀티스레드 지원해주니까 개발자는 신경 안써도 오케-

동시 요청 멀티 쓰레드

백엔드는 멀티스레드가 매우 중요함

서블릿을 누가 호출하는가??? -> 스레드

쓰레드
  • 애플리케이션 코드 하나하나 순차적으로 실행
  • 자바 코드의 경우 main 이라는 쓰레드가 처음 실행됨
  • 쓰레드는 한번의 하나의 코드 라인만 수행 => 동시처리가 필요하면 쓰레드 추가생성 필요
하나의 요청 싱글 스레드

요청이 오면 쓰레드 할당시키고 이 쓰레드가 서블릿 연결시킨 후 작업이 끝나면 응답을 보내고 쓰레드도 휴식으로 상태가 변한다

다수의 요청 - 싱글 스레드

요청 1에서 연결이 되고 먼 문제인지 모르겠는데 서블릿이 처리가 느려져서 스레드는 계속 요청1에 할당되고 대기중 근데 그 와중에 요청2가 들어옴 ... 요청2는 쓰레드 하나밖에 없으니까 요청1 끝날 때 까지 스레드 대기
이러면 타임아웃나서 둘 다 죽음 ;;

그래서 그냥 요청마다 스레드 하나 만들어주면 위와 같은 에러가 안남

요청 마다 쓰래드 생성

장점

  • 동시 요청 처리 가능
  • 리소스 허용선까지 처리 가능
  • 하나 안 되도 나머지 친구가 처리 해줌

단점

  • 쓰레드 생성비용은 진짜 비쌈.. 그래서 비효율
  • 쓰레드는 전환할 때 컨텍스트 스위칭 비용이 발생
  • 쓰레드 생성은 제한이 없어서 고객 요청이 엄청 많은 경우 리소스 임계점을 넘어서 서버가 죽음 -> 네고왕?

이런 단점을 어떻게 보완하는가!?

쓰레드 풀

  • 쓰레드 풀을 만들어서 수량을 제한해두고 필요한 요청에 할당하고 다시 반납받음
  • 쓰레드 수가 정해져 있으니 리소스 임계점을 안 넘는다 .
  • 요청이 200개 넘으면 대기를 시키고 그 이상 넘으면 요청 거절 가능
요청마다 쓰레드 생성 단점을 보완

특징

  • 필요한 쓰레드를 풀에 보관하고 관리
  • 쓰레드 최대치 관리 ex 톰캣은 디폴트 최대 200개

사용

  • 쓰레드가 필요하면 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용
  • 사용 종료 시 반납
  • 쓰레드를 200개 다 쓰고 있으면 대기 요청을 하거나 거절 할 수 있음

장점

  • 쓰레드가 미리 생성 되어 있으니까 생성 종료 비용이 절감 및 응답 속도가 빠름
  • 최대치가 있으니까 서버가 죽지 않고 기존 요청을 안전하게 처리가능
실무팁
  • was의 주요 튜닝 포인트는 최대 쓰레드수
  • 최대 쓰레드 수가 너무 낮으면 : 리소스는 여유롭지만 클라이언트는 지연 된다
  • 최대 쓰레드 수가 너무 높으면 : 리소스 임계점 초과로 서버 다운
  • 장애 발생시 클라우드면 서버 늘린 후 튜닝하고 온프레미스면 그냥 튜닝 때리기


못해도 cpu 50%는 써줘야함!!!!

적정 숫자는 어떻게 찾는가???
  • 환경에 따라서 최대 쓰레드 수의 적정치는 다름
  • 성능테스트를 해서 튜닝하는 수 밖에 없음
    • tool : 아파치 ab , 제이미터 , nGrinder

정리

멀티 스레드 부분은 WAS가 처리
보통 개발자는 멀티 쓰레드 관련 코드 신경 안 써도 오케 -> 싱글 쓰레드 프로그래밍 같이 개발하면 됨
멀티 쓰레드 환경이니까 싱글톤 객체 (서블릿, 스프링 빈)은 주의해서 사용하자!!!


HTML ,HTTP API , CSR , SSR

정적 리소스
  • 고정된 html , css , 이미지 파일
  • 서버 저장된 파일 보여주기
html 페이지
  • 동적으로 was가 html 페이지를 로직에 맞게 만들어서 반환
HTTP API
  • 데이터를 주고받음
  • json형식


다양한 시스템 연동

html 데이터 전송 제외 모든 데이터 전송에 사용되는 json

  • ui클라이언트 접점
    • 앱 클라이언트
    • 웹 브라우저
    • vue같은 웹 클라이언트
  • 서버 to 서버
    • 주문 서버 -> 결제 서버
    • 기업간 데이터 통신 - 여러 서버에서 데이터 주고 받을 때
서버사이드 랜더링 , 클라이언트 사이드 랜더링
  1. SSR - 서버 사이드 랜더링
    1. 요청오면 html까지 만들어서 서버가 클라이언트에 전달
    2. 주로 정적 화면
    3. jsp , 타임리프 -- 백쪽
  1. CSR - 클라이언트 사이드 렌더링
    1. html을 자바스크립트를 사용해서 웹 브라우저가 동적으로 생성해서 보여줌
    2. 주로 동적 화면
    3. 구글 지도 , 지메일 , 구글 캘린더 -- 확대 축소해도 웹이 바뀌지 url 바뀌지 앟잖아
    4. vue -- 프론트쪽


내용없는 html을 보내고 그 안에 자바스크립트 링크를 보냄
자바스크립트로 페이지 랜더링함

하아 ,, 프론트까지 해야하네;; 귀찮다 귀찮아;


자바 백엔드 웹 기술 역사

하나의 코드로 빡빡 쓰다가 로직이 길어지니까 화면이랑 비즈니스로직 등등 나눠서 코드를 작성하기로 함!!

결국 최종 승자는
애노테이션 기반 스프린 mvc @Controller등등

출처
https://inf.run/wFfL

728x90