[스프링MVC]서블릿

allnight5·2023년 7월 27일
0

스프링

목록 보기
59/62

웹서버와 was에 관한 설명
목차
ServletInputStream이용 요청처리
요청 응답
JSP

멀티스레드에 신경쓰지 않아도 WAS가 자동으로 처리해 준다.

톰캣 처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너 라고하며
서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
서블릿 객체를 싱글톤으로 관리한다.
	- 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
    - 공유 변수 사용 주의(member 변수) 
    	-> 이유 여러 스레드가 접근하였을때 처리 속도에 따라
        	값이 달라질 수 있기 때문
    - 서블릿 컨테이너 종료시 함께 종료
JSP도 서블릿으로 변환 되어서 사용
동시 요청을 위한 멀티 쓰레드 처리 지원

Was의 주요 튜닝 포인트는 최대 쓰레드 갯수이다.

  • 너무 낮게 설정했다면 동시요청이 많을때 서버 리소스는 여유가 있지만 클라이언트는 지연대기가 많아질것이다
  • 너무 높게 설정했다면 동시 CUP, 메모리 리소스 임계정 초과로 서버다운이 될정도로 할 수도 있다.

장애 발생시에 대처방법

  • 클라우드라면 서버부터 늘리고 이후에 튜닝하며
  • 클라우드가 아니라면 계속해서 지점을 찾아가며 튜닝하거나 시간이나 이벤트때에 따라 튜닝을 매번 바꿔주면 되며 이벤트 종료하고 다시 이벤트 전으로 되돌리는걸 잊으면 안된다.
  • 싱글톤 객체(서블릿, 스프링 빈) 주의해서 사용(사용되는 멤버변수들을 조심)

웹서버와 was는 분리해서 사용하는 것이 좋고
스레드/쓰레드(Thread)
어플리케이션 코드를 하나하나 순차적으로 실행하며
동시 처리가 필요하면 스레드를 추가로 생성하며 스레드의 형태에는 동시성/병렬성이 있다.(동시성을 같이 처리하는게 아닌 하나씩 번갈아가며 빠르게 처리하는 것이다./병렬성을 동시에 처리하지만 병렬성을 하기 위해서는 코어가 여러개 있어야 한다.)

클래스에 @WebServlet을 넣고 HttpServlet을 상속 받았다면

Jsp 관련 요청 응답

목차로 이동

reponse.getWriter().write("");

요청에 대한 응답으로 해당 html에 wirte의 괄호 안의 내용이 작성된다.
html문으로 길게 보내거나 문자열로 작성 가능하다.

response.getWriter()
.write("<html><body><h1>Hello,  World!
  </h1></body></html>");

이런식으로 보내면
브라우저에 "Hello, World!"라는 제목을 가진 간단한 HTML 페이지를 보내며 사용자에게 해당 내용을 보여주게 된다.

PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<body>);
writer.println("<h1>Hello,  World!</h1>");
writer.println("</body>");
writer.println("</html>");

이런식으로 보내는 방법도 있다.

대신 반환시 주의사항이 있다.

response.setContentType("text/html");
이라고 context-Type 타입지정을 text/html로 지정해서 대상이 html이라는 것을 인식 시켜줘야한다.

하지만 위처럼 보내면 보안상 좋지 못하기 때문에 HTML인코딩, 보안헤더, 애플리케이션 프레임워크를 사용,입력 유효성 검사등을 처리해 주는것이 좋다.

발생할 수 있는 상황

  1. Cross-Site Scripting (XSS) 공격: 위의 코드에서 작성한 내용이 그대로 클라이언트 브라우저로 전송되므로, 악의적인 사용자가 스크립트를 삽입할 수 있습니다. 이는 XSS 공격으로 이어질 수 있으며, 사용자의 브라우저에서 악성 스크립트가 실행될 수 있습니다.
    (alert("안녕하세요! 이것은 경고 메시지입니다."))
    이런 식으로 해당 페이지 접속시 창이 뜨게 하거나 정보를 가져가거나 강제승인등의 상황이 발생 할 수 있다.(대부분의 서버에서 기본적으로 xss 공격을 막고 있으나 매번 새로운 공격이 발생하니 조심하자)

  2. HTML 인코딩 부재: 작성한 내용에 HTML 특수 문자가 포함되어 있다면, 브라우저는 이를 HTML 요소로 해석할 수 있습니다. 이로 인해 원하지 않는 결과가 발생할 수 있습니다.

  3. 보안 정책 위반: 일부 웹 애플리케이션 서버는 보안 정책을 준수하도록 강제할 수 있습니다. 이런 경우에 위의 코드가 문제를 일으킬 수 있습니다.

@ServletComponentScan을 넣어줘야한다.

하는일은

Application의 하위패키지내에 Servlet을 찾아서 자동으로 등록해주는 역할을한다.

ServletInputStream으로 들어오는 요청 문자열 처리하기

목차로 이동
ServletInputStream inputStream = request.getInputStream();
이렇게 하면 들어오는 요청을 바이트 코드로 변환할 수 있다.
이제 이것을 문자열로 변환해서 처리해보자
여러 방법이 있는데
자바에서는
StreamUtils 라는 것을 제공하는데

String message = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
이런식으로 변환할 바이트 코드와 어떤 문자형식으로 변환할것인지 작성해 줘야한다.
UTF-16으로 변환하고 싶다면 UTF_16을 작성해주면 된다. 아니면 다른 형식으로 바꾸고 싶다면 그 형식을 작성해주되 제공해 주지 않는다면 다른 방식으로 처리해야한다.

반대로 문자열을 바이트로 바꿀때도 어떤 형식의 바이트코드로 바꿀것인지 알려줘야한다.

public class User{
private String name;
private String password;
}

JSON형태의 데이터를 파싱해서 사용할수 있는 자바 객체로 변환하려면 Jackson, Gson같은 JSON변환 라이브러리를 추가해야한다.

private ObjectMapper = new ObjectMapper();

(받아올 객체) 변수명 = objectMapper.readValue(message, 받아올 형식의 클래스);
User user = objectMapper.readValue(message, User.class);

User에 @Getter나 public String getName{return this.name;}를 해둔상태라면
String name = user.getName();
name에 User에 보낸 name이 들어가게 된다.

JSP

목차로 이동

자카르타 서버 페이지(Jakarta Server Pages)
-> 이전 자바 서버 페이지(Java Server Pages)

라는 것을 사용할때는 .jar이 아닌 .war의 형태로 패키징 해야한다.

profile
공부기록하기

0개의 댓글