• 이런 결과가 나와서 멀티 쓰레드의 문제가 있다.(Thread1과 Thread2가 동시에 일할 경우)
해결책 :하나의 쓰레드가 작업이 끝나기 전에는 다른쓰레드가 작업할 수
없게 한다. (두 쓰레드가 번갈아 가면서 일을 처리한다.)
* 멀티쓰레드 상황에서의 데이터 동기화(synchronized):하나의 데이터를 한 쓰레드가 접근하면
다른 쓰레드가 그 데이터에 접근 할 수 없게 하는 것
- Local 변수 - Data 동기화 문제 신경쓸 필요 없음(X) - Instance 변수 - Data 동기화 문제 생김 (O) - static 변수 - Data 동기화 문제 생김 (O) - 멀티쓰레드상황에서 문제가 생길 수 있는 static변수는 해결 방법이 없기 때문에 만들면 안된다.(멀티쓰레드 상황에서는 쓰지 않는 것이 좋다.)
/** * Servlet implementation class SearchMemberByIdServlet */ public class SearchMemberByIdServlet extends HttpServlet { private static final long serialVersionUID = 1L;
/** * Servlet implementation class ErrorPronServlet */ public class ErrorPronServlet extends HttpServlet { private static final long serialVersionUID = 1L;
/** * Servlet implementation class ErrorPronServlet */ public class ErrorPronServlet extends HttpServlet { private static final long serialVersionUID = 1L;
- 요청 디스패치(Request Dispatch)방식 - Request(요청)이 살아있는 상태에서 수행을 이동시킨다. - Request Scope를 이용해 데이터(Attribute)를 공유할 수 있다. - RequestDispatcher 객체를 이용해 처리 - 구문 RequestDipatcher rdp = request.getRequestDispatcher("url"); rdp.forward(request, response);
* 값을 공유하되 request scope를 통해 값을 공유해야 할때 요청디스패치 방식을 쓴다.
- 리다이렉트(Redirect)방식 - 응답시 클라이언트에게 요첨할 url을 알려 주어 다시 요청하도록 하는 방식 - 요청과 응답이 한번 더 일어난다. - Request Scope를 이용한 데이터(Attribute) 공유를 할 수 없다. - HttpServletResponse 객체를 이용해 처리 - 구문 response.sendRedirect("url");
* attribute값이 응답하고 나면 필요 없는 데이터라면 request scope를 사용하는 것이 맞다. (request scope는 응답하고 나면 attribute를 자동으로 remove해준다, application scope로 해도 되지만 범위가 좁은 것을 쓰는 것이 좋다.)
request scope : 응답하고 나면 필요 없는 것 데이터
session scope : 응답하고 나면 개인적인 데이터에 저장해 두고 개인만 사용할 것이다.
* 서블릿에서 서블릿이나 jsp로 값을 넘기는 방법
1. 리다이렉트 : 요청과 응답이 두 번 일어 난다. (A로 요청을 하면 A가 응답을 하고 B로 요청을 하면 B가 응답을 한다.)
2. 요청디스패치 : 클라이언트가 요청을 A로 하면 A내부적으로 응답을 B로 넘기고 B가 응답을 한다.(client는 A에게 요청을 했더니 답이 오는 꼴이다.)
/** * Servlet implementation class SaveReqMemberServlet */ public class SaveReqMemberServlet extends HttpServlet { private static final long serialVersionUID = 1L; public SaveReqMemberServlet() {
String id = request.getParameter("id"); String name = request.getParameter("name"); int age = 0; //숫자를 변환 시켜줄때는 반드시 try{}catch{}로 예외처리 해줘라 try{ age=Integer.parseInt(request.getParameter("age")); }catch(NumberFormatException e){} String sex = request.getParameter("sex");
MemberDTO memberDTO = new MemberDTO(id, name, age, sex);