ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 웹 애플리케이션 디자인 패턴
    java디자인패턴 2019. 3. 8. 13:32

    디자인 패턴은 프로그램을 개발핼때 사용하는 뼈대 또는 틀이라고 생각하면된다.

    웹에서 서비스를 처리하기 위해 프로그램을 구현할 때 하나의 페이지에서 모두 처리할 수도 있고.

    또는 여러개의 페이지로 나누어서 처리할 수도 있다. 그런데 어떻게 페이지를 나누어서 작업할 것인가는

    디자인패턴에서 정해져있다.

    MVC 디자인 패턴



    MVC 디자인 패턴 기본예제 


    [1] 파일구성


    전체적인 파일구조 

    - Member.jva : JSP빈객체
    - MemberService.java : 회원 서비스 처리 객체
    - MemberDAO.java : 회원 데이터베이스 처리 객체
    - memberInput.jsp : 회원가입 입력 화면 페이지
    - memberOutput.jsp : 회원가입 처리 결과 페이지
    - memberProc.sjp : 회원가입 처리 페이지 
    - memberTable.jsp : member 테이블 생성 페이지 

    위 파일들을 다음과 같은 순서로 실행된다. 





    테이블을 생성하는 memberTable.,jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <%@page import="java.sql.Statement"%>
    <%@page import="java.sql.DriverManager"%>
    <%@page import="java.sql.Connection"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
     
    <% 
        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","scott","tiger");
        Statement stmt = conn.createStatement();
        String sql = "create table member(id varchar2(10) primary key, passwd varchar2(10), name varchar2(10), mail varchar2(20) )";
        
        stmt.executeUpdate(sql);
        out.print("member 테이블이 생성되었습니다");
        stmt.close();
        conn.close();
        
    %>
     
    </body>
    </html>
    cs

    테이블 생성확인


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    C:\Users\MSI>cd ora_work
     
     
     
    C:\Users\MSI\ora_work>sqlplus scott/tiger
     
     
     
    SQL*Plus: Release 11.2.0.2.0 Production on 금 3월 8 12:28:59 2019
     
     
     
    Copyright (c) 19822014, Oracle.  All rights reserved.
     
     
     
     
     
    Connected to:
     
    Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
     
     
     
    SQL> desc member;
     
     Name                                      Null?    Type
     
     ----------------------------------------- -------- ----------------------------
     
     ID                                        NOT NULL VARCHAR2(10)
     
     PASSWD                                             VARCHAR2(10)
     
     NAME                                               VARCHAR2(10)
     
     MAIL                                               VARCHAR2(20)
     
     
     
    SQL>
    cs


    값을 바인딩할 목적으로 사용하는 Memver.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package com.edu.beans;
     
    public class Member {
        private String id;
        private String passwd;
        private String name;
        private String mail;
        
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getPasswd() {
            return passwd;
        }
        public void setPasswd(String passwd) {
            this.passwd = passwd;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getMail() {
            return mail;
        }
        public void setMail(String mail) {
            this.mail = mail;
        }
        
        
    }
     
    cs


    가입페이지 memeberInput

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h3>회원 가입</h3>
        
        <form action="memberProc.jsp">
            ID: <input type="text" name="id"><br>
            비밀번호 : <input type="password" name="passwd"><br>
            이름  : <input type="text" name="name"><br>
            E-mail : <input type="text" name="mail"><br>
            
            <input type="submit" value="가입">    
        </form>
            
    </body>
    </html>
    cs

    출력 페이지 memberOutput

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <h3>회원 가입이 완료 되었습니다.</h3>
    </body>
    </html>
    cs

    가입버튼을 누르면 실행되는 memberProc.jsp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <%@page import="com.edu.biz.MemberService"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <%
        request.setCharacterEncoding("UTF-8");
    %>
     
    <jsp:useBean id="member" class="com.edu.beans.Member"/>
    <jsp:setProperty property="*" name="member"/>
     
    <%
        MemberService service = new MemberService();
        service.memberInsert(member);
        
        RequestDispatcher rd = request.getRequestDispatcher("memberOutput.jsp");
        rd.forward(request,response);
    %>
     
    </body>
    </html>
    cs

    회원에 관한 서비스를 담당하는 memberService.java


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    package com.edu.biz;
     
    import com.edu.beans.Member;
    import com.edu.dao.MemberDAO;
     
    public class MemberService {
        MemberDAO dao = new MemberDAO();
        
        public void memberInsert(Member mebmer) {
            dao.insertMember(member);
        }
    }
     
    cs


    MemberDAO는 회원에 관한 데이터베이스 처리를 담당하기 위해 만든 클래스 



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    package com.edu.dao;
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
     
    import com.edu.beans.Member;
     
    public class MemberDAO {
     
        public Connection getConnection() {
            Connection conn = null;
            
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
                conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe""scott","tiger");
                
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            
            
            return conn;
        }
        
        
        public void insertMember(Member member) {
                Connection conn = this.getConnection();
                try {
                    PreparedStatement pstmt = conn.prepareStatement("insert into member values (?,?,?,?)");
                    
                    pstmt.setString(1, member.getId());
                    pstmt.setString(2, member.getPasswd());
                    pstmt.setString(3, member.getName());
                    pstmt.setString(4, member.getMail());
                    pstmt.executeUpdate();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
        }
        
    }
     
    cs


    memberInput.jsp에서 회원가입을 한후 테이블을 확인한다.


    ID                   PASSWD               NAME                 MAIL

    -------------------- -------------------- -------------------- ----------------------------------------

    user1                1111                 firstman             first@naver.com


    MVC

    MVC는 패턴은 애플리케이션을 세가지영역 , 

    모델 뷰 컨트롤러 구분하여 작업을 분리함으로 서로간의 결합도를 최소화 하고 유지보수성도 높이며 

    개발자들이 각각 맡은 영역에만 집중하게 하여 개발의 효율성을 극대화 할수 있는 장점이 있다.



    [1]뷰

     클라이언트가 보는 화면 요청이 일어나가 처리된 결과를 보여주는 페이지

    [2] 컨트롤러

    컨트롤러는뷰에서 클라이언트가 서비스를 요청 했을때 실행되는 페이지이다. 

    컨트롤러는 다음과 같은 기능을 처리

    1. 뷰에서 들어온 요청을 받음
    2. 클라이언트가 전달한 파라미터를 추출
    3. 파라미터 유효성 검사 실패하면 뷰로 이동
    4. 서비스  객체의 메소드를 호출하여 파라미터 서비스 객체로 전달
    5. 출력 뷰 페이지로 이동.

    [3] 모델 (Model)

    두가지 가 있다 서비스처리를 담당하는 Service 다른 하나는 데이터베이스 처리를 담당하는  DAO 객체

    Serivce 객체

    서비스를 처리하기 위한 내용으로만 구현된 객체를 Business객체라고한다.
    모델의 하나이며 일반 자바로 작성 
    평범한 일반자바를 POJO라고 부른다 모델을 개발할때 POJO로 개발한다고 한다.

    DAO 객체

    데이터배이스처리에 관한 기능으로만 구성되는 객체를 DAO(Data Access Object)객체라고 하며 MVC 패턴
    모델 중 하나이다.
    DAO 객체도 POJO로 작성한다.


    3계충 아키텍처

    웹 애플리케이션을 개발할때 디자인패턴은 MVC
    구조적인 측명에서는 3계층 아키턱쳐를 사용한다.

    뷰와 컨트롤러가 있는 영역을 프레젠테이션계층

    실제 요청된 서비스를 처리하는 비즈니스로직이 구현된 영역을
    비즈니스 계층

    데이터베이스에 대한 처리를 하는 영역을
    영속 계층으로 구분하영 구현하는 것을 의미.



    프레임워크


    3계층 아키텍처 구조는 구성요소간의 관계를 만드는 책임이 전적으로 개발자에게 있지만
    프레임워크는 이미 그 틀이 객체지향적으로 구현되어 있어서 별도로 노력하지 않아도 된다.
    따라서 개발자들이 일일이 구현하지 않고 기존에 프레임워크에서 제공하느 기능을 그대로 사용하기만 하면
    간단하게 해결 할 수있다. 이것이 프레임워크를 사용 했을때 최대의 장점이다.

    프레임워크의 정의와 장단점


    프레임워크에서 원하는 모양대로 조각을 만들어서 끼워맞추면 완성품이됨
    프레임 워크에 끼우는 조각들을 실제로는 하나의 페이지이며 , 작성된 페이지를 프레임 워크에 끼우는 동작이 일반적으로 
    XML 파일의 설정으로 이루어짐


    [1]프레임워크의 장점


    개발기간 단축 

     애플리케이션 개발에 필요한 기능들을 미리 구현하여 라이브러리 파일로 제공한다. 
    따라서 개발자가 필요한 기능을 구현할 필요없이 프레임워크에서 제공하는 라이브러리를 가져다 사용만하면 되므로 빠르고 간편하게
    개발 할 수 있다.


    성능향상

    대부분의 프레임워크는 검증된 효율적인 아키텍처와 설계를 사용하고 있어서 개발자가 의도하지 않아도 
    프레임워크에서 제공하는 아키텍처에 따르게 됨 
    개발자의 낮은 개발능력또한 프레임워크에서 내부적으로 사용하는 고급수준의 코딩패턴을 그대로 사용하게 되면
    자연적으로 해결 
    고급개발자와 초급개발자의 능력차이를 어느정도 해결가능

    유지 보수성 향상

    일정한 아키텍처를 사용하므로 개발 및 유지 보수 담당자가 변경되더라도 업무 파악을 빠르게 할 수있다.
    일반적으로 유지보수를 고려하여 설계되므로 변경이 발생 했을때 작업을 최소화 할 수있다.

    [2] 프레임워크의 단점


    프레임워크 학습필요 

    높은 수준의 설계와 기능을 제공하는 프레임 워크 일수록 학습시간이 많이 소요된다.

    프레임워크 선택 어려움

    검증된 프레임 워크의 선택이 필요

    유연성 부족

    프레임워크에서 지원하지 않는기능은 대처하기 어렵다
    프레임워크의 유연성이 좋을수록 좋은 프레임워크라고 한다.


    프레임워크의 종류

    프레임워크는 3계층 아키텍처 각영역 별로 존재한다.
    프레젠테이션을 구성하는 뷰와 컨트롤러 기능을 제공하는 프레임워크 ,비즈니스 계층을 구성하는 
    클라이언트의 요청에 대하여 실제 서비스를 처리하는 기능을 제공하는 프레임워크
    영속 계층을 구성하는 데이터베이스의 데이터를 생성, 추출, 수정, 삭제하는 기능을 제공하는 프레임워크가 있다.


    [1] 프레젠테이션 프레임워크
    - 뷰와 컨트롤러를 개발하는 프레임 워크로 서 여러가지가 있지만 다음 두가지가 가장 많이 사용되는 오픈소스이다.

    스트릿츠 


    스프링 - 통합 프레임워크 그 중 하나 프레젠테이션계층을 개발하는 스프링 MVC 



    [2]비즈니스 프레임 워크 

    클라이언트가 요청한 서비스의 실제 처리하는 기능을 제공 

    프레임워크에서 정해진 기능을 제공하는것이 아니고 비즈니스 객체를 효울적인 디자인 패턴을 사용해서 구현할 수있게 
    돕는 프레임워크이다.
    비즈니스 프레임워크인 Spring Ioc , AOP 들도 비즈니스 객체를 구현 및 작업 할 수 있게 돕는 프레임워크

    [3] 영속 프레임 워크

    DAO 객체에서 데이터에 관한 처리 기능을 제공하는 프레임워크이다. 대표적인 오픈소스는 다음과 같다.

    myBatis

    XML파일에 데이터베이스 처리에 관한 SQL문을 설정한후 자바소스에서 간단하게 연결하여 데이터를 처리할 
    수있는 영속 프레임워크 

    Hibernate

    하이버네이트는 ORM(Object-Relational Mapping)프레임 워크라고도 부르는 영속 프레임워크로서 자바 객체와
    데이터베이스를 객체 지향으로 매핑하여 데이터를 처리하므로 엔터프라이즈 개발 환경에 적합하다.
    그러나 객체 모델링에 관한 충분한 경험이 없다면 사용하기 어렵다는 특징이 있다.

    프런트 컨트롤러 디자인 패턴

    하나의 웹 애플리케이션에서 많은 뷰와 많은 컨트롤러가 존재해서 각각의 뷰와 컨트롤러가 연결되어 독립적으로
    실행되면 , 서버 입장에서 현재 웹 애플리케이션에 실행에 대하여 일괄적으로 처리하기가 어렵다


    수 많은 뷰에서 들어오는 모든 요청을 담당하게 하면 웹 애플리케이션을 실행하는 모든 요청을
    일괄적으로 처리 할수 잇다.


    일괄적으로 처리하는 구조를 프런트 컨트롤러 디자인 패턴이라고 한다.

    프런트 컨트롤러 설정

    2가지 작업이 선행되어야한다.
    1. 클라이언트의 서비스 요청시 요청되는 URL 패턴의 규칙을 지정한다.
    2. 지정된 URL의 패턴과 프런트 컨트롤러를 연결한다.

    [1] URL패턴 지정 


    일반적으로 URL 끝에 특정단어를 붙이는 방식 "~.do" , "~.action"과 같은 단어가 공통으로 들어가게 URL을 지정하는 것이다.


    [2] 프런트 컨트롤러 등록 

    이전 단계에서 모든 요청 URL끝에 공통으로 .do 가 들어도록 구현했다면 , 이 요청에 대응하여 실행할 프런트 컨트롤러 클래스를 생성한후에
     web.xml에 등록하면 , 프런트 컨트롤러로 동작한다.


    <servlet>
    <servlet-name>front</servlet-name>
    <servlet-class>com.edu.controller.FrontController</servlet-class>
    </servlet>


    프런트 컨트롤러를 front라는 이름으로 서버에 등록

    <servlet-name>front</servlet-name>
    <url-pattern>*.do</url-pattern>

    URL의 끝부분이 .do로 만 끝나면 front 서블릿을 실행하라는 의미 


    서브 컨트롤러 연결


    web.xml 프런트 컨트롤러를 설정하였으므로 이후에 .do로 요청이 들어오면 프펀트 컨트롤러가 실행된다.
    처리가 완료된후 실제 요청하는 서비스를 처리하는 컨트롤러가 실행되게 해야 한다. 

    서브컨트롤러가 실행하게 하려면 
    어떤 서브 컨트롤러를 실행해야하는 지 정보를 알고 있어야한다.
    이런한 정보는 주로 map객체에 저장하며 저장된 정보에서 서브 컨트롤러를 찾아서 실행한다.


     key

    value 

     memberInsert.do

     MemberInsert 

     memberSearch.do 

     MemberSearch

     memberUpdate.do

     MemberUpdate

     memberDelete.do 

     MemberDelete 




    'java디자인패턴' 카테고리의 다른 글

    템플릿 메소드 패턴(Template Method Pattern)  (0) 2018.12.06
    어댑터 패턴  (0) 2018.12.03
    싱글턴 패턴  (0) 2018.12.01
    참고  (0) 2018.11.29
    스트래티지 패턴(Strategy pattern)  (0) 2018.11.27
Designed by Tistory.