SlideShare a Scribd company logo
Servlets & JSP
5장
속성과 리스너
• 5장 스터디 범위
초기화 파라미터(1)
• 하나의 서블릿 내에서 계속해서 참조하고자 하는 정보가

있음 (책에서는 admin email을 예시로 제시함)
• DD(=배포서술자) web.xml에서
<servlet>
.... 코드 생략 ....
<init-param>
<param-name>adminEmail</param-name>
<param-value>admin@abc.com</param-value>
</init-param>
</servlet>
초기화 파라미터(2)
• DD(=배포서술자) web.xml에서









• 서블릿 코드에서는
out.println(getServletConfig().getInitParameter("adminEmail"));
<servlet>
.... 코드 생략 ....
<init-param>
<param-name>adminEmail</param-name>
<param-value>admin@abc.com</param-value>
</init-param>
</servlet>
초기화 파라미터(3)
• 아래 코드가 의미하는 바는



• 이미 servletConfig 객체가 가 있다는 뜻이겠죠?
• 이 일은 서블릿이 초기화 될때 -> init(servletConfig) 때 생
성됩니다

out.println(getServletConfig().getInitParameter("adminEmail"));
이를 절차적으로 표현하면
• 1. 컨테이너가 배포서술자를 읽었는데 <init-param> 이 있으면 -> 2.
ServletConfig 인스턴스를 만들어 줍니다(서블릿당 한개씩)



서블릿당 한개씩 == <servlet></servlet> 개수 만큼 인스턴스 생성
• 3. 컨테이너는 <init-param> 내에 있는 이름과 값을 확인한 후
ServletConfig 객체에 저장해 주고
• 4. 이후 컨테이너가 서블릿 클래스 인스턴스를 생성하고
• 5. 생성한 후에 init의 인자로 ServletConfig(=> init(ServletConfig) )

를 진행함으로써 서블릿 초기화 파라미터를 공유할 수 있게 됨
컨텍스트 초기화 파라미터(1)
• 이전 초기화 파라미터를 활용하면 이런것이 가능하겠죠?

<servlet> —- 위 생략 —-
// 메일 관련 servlet
<context-param>
<param-name>MailHelp</param-name>
<param-value>mail_help@naver.com</param-value>
</context-param>
</servlet>
<servlet>
// 카페 관련 servlet
<context-param>
<param-name>CafeHelp</param-name>
<param-value>Cafe_help@naver.com</param-value>
</context-param>
</servlet> —- 아래 생략 —-
컨텍스트 초기화 파라미터(2)
• 근데 만약 한개의 통합된 help 이메일을 제공하고 싶다면?

<servlet> —- 위 생략 —-
// 메일 관련 servlet
<context-param>
<param-name>help_intergrated</param-name>
<param-value>customer_help@naver.com</param-value>
</context-param>
</servlet>
<servlet>
// 카페 관련 servlet
<context-param>
<param-name>help_intergrated</param-name>
<param-value>customer_help@naver.com</param-value>
</context-param>
</servlet> —- 아래 생략 —-
?????????
컨텍스트 초기화 파라미터(3)
• 지금 우리가 생각한것?
어 코드중복이다
한번의 수고로 프로그램을 제어하고 싶다
해결책?? ->> 다음장
• 지금까지 4번 등장한
컨텍스트 초기화 파라미터(4)
컨텍스트 초기화 파라미터
가 답입니다
How To Use
컨텍스트 초기화 파라미터?(5)
• 왼쪽을 오른쪽과 같이 만들어 주면 됩니다
<servlet> —- 위 생략 —-
// 메일 관련 servlet
<context-param>
<param-name>help_intergrated</param-name>
<param-value>customer_help@naver.com</param-
value>
</context-param>
</servlet>
<servlet>
// 카페 관련 servlet
<context-param>
<param-name>help_intergrated</param-name>
<param-value>customer_help@naver.com</param-
value>
</context-param>
</servlet> —- 아래 생략 —-
<context-param> —- 위 생략 —-
<param-name>help_intergrated</param-name>
<param-value>customer_help@naver.com</
param-value>
</context-param>
<servlet>
// 메일 관련 servlet
</servlet>
<servlet>
// 카페 관련 servlet
</servlet> —- 아래 생략 —-
그러면 서블릿에서
컨텍스트 초기화 파라미터에
어떻게 접근하나요? (6)
• 이렇게요
out.println(getServletContext().getInitParameter("adminEmail"));
읭? 뭐가 달라요?
out.println(getServletConfig().getInitParameter("adminEmail"));
out.println(getServletContext().getInitParameter("adminEmail"));
좋은 방법은 아닌것 같지만
전역변수와 지역변수 개념을 활용해
이해해 보면 . . .
어 근데..? 지난학기에
객체지향적으로 프로그래밍 작성하자고
교수님이 말씀하셨는데??
왜 지금까지 String 타입의 이메일 주소만 공유해?
나 객체 공유할래
객체를 공유해 볼까?
• 음 우선 DD에는 문자열 밖에 못들어 간다고 하네?
• 그러면 문자열 받아와서 객체를 생성하게 해주는

어떤 친구를 만들면 되겠다
• 음 우리가 배운 MVC 패턴을 고려할 때 C가 이 역할을 담당
하면 좋을것 같네??
• 좋아 control 역할을 해주는 서블릿을 만들고 그 서블릿이
객체를 만든 후 객체가 공유될 수 있도록 속성에 묶어두게
하면 되겠네?
우왕
너무 좋은 방법이다
나만 믿고 개발하면 됨
따라와
뭔가 잘못된것 같은데
고쳐볼사람?
저요!
서블릿은 자신이 호출 되어야지만
동작할 수 있어요
control 역할을 해줄 서블릿

즉 객체를 만든 후 객체가 공유될 수

있도록 속성에 묶어줄 서블릿이

먼저 호출되지 않으면

문제가 생길것 같아요
그래서 필요한 것이 리스너!
• JSP도 아니고 서블릿도 아닌 어떤 자바객체
• 초기화 목적으로 실행될 어떤 객체
•그것이 바로 리스너
ServletContextListener는
뭐해요?
• 컨텍스트가 초기화 되는 것을 알아 차립니다

(초기화 = 애플리케이션이 배포됨)
• Servlet Context로 부터 컨텍스트 초기화 파라미터를 읽음
• 데이터 베이스 연결을 위한 초기화 파라미터를 사용함
• 컨텍스트가 종료되는것을 알아요
리스너는 어떻게 만들까요?
• 우선 Web.xml에 listener 항목을 추가해 줍니다
<listener>
<listener-class>
com.example.MyServletContextListener
</listener-class>
</listener>
앗! 단 해당 클래스는 반드시 ServletContextListener 인터페이스를
상속받고 있어야 해요
이렇게 말이죠
public class MyServletContextListener implements
ServletContextListener {
public void contextInitialized(ServletContextEvent event){
servletContext sc = event.getServletContext();
String dogBreed = sc.getInitParameter("breed");
Dog d = new Dog(dogBreed);
sc.setAttribute("dog", d);
}
}
이후 그냥 속성에 객체를
속성에 저장해 주면 되요
public class MyServletContextListener implements
ServletContextListener {
public void contextInitialized(ServletContextEvent event){
servletContext sc = event.getServletContext();
String dogBreed = sc.getInitParameter("breed");
Dog d = new Dog(dogBreed);
sc.setAttribute("dog", d);
}
}
그러면 서블릿에서는
어떻게 가져오나요?
public class ListenerTester extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws IOException,
servletException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Dog dog = (Dog) getServletContext().getAttribute("dog");
out.println("Dog's breed is : "+ dog.getBreed());
}
}
getAttribute의 return값은 Object!!!
리스너는 8개가 있다고 해요
• 216페이지를 참조하세요
• 우리는 다시 context 이야기로 돌아가도록 합시다
Context 생존범위는 스레드에
안전하지 못하다고 해요
• 그 이유는 서블릿이 멀티 스레드 기반으로 실행되는데

요청이 동일한 서블릿으로 부터 온 것인지 다른 서블릿으로
부터 온 것인지 알지 못하기 때문이라고 합니다
책에서 보인 예시
• 서블릿1이 A를 10 B를 5로 설정하였다
• 그런데 서블릿2가 와서 A를 7로 바꾸어 놓았다
• 서블릿 1은 A를 불러오면 당연히 10이 return될 것이라 생각
했다
• 하지만 7이 왔다
그림으로
10 5
7
context
그림으로
10 7
context
그림으로
10 5
7
context
보호 중
그림으로
10 5
7
context
보호 중
컨텍스트에 락이 필요
HowTo컨텍스트 락걸기?
public void doGet(어쩌구 저쩌구) throws 어쩌구, 저쩌구 {
... 코드 ...
synchronized(getServletContext()){
getServletContext().setAttribute("foo", "22");
getServletContext().setAttribute("bar", "42");
out.println(getServletContext().getAttribute("foo"));
out.println(getServletContext().getAttribute("bar"));
}
... 코드 ...
}
보호되는 영역
세션도 동기화 문제가
있다고 해요
세션?
하나의 클라이언트와의 대화 상태를 유지하기 위해서 사용
한 시점에 세션에서 작업하는 스레드는 오직 하나
그런데 왜 동기화 문제가 발생?
동일한 클라이언트
하나 이상의 요청
같은 세션에 요청이 들어감
정말 안전한가?
이 문제를 해결하기 위해
public void doGet(어쩌구 저쩌구) throws 어쩌구, 저쩌구 {
... 코드 ...
synchronized(session){
getServletContext().setAttribute("foo", "22");
getServletContext().setAttribute("bar", "42");
out.println(getServletContext().getAttribute("foo"));
out.println(getServletContext().getAttribute("bar"));
}
... 코드 ...
}
아 도데체 어떤 것들이
스레드로 부터 안전한가요?
• Request 속성 및 지역변수
3장 스터디에서 보았던 코드
public void doGet(어쩌구 저쩌구) throws 어쩌구, 저쩌구 {
JSP단으로 보내줄 데이터를 열심히 가공합니다
JSP단으로 보내줄 데이터를 정말 열심히 열심히 가공합니다
... 코드 ...
JSP단으로 보내줄 데이터를 열심히 가공했어요
RequestDispatcher view = request.getRequestDispatcher("result.jsp");
view.forward(request, response);
}
여기에 flush가 들어가면?
public void doGet(어쩌구 저쩌구) throws 어쩌구, 저쩌구 {
JSP단으로 보내줄 데이터를 열심히 가공합니다
JSP단으로 보내줄 데이터를 정말 열심히 열심히 가공합니다
... 코드 ...
JSP단으로 보내줄 데이터를 열심히 가공했어요
os.flush();
RequestDispatcher view = request.getRequestDispatcher("result.jsp");
view.forward(request, response);
}
IllegalStateException
flush() 라는 것은
• 클라이언트에게 응답을 보냈다.
• response를 내려 보내라
• 끝났다 라는 뜻이므로
• 이미 request를 쓸 수 없는 상태가 되어 버렸다
IllegalStateException 발생 원인
Q & A

More Related Content

What's hot

Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
Dong Chan Shin
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
QooJuice
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
JinKyoungHeo
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
Nam Hyeonuk
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
QooJuice
 
Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본
Dong Chan Shin
 
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4
성연 김
 
Effective c++chapter8
Effective c++chapter8Effective c++chapter8
Effective c++chapter8
성연 김
 
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2
성연 김
 
리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
QooJuice
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
Injae Lee
 
디자인 패턴(Observer, visitor)
디자인 패턴(Observer, visitor)디자인 패턴(Observer, visitor)
디자인 패턴(Observer, visitor)
세빈 정
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
Dong Chan Shin
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
Effective c++ 2
Effective c++ 2Effective c++ 2
Effective c++ 2현찬 양
 
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014devCAT Studio, NEXON
 
2016 hack festival igrus
2016 hack festival igrus2016 hack festival igrus
2016 hack festival igrus
Jinookawk
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2현찬 양
 
NDC14 - 사례로 배우는 디스어셈블리 디버깅
NDC14 - 사례로 배우는 디스어셈블리 디버깅NDC14 - 사례로 배우는 디스어셈블리 디버깅
NDC14 - 사례로 배우는 디스어셈블리 디버깅Seungjae Lee
 

What's hot (20)

Effective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshinEffective c++ chapter1 2_dcshin
Effective c++ chapter1 2_dcshin
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약Effective c++ chapter 1,2 요약
Effective c++ chapter 1,2 요약
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본
 
Effective c++chapter4
Effective c++chapter4Effective c++chapter4
Effective c++chapter4
 
Effective c++chapter8
Effective c++chapter8Effective c++chapter8
Effective c++chapter8
 
Effective c++chapter1 and2
Effective c++chapter1 and2Effective c++chapter1 and2
Effective c++chapter1 and2
 
리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
 
effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리effective c++ chapter 3~4 정리
effective c++ chapter 3~4 정리
 
디자인 패턴(Observer, visitor)
디자인 패턴(Observer, visitor)디자인 패턴(Observer, visitor)
디자인 패턴(Observer, visitor)
 
More effective c++ 항목30부터
More effective c++ 항목30부터More effective c++ 항목30부터
More effective c++ 항목30부터
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Effective c++ 2
Effective c++ 2Effective c++ 2
Effective c++ 2
 
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
 
2016 hack festival igrus
2016 hack festival igrus2016 hack festival igrus
2016 hack festival igrus
 
More effective c++ 2
More effective c++ 2More effective c++ 2
More effective c++ 2
 
NDC14 - 사례로 배우는 디스어셈블리 디버깅
NDC14 - 사례로 배우는 디스어셈블리 디버깅NDC14 - 사례로 배우는 디스어셈블리 디버깅
NDC14 - 사례로 배우는 디스어셈블리 디버깅
 

Viewers also liked

자바기초에서 JSP, 스프링, MyBatis까지_ 자바개발자를 꿈꾸는 당신에게..
자바기초에서 JSP, 스프링, MyBatis까지_ 자바개발자를 꿈꾸는 당신에게..자바기초에서 JSP, 스프링, MyBatis까지_ 자바개발자를 꿈꾸는 당신에게..
자바기초에서 JSP, 스프링, MyBatis까지_ 자바개발자를 꿈꾸는 당신에게..
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
HeadFisrt Servlet&JSP Chapter 6
HeadFisrt Servlet&JSP Chapter 6HeadFisrt Servlet&JSP Chapter 6
HeadFisrt Servlet&JSP Chapter 6
J B
 
Servlet&jsp 1장
Servlet&jsp 1장Servlet&jsp 1장
Servlet&jsp 1장JeongBong Kim
 
잘 알려지지 않은 이클립스 팁
잘 알려지지 않은 이클립스 팁잘 알려지지 않은 이클립스 팁
잘 알려지지 않은 이클립스 팁
Kenu, GwangNam Heo
 
뭔지 모르지만 발표
뭔지 모르지만 발표뭔지 모르지만 발표
뭔지 모르지만 발표
Kyoung Up Jung
 
우리는 꿈을 꾸는 개발자들.
우리는 꿈을 꾸는 개발자들.우리는 꿈을 꾸는 개발자들.
우리는 꿈을 꾸는 개발자들.
Lee WonJae
 
HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3
J B
 
HeadFisrt Servlet&JSP Chapter 1
HeadFisrt Servlet&JSP Chapter 1HeadFisrt Servlet&JSP Chapter 1
HeadFisrt Servlet&JSP Chapter 1
J B
 
메이븐파헤치기(김우용)
메이븐파헤치기(김우용)메이븐파헤치기(김우용)
메이븐파헤치기(김우용)
우용 김
 
진민완 포트폴리오
진민완 포트폴리오진민완 포트폴리오
진민완 포트폴리오
민완 진
 
Rainbow Project Web App
Rainbow Project Web AppRainbow Project Web App
Rainbow Project Web App
bingoori
 
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)
DK Lee
 
웹 개발 스터디 01 - HTML, CSS
웹 개발 스터디 01 - HTML, CSS웹 개발 스터디 01 - HTML, CSS
웹 개발 스터디 01 - HTML, CSS
Yu Yongwoo
 
자바 서블릿과 세션 (Java Servlet, Session)
자바 서블릿과 세션 (Java Servlet, Session)자바 서블릿과 세션 (Java Servlet, Session)
자바 서블릿과 세션 (Java Servlet, Session)
Yu Yongwoo
 
JSP 빠르게 시작하기
JSP 빠르게 시작하기JSP 빠르게 시작하기
JSP 빠르게 시작하기
Park JoongSoo
 
자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
DK Lee
 
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
탑크리에듀(구로디지털단지역3번출구 2분거리)
 

Viewers also liked (20)

자바기초에서 JSP, 스프링, MyBatis까지_ 자바개발자를 꿈꾸는 당신에게..
자바기초에서 JSP, 스프링, MyBatis까지_ 자바개발자를 꿈꾸는 당신에게..자바기초에서 JSP, 스프링, MyBatis까지_ 자바개발자를 꿈꾸는 당신에게..
자바기초에서 JSP, 스프링, MyBatis까지_ 자바개발자를 꿈꾸는 당신에게..
 
HeadFisrt Servlet&JSP Chapter 6
HeadFisrt Servlet&JSP Chapter 6HeadFisrt Servlet&JSP Chapter 6
HeadFisrt Servlet&JSP Chapter 6
 
Servlet&jsp 1장
Servlet&jsp 1장Servlet&jsp 1장
Servlet&jsp 1장
 
잘 알려지지 않은 이클립스 팁
잘 알려지지 않은 이클립스 팁잘 알려지지 않은 이클립스 팁
잘 알려지지 않은 이클립스 팁
 
Eclipse web
Eclipse webEclipse web
Eclipse web
 
뭔지 모르지만 발표
뭔지 모르지만 발표뭔지 모르지만 발표
뭔지 모르지만 발표
 
우리는 꿈을 꾸는 개발자들.
우리는 꿈을 꾸는 개발자들.우리는 꿈을 꾸는 개발자들.
우리는 꿈을 꾸는 개발자들.
 
HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3HeadFisrt Servlet&JSP Chapter 3
HeadFisrt Servlet&JSP Chapter 3
 
HeadFisrt Servlet&JSP Chapter 1
HeadFisrt Servlet&JSP Chapter 1HeadFisrt Servlet&JSP Chapter 1
HeadFisrt Servlet&JSP Chapter 1
 
메이븐파헤치기(김우용)
메이븐파헤치기(김우용)메이븐파헤치기(김우용)
메이븐파헤치기(김우용)
 
진민완 포트폴리오
진민완 포트폴리오진민완 포트폴리오
진민완 포트폴리오
 
Rainbow Project Web App
Rainbow Project Web AppRainbow Project Web App
Rainbow Project Web App
 
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)
자바 웹 개발 시작하기 (9주차 : 프로젝트 구현 – 추가적인 뷰)
 
Maven의 이해
Maven의 이해Maven의 이해
Maven의 이해
 
웹 개발 스터디 01 - HTML, CSS
웹 개발 스터디 01 - HTML, CSS웹 개발 스터디 01 - HTML, CSS
웹 개발 스터디 01 - HTML, CSS
 
자바 서블릿과 세션 (Java Servlet, Session)
자바 서블릿과 세션 (Java Servlet, Session)자바 서블릿과 세션 (Java Servlet, Session)
자바 서블릿과 세션 (Java Servlet, Session)
 
JSP 빠르게 시작하기
JSP 빠르게 시작하기JSP 빠르게 시작하기
JSP 빠르게 시작하기
 
자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)자바모델 클래스에 날개를달자_롬복(Lombok)
자바모델 클래스에 날개를달자_롬복(Lombok)
 
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
자바 웹 개발 시작하기 (3주차 : 스프링 웹 개발)
 
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
스프링컨트롤러예외처리,@ExceptionHandler, @ControllerAdvice
 

Similar to HeadFisrt Servlet&JSP Chapter 5

Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1
연우 김
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2
세빈 정
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료
ssuser776e2d
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피
ssuser776e2d
 
Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화
QooJuice
 
Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
Leonardo YongUk Kim
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Javajigi Jaesung
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Dong Chan Shin
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디
quxn6
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summarySehyeon Nam
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
NAVER D2
 
Effective C++ Chapter 1 Summary
Effective C++ Chapter 1 SummaryEffective C++ Chapter 1 Summary
Effective C++ Chapter 1 Summary
SeungYeonChoi10
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
흥배 최
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013devCAT Studio, NEXON
 
[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자
NAVER D2
 
Effective java
Effective javaEffective java
Effective java
Haeil Yi
 
Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2
Injae Lee
 
Basic.pptx
Basic.pptxBasic.pptx
Basic.pptx
Won Jin Do
 
안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기
은아 정
 

Similar to HeadFisrt Servlet&JSP Chapter 5 (20)

Effective C++ Chaper 1
Effective C++ Chaper 1Effective C++ Chaper 1
Effective C++ Chaper 1
 
Effective c++ 1,2
Effective c++ 1,2Effective c++ 1,2
Effective c++ 1,2
 
Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료Sql 중심 코드 탈피 발표자료
Sql 중심 코드 탈피 발표자료
 
Sql 중심 코드 탈피
Sql 중심 코드 탈피Sql 중심 코드 탈피
Sql 중심 코드 탈피
 
Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화
 
Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
 
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 
Effective C++ Chapter 1 Summary
Effective C++ Chapter 1 SummaryEffective C++ Chapter 1 Summary
Effective C++ Chapter 1 Summary
 
About Visual C++ 10
About  Visual C++ 10About  Visual C++ 10
About Visual C++ 10
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
 
[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자
 
Effective java
Effective javaEffective java
Effective java
 
Effective c++ 정리 1~2
Effective c++ 정리 1~2Effective c++ 정리 1~2
Effective c++ 정리 1~2
 
Basic.pptx
Basic.pptxBasic.pptx
Basic.pptx
 
안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기
 

HeadFisrt Servlet&JSP Chapter 5

  • 2. 속성과 리스너 • 5장 스터디 범위
  • 3. 초기화 파라미터(1) • 하나의 서블릿 내에서 계속해서 참조하고자 하는 정보가
 있음 (책에서는 admin email을 예시로 제시함) • DD(=배포서술자) web.xml에서 <servlet> .... 코드 생략 .... <init-param> <param-name>adminEmail</param-name> <param-value>admin@abc.com</param-value> </init-param> </servlet>
  • 4. 초기화 파라미터(2) • DD(=배포서술자) web.xml에서
 
 
 
 
 • 서블릿 코드에서는 out.println(getServletConfig().getInitParameter("adminEmail")); <servlet> .... 코드 생략 .... <init-param> <param-name>adminEmail</param-name> <param-value>admin@abc.com</param-value> </init-param> </servlet>
  • 5. 초기화 파라미터(3) • 아래 코드가 의미하는 바는
 
 • 이미 servletConfig 객체가 가 있다는 뜻이겠죠? • 이 일은 서블릿이 초기화 될때 -> init(servletConfig) 때 생 성됩니다
 out.println(getServletConfig().getInitParameter("adminEmail"));
  • 6. 이를 절차적으로 표현하면 • 1. 컨테이너가 배포서술자를 읽었는데 <init-param> 이 있으면 -> 2. ServletConfig 인스턴스를 만들어 줍니다(서블릿당 한개씩)
 
 서블릿당 한개씩 == <servlet></servlet> 개수 만큼 인스턴스 생성 • 3. 컨테이너는 <init-param> 내에 있는 이름과 값을 확인한 후 ServletConfig 객체에 저장해 주고 • 4. 이후 컨테이너가 서블릿 클래스 인스턴스를 생성하고 • 5. 생성한 후에 init의 인자로 ServletConfig(=> init(ServletConfig) )
 를 진행함으로써 서블릿 초기화 파라미터를 공유할 수 있게 됨
  • 7. 컨텍스트 초기화 파라미터(1) • 이전 초기화 파라미터를 활용하면 이런것이 가능하겠죠?
 <servlet> —- 위 생략 —- // 메일 관련 servlet <context-param> <param-name>MailHelp</param-name> <param-value>mail_help@naver.com</param-value> </context-param> </servlet> <servlet> // 카페 관련 servlet <context-param> <param-name>CafeHelp</param-name> <param-value>Cafe_help@naver.com</param-value> </context-param> </servlet> —- 아래 생략 —-
  • 8. 컨텍스트 초기화 파라미터(2) • 근데 만약 한개의 통합된 help 이메일을 제공하고 싶다면?
 <servlet> —- 위 생략 —- // 메일 관련 servlet <context-param> <param-name>help_intergrated</param-name> <param-value>customer_help@naver.com</param-value> </context-param> </servlet> <servlet> // 카페 관련 servlet <context-param> <param-name>help_intergrated</param-name> <param-value>customer_help@naver.com</param-value> </context-param> </servlet> —- 아래 생략 —- ?????????
  • 9. 컨텍스트 초기화 파라미터(3) • 지금 우리가 생각한것? 어 코드중복이다 한번의 수고로 프로그램을 제어하고 싶다 해결책?? ->> 다음장
  • 10. • 지금까지 4번 등장한 컨텍스트 초기화 파라미터(4) 컨텍스트 초기화 파라미터 가 답입니다
  • 11. How To Use 컨텍스트 초기화 파라미터?(5) • 왼쪽을 오른쪽과 같이 만들어 주면 됩니다 <servlet> —- 위 생략 —- // 메일 관련 servlet <context-param> <param-name>help_intergrated</param-name> <param-value>customer_help@naver.com</param- value> </context-param> </servlet> <servlet> // 카페 관련 servlet <context-param> <param-name>help_intergrated</param-name> <param-value>customer_help@naver.com</param- value> </context-param> </servlet> —- 아래 생략 —- <context-param> —- 위 생략 —- <param-name>help_intergrated</param-name> <param-value>customer_help@naver.com</ param-value> </context-param> <servlet> // 메일 관련 servlet </servlet> <servlet> // 카페 관련 servlet </servlet> —- 아래 생략 —-
  • 12. 그러면 서블릿에서 컨텍스트 초기화 파라미터에 어떻게 접근하나요? (6) • 이렇게요 out.println(getServletContext().getInitParameter("adminEmail")); 읭? 뭐가 달라요? out.println(getServletConfig().getInitParameter("adminEmail")); out.println(getServletContext().getInitParameter("adminEmail"));
  • 13. 좋은 방법은 아닌것 같지만 전역변수와 지역변수 개념을 활용해 이해해 보면 . . .
  • 14. 어 근데..? 지난학기에 객체지향적으로 프로그래밍 작성하자고 교수님이 말씀하셨는데?? 왜 지금까지 String 타입의 이메일 주소만 공유해? 나 객체 공유할래
  • 15. 객체를 공유해 볼까? • 음 우선 DD에는 문자열 밖에 못들어 간다고 하네? • 그러면 문자열 받아와서 객체를 생성하게 해주는
 어떤 친구를 만들면 되겠다 • 음 우리가 배운 MVC 패턴을 고려할 때 C가 이 역할을 담당 하면 좋을것 같네?? • 좋아 control 역할을 해주는 서블릿을 만들고 그 서블릿이 객체를 만든 후 객체가 공유될 수 있도록 속성에 묶어두게 하면 되겠네?
  • 16. 우왕 너무 좋은 방법이다 나만 믿고 개발하면 됨 따라와
  • 17. 뭔가 잘못된것 같은데 고쳐볼사람? 저요! 서블릿은 자신이 호출 되어야지만 동작할 수 있어요 control 역할을 해줄 서블릿
 즉 객체를 만든 후 객체가 공유될 수
 있도록 속성에 묶어줄 서블릿이
 먼저 호출되지 않으면
 문제가 생길것 같아요
  • 18. 그래서 필요한 것이 리스너! • JSP도 아니고 서블릿도 아닌 어떤 자바객체 • 초기화 목적으로 실행될 어떤 객체 •그것이 바로 리스너
  • 19. ServletContextListener는 뭐해요? • 컨텍스트가 초기화 되는 것을 알아 차립니다
 (초기화 = 애플리케이션이 배포됨) • Servlet Context로 부터 컨텍스트 초기화 파라미터를 읽음 • 데이터 베이스 연결을 위한 초기화 파라미터를 사용함 • 컨텍스트가 종료되는것을 알아요
  • 20. 리스너는 어떻게 만들까요? • 우선 Web.xml에 listener 항목을 추가해 줍니다 <listener> <listener-class> com.example.MyServletContextListener </listener-class> </listener> 앗! 단 해당 클래스는 반드시 ServletContextListener 인터페이스를 상속받고 있어야 해요
  • 21. 이렇게 말이죠 public class MyServletContextListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event){ servletContext sc = event.getServletContext(); String dogBreed = sc.getInitParameter("breed"); Dog d = new Dog(dogBreed); sc.setAttribute("dog", d); } }
  • 22. 이후 그냥 속성에 객체를 속성에 저장해 주면 되요 public class MyServletContextListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event){ servletContext sc = event.getServletContext(); String dogBreed = sc.getInitParameter("breed"); Dog d = new Dog(dogBreed); sc.setAttribute("dog", d); } }
  • 23. 그러면 서블릿에서는 어떻게 가져오나요? public class ListenerTester extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, servletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); Dog dog = (Dog) getServletContext().getAttribute("dog"); out.println("Dog's breed is : "+ dog.getBreed()); } } getAttribute의 return값은 Object!!!
  • 24. 리스너는 8개가 있다고 해요 • 216페이지를 참조하세요 • 우리는 다시 context 이야기로 돌아가도록 합시다
  • 25. Context 생존범위는 스레드에 안전하지 못하다고 해요 • 그 이유는 서블릿이 멀티 스레드 기반으로 실행되는데
 요청이 동일한 서블릿으로 부터 온 것인지 다른 서블릿으로 부터 온 것인지 알지 못하기 때문이라고 합니다
  • 26. 책에서 보인 예시 • 서블릿1이 A를 10 B를 5로 설정하였다 • 그런데 서블릿2가 와서 A를 7로 바꾸어 놓았다 • 서블릿 1은 A를 불러오면 당연히 10이 return될 것이라 생각 했다 • 하지만 7이 왔다
  • 31. HowTo컨텍스트 락걸기? public void doGet(어쩌구 저쩌구) throws 어쩌구, 저쩌구 { ... 코드 ... synchronized(getServletContext()){ getServletContext().setAttribute("foo", "22"); getServletContext().setAttribute("bar", "42"); out.println(getServletContext().getAttribute("foo")); out.println(getServletContext().getAttribute("bar")); } ... 코드 ... } 보호되는 영역
  • 32. 세션도 동기화 문제가 있다고 해요 세션? 하나의 클라이언트와의 대화 상태를 유지하기 위해서 사용 한 시점에 세션에서 작업하는 스레드는 오직 하나 그런데 왜 동기화 문제가 발생?
  • 33. 동일한 클라이언트 하나 이상의 요청 같은 세션에 요청이 들어감 정말 안전한가?
  • 34. 이 문제를 해결하기 위해 public void doGet(어쩌구 저쩌구) throws 어쩌구, 저쩌구 { ... 코드 ... synchronized(session){ getServletContext().setAttribute("foo", "22"); getServletContext().setAttribute("bar", "42"); out.println(getServletContext().getAttribute("foo")); out.println(getServletContext().getAttribute("bar")); } ... 코드 ... }
  • 35. 아 도데체 어떤 것들이 스레드로 부터 안전한가요? • Request 속성 및 지역변수
  • 36. 3장 스터디에서 보았던 코드 public void doGet(어쩌구 저쩌구) throws 어쩌구, 저쩌구 { JSP단으로 보내줄 데이터를 열심히 가공합니다 JSP단으로 보내줄 데이터를 정말 열심히 열심히 가공합니다 ... 코드 ... JSP단으로 보내줄 데이터를 열심히 가공했어요 RequestDispatcher view = request.getRequestDispatcher("result.jsp"); view.forward(request, response); }
  • 37. 여기에 flush가 들어가면? public void doGet(어쩌구 저쩌구) throws 어쩌구, 저쩌구 { JSP단으로 보내줄 데이터를 열심히 가공합니다 JSP단으로 보내줄 데이터를 정말 열심히 열심히 가공합니다 ... 코드 ... JSP단으로 보내줄 데이터를 열심히 가공했어요 os.flush(); RequestDispatcher view = request.getRequestDispatcher("result.jsp"); view.forward(request, response); } IllegalStateException
  • 38. flush() 라는 것은 • 클라이언트에게 응답을 보냈다. • response를 내려 보내라 • 끝났다 라는 뜻이므로 • 이미 request를 쓸 수 없는 상태가 되어 버렸다 IllegalStateException 발생 원인
  • 39. Q & A