TIL / JAVA 2주차(1) / MVC패턴 / 상속 / HttpServlet / 오버라이드

병아리코더 아카이브·2023년 8월 18일

JAVA

목록 보기
5/20
post-thumbnail

디자인 패턴

디자인 패턴의 정의

  • 설계 문제에 대한 해답문서화 하기 위해 고안된 방법
  • 소프트웨어 개발 과정에서 자주 나타나는 과제해결하기 위한 방법이다.
  • 패턴은 특정한 상황에서 구조적인 문제를 해결하는 방식을 설명 해 준다.

설계를 할 때는 많은 것을 고려 해야 한다. 스스로가 그러한 것들을 다 고려할 수는 없기 때문에 누군가 그런 경험들을 문서로 남겨논 것을 모아논 것이 디자인 패턴 이다.

패턴 사용시 주의 사항

  • 디자인 패턴은 일반적으로 대규모 프로그램 개발에 적합하다.
  • 각 디자인 패턴이 유용한 상황에 대해 잘 알아야 한다.
  • 패턴은 절대적이지 않다 즉, 상황에 맞게 유연하게 변형이 가능하다.
    패턴의 틀에 갇힌 사고방식은 효율성이 낮은 프로그램을 생성한다. 고로 차용한다는 생각으로 접근해야 한다.

MVC 패턴 ( MODEL 2 )

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 한테 전달하는 식으로 체계적이다.

MVC 패턴 실제 예시

  1. JSP 에서 입력받아 넘길 화면을 만들면,
  2. JAVA 의 Controller.java 에서 데이터를 전송받아
  3. Model.java 클래스를 만들어 컨트롤러에서 객체화하여 실질적인 일처리를 할 모델로서 사용한다.


컨트롤러가 View 에게 응답을 해주지 않으면 버튼 클릭 후 흰 화면이 뜨고 대기상태에 들어간다.
이때 View응답을 위해 2가지 방법을 사용한다.

  1. response 활용 : sendRedirect 를 통해 완전히 다른 페이지로 이동하거나, out 객체를 통해 페이지를 다시 그릴 수 있다.
    하지만 response 특징 상 데이터를 실어나를 수 없는 단점이 생긴다.

  2. 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의 값이 보여진다.


상속 (Inheritance)

MVC 구조로 JSP 와 JAVA 를 분리할 수 있다.
(JSP 는 View 의 역할 / JAVA 는 Controller, Model 역할 )
이 때 View(JSP) 에서 Controller(JAVA) 로 내용을 보낼 수 있는 기능이 필요하다.
즉, JSP 에서 하는 서버의 요청받고 응답하는 역할을 JAVA 에서 해야 한다.
이러한 기능을 만들기 위해서는 많은 코드가 필요한데 이 것을 해결하기 위해 상속 을 활용한다.

JSP 파일은 수정 후에도 서버를 끄지 않는데 JAVA 작업을 할 때는 수정 시 서버를 끄고 수정을 다 하고 다시 켜야 잘 작동한다.
( 서버 켜도 수정될 때도 있지만 반영이 되지 않을 때도 있으니 주의 )

상속 (Inherit) 이란?

JAVA 에서는 다른 소스를 가져다 쓰기 위한 두가지 방법이 있다.

  1. 객체화 (Instance)
  2. 상속 (Ingerit)

그 중 상속은 부모의 것을 내 것처럼 사용한다는 개념이다.
부모의 기능을 자식이 사용 할 수 있는 것이다.
즉, 나만 객체화 했는데 부모 메서드 까지 사용이 가능한 것이 상속 이다.

누군가 만들어 놓은 코드를 부품처럼 쓰는 것이 OOP 의 주요 개념이다.

상속을 위해서는 extends 키워드를 사용한다.

여기서는 HttpServlet 을 상속받아 doPost() 메서드 를 이용해 req.getParameter() 로 JSP 에서 보낸 데이터를 받아 변수에 저장하였다.

상속 (Inherit) 특징

  • 부모클래스에서 private, default 접근 제한자를 갖는 멤버는 상속이 제한된다.
    ( private는 클래스 내부만, default는 같은 패키지 밖으로 벗어날 수 없기 때문에 상속에 제한이 걸린다. )
  • 다중 상속을 허용하지 않는다.
  • 상속받은 객체조상의 메서드를 사용할 수 있다.
    자손 객체만 생성해도 조상 클래스까지 이용할 수 있어 사용자 입장에서 몇몇 클래스만 알아도 많은 기능들을 쉽게 사용할 수 있다.
  • 부모클래스의 생성자, 초기화블럭은 상속받지 않는다.
  • 자식클래스의 변경은 부모클래스에 영향을 미치지 않는다.

상속 없이 객체화하여 사용시 그 객체가 어느 객체의 메서드인지 알 수 있어 좋으나,
또한 특정 메서드를 사용하기 위해서는 그 메서드가 어느 클래스에 있어야 하는지 다 알아야 하는 번거로움이 생긴다.

class는 분류체계이다. '나' 를 분류체계로 생각하면 포유류이지만 동시에 조류일 수는 없다.
이와 같이 class 는 한꺼번에 두가지 분류로 나뉠 수 없어서 다중상속이 되지 않는다.


HttpServlet

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

앞서 MVC 패턴을 사용하면서 JSP 에서 하는 서버의 요청받고 응답하는 역할을 JAVA 에서 해야 한다고 하였다. 그래서 서버의 역할과 기능을 하기 위해서는 많은 코드가 필요한데 이 것을 해결하기 위해 상속 을 활용해야 한다고 하였다.

이 때 그 상속받는 것이 바로 HttpServlet 클래스 이다.

HttpServlet 클래스 를 상속 받으면 클래스의 메서드인 doGet() , doPost() 를 오버라이드하여 사용할 수 있다.

HttpServlet 상속 및 오버라이드 방법

  • 상속 : 클래스 생성 시 Superclass(부모클래스) 란의 Browse 클릭 -> HttpServlet 찾아 선택
  • 오버라이드 : alt + shift + s 클릭 -> Override/Implement Methods 클릭 -> doGet, doPost 체크 후 OK

doGet / doPost

  • doGet() : JSP 파일(View)에서 form 태그의 method="get" 으로 요청 시 실행하는 메서드
  • doPost() : JSP 파일(View)에서 form 태그의 method="post" 으로 요청 시 실행하는 메서드

doGetdoPost의 매개변수
HttpServeletRequest 는 JSP의 Request 내장 객체고
HttpSservletResponse 는 JSP의 Response 내장 객체이다.

서버는 시작 시 web.xml 을 먼저 실행한다. 이 때 welcomefile 에 아무것도 없으면
@WebServlet("/") 를 확인하여 404 오류를 띄우지 않는다.

@WebServlet("")

form 태그에서 action="./calc" 을 사용하면 해당 Cotroller.java에 데이터를 전송하겠다는 의미다.
이때 Cotroller.java@WebServlet("/calc") 라고 표시해주면 form 으로 입력받은 데이터 를 받을 수 있다.

urlPatterns


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


알고리즘 문자 파악

#doGet(req:HttpServletRequest, resp:HttpServletResponse):void 의미

  1. doget : 메서드 명
  2. HttpServletRequest req HttpServletResponse resp : 매개변수
  3. void : 메서드 반환 타입
  • # : protected
  • + : pubilc
  • - : private
    (default는 표시 X)
  • 점선 화살표 : 호출
  • 실선 화살표 : 상속

오버라이드 ( Override )

오버라이드 는 부모로부터 상속받는 메서드가 마음에 들지 않아 덮어쓰고 튜닝하는 것이다.
@override 를 했다는 것은 이 메서드를 그대로 사용하지 않겠다는 의미와 같다.

오버라이드와 오버로드

overroadoverride 는 상속관계에서부터 차이가 있다.
override 상속관계에서 일어난다.

  • 오버로드(overroad) : 과적의 의미. 매개변수의 타입과 갯수를 달리 해주면 메서드 명을 동일하게 사용이 가능하다.
  • 오버라이드(override) : 올라타다의 의미. ( 상속받은 기존 기능에 덮어쓰기, 즉 튜닝한다. )

단 읽기 전용인 final 키워드가 있는 메서드 는 변경이 불가능하기 때문에 오버라이드가 불가능 하다

부모 클래스에서 상속받은 메서드는
1. 완전히 다시 덮어쓸 수 있고,
2. 경우에 따라서 부모 것을 사용하거나 덮어쓰거나 할 수 있다.
이때 super.run()super 은 부모 클래스를 의미한다.


etc

  1. 워크스페이스 실행 및 변경시 use this as the ~ 체크하면 워크스페이스가 변경되지 않는 한 이클립스를 실행할 때마다 해당 폴더로 들어가지니 체크하지 말기

  2. 서버 만들 때 JRE 잘못 찍었을 때 수정하는 방법
    1) 서버칸 빈공간 우클릭 new - server 클릭 -> confiqure runtime environments... 클릭
    2) 생성한 서버 체크하고 Edit 클릭

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

0개의 댓글