
문제에 대한 해답을 문서화 하기 위해 고안된 방법과제를 해결하기 위한 방법이다.특정한 상황에서 구조적인 문제를 해결하는 방식을 설명 해 준다. 설계를 할 때는 많은 것을 고려 해야 한다. 스스로가 그러한 것들을 다 고려할 수는 없기 때문에 누군가 그런 경험들을 문서로 남겨논 것을 모아논 것이 디자인 패턴 이다.
대규모 프로그램 개발에 적합하다.절대적이지 않다 즉, 상황에 맞게 유연하게 변형이 가능하다.차용한다는 생각으로 접근해야 한다.JSP 의 Action Tag 에서 useBean 에서 Scriptlet을 최소화할 수단으로 MODEL 1 을 배웠다.
MODEL 1
- Bean 을 이용하여 JAVA CODE 를 일부 분리할 수 있다.
(FirstBean.java 파일 생성해서 데이터들을 java 파일에 저장 )- java 파일에 저장된 데이터들은
<%firstBean.getName()%>,<%firstBean.setName(넣을 값)%>과 같은 메서드로 사용할 수도 있다.<jsp:setProperty name="firstBean" property="name" param="userName"/>와 같이 fristBean 파일의 name 변수에 userName 값을 넣는 것도 가능하다.
MVC 패턴 은 Model 2 버전으로 Model View Controller 의 약자이다.

user -> View -> Controller -> Model -> Controller -> View -> user
고객(user) 가 작업 요청 메일을 보내면(View)
김 팀장(Controller) 가 요청 메일을 받아 박 대리(Model) 에게 일을 시킨다.
박 대리(Model) 는 받은 일을 처리하여 김 팀장(Controller)에게 결과를 보고한다.
김 팀장(Controller) 은 결과를 확인하여 잡업 처리 완료 메일을 쓴다.
고객(user) 이 해당 메일을 확인(View)한다.
View : 유저가 요청하거나 요청한 결과를 보여주는 화면 역할Controller : 요청한 내용을 확인 하여 해당 업무를 수행할 Model 에게 전달하는 역할Model : Controller 에서 받은 요청을 처리 후 반환하는 역할
JSP : 기능 하나 하나가 다 페이지로 구성 되어 있어 뒤죽박죽이다.MVC : 여러 페이지가 Controller.java 에게 요청 -> 컨트롤러는 model.java 한테 전달하는 식으로 체계적이다.
Controller.java 에서 데이터를 전송받아Model.java 클래스를 만들어 컨트롤러에서 객체화하여 실질적인 일처리를 할 모델로서 사용한다.
컨트롤러가 View 에게 응답을 해주지 않으면 버튼 클릭 후 흰 화면이 뜨고 대기상태에 들어간다.
이때 View응답을 위해 2가지 방법을 사용한다.
response 활용 : sendRedirect 를 통해 완전히 다른 페이지로 이동하거나, out 객체를 통해 페이지를 다시 그릴 수 있다.
하지만 response 특징 상 데이터를 실어나를 수 없는 단점이 생긴다.
forward 활용 : request 객체 를 사용하기 때문에 데이터 전송이 가능하다.
1) req.setAttribute("msg", result) 로 보낼 값을 담고
2) RequestDispatcher dis = req.getRequestDispatcher("index.jsp") 이동할 페이지 명시
3) dis.forward(req, resp) request와 response 둘 다 전송

이동된 페이지인 index.jsp 파일에서 전송받은 msg 를 ${}로 출력하면 result의 값이 보여진다.
MVC 구조로 JSP 와 JAVA 를 분리할 수 있다.
(JSP 는 View 의 역할 / JAVA 는 Controller, Model 역할 )
이 때 View(JSP) 에서 Controller(JAVA) 로 내용을 보낼 수 있는 기능이 필요하다.
즉, JSP 에서 하는 서버의 요청받고 응답하는 역할을 JAVA 에서 해야 한다.
이러한 기능을 만들기 위해서는 많은 코드가 필요한데 이 것을 해결하기 위해 상속 을 활용한다.

JSP 파일은 수정 후에도 서버를 끄지 않는데 JAVA 작업을 할 때는 수정 시 서버를 끄고 수정을 다 하고 다시 켜야 잘 작동한다.
( 서버 켜도 수정될 때도 있지만 반영이 되지 않을 때도 있으니 주의 )
JAVA 에서는 다른 소스를 가져다 쓰기 위한 두가지 방법이 있다.
객체화 (Instance)상속 (Ingerit)그 중 상속은 부모의 것을 내 것처럼 사용한다는 개념이다.
부모의 기능을 자식이 사용 할 수 있는 것이다.
즉, 나만 객체화 했는데 부모 메서드 까지 사용이 가능한 것이 상속 이다.
누군가 만들어 놓은 코드를 부품처럼 쓰는 것이 OOP 의 주요 개념이다.
상속을 위해서는 extends 키워드를 사용한다.

여기서는 HttpServlet 을 상속받아 doPost() 메서드 를 이용해 req.getParameter() 로 JSP 에서 보낸 데이터를 받아 변수에 저장하였다.
private, default 접근 제한자를 갖는 멤버는 상속이 제한된다.private는 클래스 내부만, default는 같은 패키지 밖으로 벗어날 수 없기 때문에 상속에 제한이 걸린다. )다중 상속을 허용하지 않는다.상속받은 객체는 조상의 메서드를 사용할 수 있다.자손 객체만 생성해도 조상 클래스까지 이용할 수 있어 사용자 입장에서 몇몇 클래스만 알아도 많은 기능들을 쉽게 사용할 수 있다.생성자, 초기화블럭은 상속받지 않는다. 상속 없이 객체화하여 사용시 그 객체가 어느 객체의 메서드인지 알 수 있어 좋으나,
또한 특정 메서드를 사용하기 위해서는 그 메서드가 어느 클래스에 있어야 하는지 다 알아야 하는 번거로움이 생긴다.
class는 분류체계이다. '나' 를 분류체계로 생각하면 포유류이지만 동시에 조류일 수는 없다.
이와 같이 class 는 한꺼번에 두가지 분류로 나뉠 수 없어서 다중상속이 되지 않는다.

JAVA Pakage 는 최소 3단 구성으로 해놓는 경우가 많다.

앞서 MVC 패턴을 사용하면서 JSP 에서 하는 서버의 요청받고 응답하는 역할을 JAVA 에서 해야 한다고 하였다. 그래서 서버의 역할과 기능을 하기 위해서는 많은 코드가 필요한데 이 것을 해결하기 위해 상속 을 활용해야 한다고 하였다.
이 때 그 상속받는 것이 바로 HttpServlet 클래스 이다.
HttpServlet 클래스 를 상속 받으면 클래스의 메서드인 doGet() , doPost() 를 오버라이드하여 사용할 수 있다.
상속 : 클래스 생성 시 Superclass(부모클래스) 란의 Browse 클릭 -> HttpServlet 찾아 선택
오버라이드 : alt + shift + s 클릭 -> Override/Implement Methods 클릭 -> doGet, doPost 체크 후 OK 
doGet() : JSP 파일(View)에서 form 태그의 method="get" 으로 요청 시 실행하는 메서드doPost() : JSP 파일(View)에서 form 태그의 method="post" 으로 요청 시 실행하는 메서드
doGet과doPost의 매개변수
HttpServeletRequest는 JSP의Request내장 객체고
HttpSservletResponse는 JSP의Response내장 객체이다.
서버는 시작 시
web.xml을 먼저 실행한다. 이 때welcomefile에 아무것도 없으면
@WebServlet("/")를 확인하여404 오류를 띄우지 않는다.
form 태그에서 action="./calc" 을 사용하면 해당 Cotroller.java에 데이터를 전송하겠다는 의미다.
이때 Cotroller.java 에 @WebServlet("/calc") 라고 표시해주면 form 으로 입력받은 데이터 를 받을 수 있다.

와 같이 urlPatterns 을 사용하면 action 의 값이 use 또는 skill 또는 jump 일 경우 모두 포함할 수 있다. urlPatterns 은 값이 여러 개라 배열 { } 로 표시해줘야 한다.

#doGet(req:HttpServletRequest, resp:HttpServletResponse):void 의미
doget : 메서드 명HttpServletRequest req HttpServletResponse resp : 매개변수void : 메서드 반환 타입# : protected + : pubilc- : private점선 화살표 : 호출실선 화살표 : 상속오버라이드 는 부모로부터 상속받는 메서드가 마음에 들지 않아 덮어쓰고 튜닝하는 것이다.
@override 를 했다는 것은 이 메서드를 그대로 사용하지 않겠다는 의미와 같다.
overroad와 override 는 상속관계에서부터 차이가 있다.
override 상속관계에서 일어난다.
오버로드(overroad) : 과적의 의미. 매개변수의 타입과 갯수를 달리 해주면 메서드 명을 동일하게 사용이 가능하다.오버라이드(override) : 올라타다의 의미. ( 상속받은 기존 기능에 덮어쓰기, 즉 튜닝한다. )
단 읽기 전용인 final 키워드가 있는 메서드 는 변경이 불가능하기 때문에 오버라이드가 불가능 하다

부모 클래스에서 상속받은 메서드는
1. 완전히 다시 덮어쓸 수 있고,
2. 경우에 따라서 부모 것을 사용하거나 덮어쓰거나 할 수 있다.
이때 super.run() 의 super 은 부모 클래스를 의미한다.
워크스페이스 실행 및 변경시 use this as the ~ 체크하면 워크스페이스가 변경되지 않는 한 이클립스를 실행할 때마다 해당 폴더로 들어가지니 체크하지 말기
서버 만들 때 JRE 잘못 찍었을 때 수정하는 방법
1) 서버칸 빈공간 우클릭 new - server 클릭 -> confiqure runtime environments... 클릭
2) 생성한 서버 체크하고 Edit 클릭

JRE JAVA 11ver 로 수정 -> cancel 누르고 나오기