-
동시성 문제란?/ JSP 지시어, 내장 객체의 간략한 설명TIL(Today I Learned) 2022. 9. 24. 21:44
동시성 문제란?
대략적으로 말하자면 멀티스레드의 전역변수의 특성이 일으키는 문제라고 설명할 수 있습니다. 멀티스레드는 하나의 프로세스에 여러 스레드를 번갈아가며 사용하는 방식입니다. 멀티스레드는 전역변수의 특성을 갖고 있기에 서로의 작업을 공유하고 있습니다 이러한 방식의 장점은 프로세스보다 context switching(작업 전환) 오버헤드가 적어 메모리 리소스가 상대적으로 적다는 것이지요. 하지만 단점도 존재합니다. 멀티스레드의 그 전역변수라는 특성이 하나의 프로세스의 스레드들끼리 같은 자원을 두고 경쟁하게 된다는 겁니다. 그것이 바로 "동시성 문제"입니다.
동시성과 병렬성의 차이
- 동시성
동시성은 실제로 동시에 일을 처리하지는 않고, 동시에 처리하는 것처럼 보일 뿐입니다.
싱글 코어에서 멀티 스레드를 동작시키기 위한 방식으로, 여러개의 스레드를 번갈아가면서 사용합니다.
멀티 스레드 방식은 명확하게 동시성이라고 표현할 수는 없습니다. 작업 전환의 방식을 사용하기 때문이죠. 명확하게 말하자면 물리적으로 같은 시간에 움직이지 않는다고 말할 수 있겠습니다.- 병렬성
실제로 동시에 처리합니다.
멀티 코어에 멀티 스레드 방식입니다. 이러한 방식은 한개 이상의 스레드를 갖고 있는 여러개의 코어가 동시에 실행되는 성질을 의미합니다.
(반대로 싱글 코어는 한개 이상의 스레드를 가진 코어 안에서 스레드의 전환으로 일을 처리하는 방식입니다. 조금 다르죠?)
병렬성의 핵심은 물리적으로 같은 시간에 동시에 실행되는 것입니다. 멀티 코어가 핵심은 아닙니다.지시어(Directive)란?
지시어란 JSP 파일이 Servlet으로 변환되기 위해 필요한 정보를 의미합니다. 여기에서의 필요한 정보란 pageEncoding, cotentType.. 등이 있습니다. 아래에 11가지 속성을 설명해드리겠습니다.
지시어의 기본 구문은 다음과 같습니다 <%@ 지시어 종류 속성="값" 속성="값" ... %>
사용할 수 있는 지시어 종류는 3가지가 있습니다. page, include, taglib
지시자 종류 중 하나인 page의 속성 11가지를 소개해드리겠습니다.
- info : 페이지에 대한 정보를 알려줍니다.
- language : 페이지에서 선언할 스크립팅 언어를 지정합니다(기본 값 : java)
- contentType : 페이지에서 생성될 MIME 타입을 지정합니다. 서버에서 클라이언트로 페이지를 보낼 때 이 값으로 웹페이지를 분류합니다.
MIME 이란? : MIME은 웹 브라우저의 확장자 명이라고 생각하시면 편할 것 같습니다. 보통 어떤 파일을 분류할 때 확장자 명으로 분류하지만 웹 브라우저는 확장자 명이 아닌 MIME으로 분류합니다. 이 MIME은 브라우저가 기본으로 갖춰야할 동작을 설정하는 것입니다. 이러한 분류를 명확히 하기 위해 서버에서 개발자가 명확히 선언해주는 것이 중요합니다. (jsp에서 contentType의 주요 값으로는 text/html이 있겠습니다.)- pageEncoding : jsp 파일 자체의 인코딩입니다. 이 인코딩이 설정이 없거나 잘못 기입되면 jsp를 .java와 .class로 읽어들일 때 중국어 난코드가 발생합니다.
(기본 값 : ISO-8859-1) ISO-8859-1은 영어와 서유럽 문자만 포함하고 있어서 한글이 깨질 수 있기 때문에 UTF-8로 설정합니다.(contentType에서 charset도 마찬가지로 UTF-8로 지정합니다.)- import : 페이지에서 사용할 자바패키지나 클래스를 사용합니다.
- session : session 사용 여부를 등록합니다(기본 : true)
- buffer : 출력버퍼의 크기를 정합니다. 기본 값은 8KB이며 사용하지 않으려면 none으로 설정해줍니다.
출력버퍼란? 출력버퍼란 jsp에서 생성된 결과를 바로 브라우저에 출력하지 않고 출력버퍼에 저장해두었다가 한번에 보내는 공간입니다.
버퍼의 대표적인 사용 예시는 유튜브 스트리밍입니다. 저희가 동영상을 시청할 때 보는 동영상 데이터는 버퍼 형식으로 넘어와서 저희에게 보여집니다. 이러한 까닭에 동영상이 일시적으로 멈추었을 때 버퍼링에 걸린다고 표현하는 것이죠.
출력버퍼의 사용 장점
- 첫번째. 데이터를 한번에 보내는 것이 데이터를 나눠서 보내는 것보다 전송 성능이 유리합니다.
- 두번째. 응답 결과가 바로 보여지지 않기 때문에 JSP 실행 도중 출력버퍼를 지우고 새로운 내용을 보여줄 수 있습니다.이러한 기능으로 인해
forward(페이지 전달)과 에러페이지를 기능을 사용할 수 있게 됩니다. (데이터를 버퍼에 담아놓기 때문에)
- 세번째. 출력버퍼가 다 차기 전까지 헤더 정보를 변경할 수 있다. HTTP의 특성상 응답상태 구조와 함께 헤더정보를 먼저 보내고 출력버퍼에 담긴 값을 보냅니다. 이러한 까닭에 잠시동안 출력버퍼를 수정할 수 있게 되는 것이지요 다른 설명으로는 출력버퍼가 flush(출력버퍼가 꽉차서 비우는 함수)되거나 꽉차서 전송되기 전까지 헤더 정보를 변경할 수 있습니다. 하지만 한번 보내진 출력버퍼의 헤더는 변경할 수 없습니다.
(헤더를 변경할 수 있는 것의 장점이 무엇인지 아시는 분은 댓글 부탁 드립니다!)- autoFlush : 출력버퍼가 모두 채워졌을 때 자동으로 비울지를 등록합니다. 기본 값은 true입니다. 만약 buffer 값이 none일 때, autoFlush 값이 false라면 error가 발생합니다.(왜냐하면 autoFlush의 false의 의미는 버퍼가 다 찼을 때 에러를 발생시키고 작업을 중지시키는 기능인데 buffer가 none이라면 버퍼라는 공간 자체가 없는 것이므로 autoFlush의 false 등록이 의미가 없어집니다.)
- trimDirectiveWhitespace : 지시어 선언으로 인한 공백을 제거할지 여부를 물어봅니다.(기본 값 false)(여기에서 설명하는 공백은 결과가 출력된 브라우저
에서 소스코드보기를 했을 때 지시어 선언 라인이 공백이 되어 출력되는 것을 의미합니다. 이 공백을 제거해주는 기능입니다.)
- errorPage : 에러가 발생했을 때 에러 발생 여부를 보여줄 페이지를 등록합니다.
- isErrorPage : 에러페이지로 등록할 것인지 여부를 물어봅니다.(기본 값 false)(에러가 발생했을 때 에러 코드를 사용자가 보게 되면 신뢰를 잃게 될 수 있습니다.
또한 개발자가 기입한 코드가 에러 코드로 출력되어서 보안상에도 좋지 않습니다. 그래서 에러가 발생했을 때 개발자가 직접 만든 페이지를 보여줄 수 있도록
설정하는 것입니다. 그리고 에러가 발생했을 시 개발자는 로그를 통해 에러의 상세 내용을 확인할 수 있습니다.)
지시어 include는 외부 jsp를 호출할 때 사용합니다.
지시어 taglib는 표현 언어(EL)에서 사용할 자바 클래스나, JSTL을 선언합니다.스크립트릿에서는 메서드를 선언할 수 없습니다. 단지 호출만 가능합니다. 왜냐하면 스크립트릿은 서블릿 실행시(jsp파일을 .class 파일로 변환하는 과정) 생성되는 _jspService() 메소드의 내부에 위치해 있는데, 스크립트릿 안에 메서드를 선언하게 되면 메서드 안에 메서드를 선언하는 것과 같은 것이기 때문에 에러가 발생합니다. 이에 대한 대책으로 만약 jsp 파일에서 메서드를 선언해야 한다면 선언부(<%! %>) 안에 선언하면 됩니다. 이게 가능한 이유는 선언부는 _jspService() 메서드 외부에 위치하기 때문입니다.
JSP 내장 객체(Implicit Object)
JSP의 내장 객체는 _jspService() 메서드 내부에 자동으로 초기화해줍니다.
JSP의 내장 객체의 종류는 총 9가지 입니다.
- request
- response
- session
- page
- application
- out
- pageContext
- config
- exception (java.lang.Throwable) : 예외가 발생한 경우에 사용됩니다.'TIL(Today I Learned)' 카테고리의 다른 글
JSP response 내장 객채(Implicit Object) (0) 2022.09.25 절대 경로와 상대 경로 (0) 2022.09.25 JSP와 Spring framwork의 차이/ 네트워크 통신 간략한 정리 (2) 2022.09.22 JSP 커스텀 태그/웹 프로그램의 전반적인 흐름 (2) 2022.09.20 TIL 55th day (0) 2021.12.17