상세 컨텐츠

본문 제목

codenvy 온라인실습실에서 petclinic 사이트 작업02

JSP·자바·코틀린

by 김일국 2017. 7. 26. 17:50

본문

이번 작업은 웹용자바(JSP)의 역사를 실제예를 들어서 알아 보기로 했습니다.


============================================================================================

1). 2000~2005년 사이: JSP 소스에 네이티브JAVA코드를 삽입하여 화면에 뿌려주기(파일명:test_1.jsp)

아래는 위 화면을 출력하기 위한 jsp소스 입니다.(dB커넥션, 쿼리, 출력을 위한 for반복문 등이 1개의 파일에 모두 있습니다.)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<!DOCTYPE html>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html lang="ko">
<jsp:include page="../fragments/headTag.jsp"/>

<%
Connection conn = null;                               // null로 초기화 한다.
try{
String url = "jdbc:mysql://db:3306/petclinic?useUnicode=true&characterEncoding=UTF-8";        // 사용하려는 데이터베이스명을 포함한 URL 기술
String id = "petclinic";                              // 사용자 계정
String pw = "password";                               // 사용자 계정의 패스워드
Class.forName("com.mysql.jdbc.Driver");               // 데이터베이스와 연동하기 위해 DriverManager에 등록한다.
conn=DriverManager.getConnection(url,id,pw);          // DriverManager 객체로부터 Connection 객체를 얻어온다.
out.println("제대로 연결되었습니다.");                // 커넥션이 제대로 연결되면 수행된다.
}catch(Exception e){                                  // 예외가 발생하면 예외 상황을 처리한다.
e.printStackTrace();
}
%>

<body>
<div class="container">
    <h2>환영합니다.</h2>
    <br/>HELLO JSP! 결과 확인<br/>
    <%= new java.util.Date() %>
    <table width="550" border="1">
    <%
    PreparedStatement pstmt = null;
    ResultSet rs = null;
   
    int n=0;
    try{
        String usql = "update owners set last_name=? where first_name = 'George'";
        pstmt = conn.prepareStatement(usql);
        pstmt.setString(1,"test");
        n = pstmt.executeUpdate();
    }catch(Exception e){                                            // 예외가 발생하면 예외 상황을 처리한다.
        e.printStackTrace();
        out.println(e.toString());
    }finally{                                                       // 쿼리가 성공 또는 실패에 상관없이 사용한 자원을 해제 한다.  (순서중요)
        if(n>0) {
            out.println(n+"업데이트 성공했습니다.");
        }else{
            out.println(n+"업데이트 실패했습니다.");
        }
        if(pstmt != null) try{pstmt.close();}catch(SQLException sqle){} // PreparedStatement 객체 해제
    }
   
    try{
    String sql = "select * from owners";                     // sql 쿼리 where idx = ?  where first_name = 'kim1'
    pstmt = conn.prepareStatement(sql);                      // prepareStatement에서 해당 sql을 미리 컴파일한다.
    // pstmt.setString(1,"1");
    rs = pstmt.executeQuery();                               // 쿼리를 실행하고 결과를 ResultSet 객체에 담는다.
    while(rs.next()){                                        // 결과를 한 행씩 돌아가면서 가져온다.
    String no = rs.getString("id");
    String fn = rs.getString("first_name");
    String ln = rs.getString("last_name");
    String addr = rs.getString("address");
    String tel = rs.getString("telephone");
    %>
    <tr>
    <td width="100"><%=no%></td>
    <td width="100"><%=fn%></td>
    <td width="100"><%=ln%></td>
    <td width="100"><%=addr%></td>
    <td width="100"><%=tel%></td>
    </tr>
    <%
    }
    }catch(Exception e){                                            // 예외가 발생하면 예외 상황을 처리한다.
    e.printStackTrace();
    out.println("users 테이블 호출에 실패했습니다.");
    }finally{                                                       // 쿼리가 성공 또는 실패에 상관없이 사용한 자원을 해제 한다.  (순서중요)
    if(rs != null) try{rs.close();}catch(SQLException sqle){}       // Rsultset 객체 해제
    if(pstmt != null) try{pstmt.close();}catch(SQLException sqle){} // PreparedStatement 객체 해제
    if(conn != null) try{conn.close();}catch(SQLException sqle){}   // Connection 해제
    }
    %>
    </table>
</div>
</body>

</html>

=====================================================================================================================

2). 2005~2010년 사이: jsp화면(뷰)와 java컨트롤러(DB커넥트, 쿼리, 반복자료구조용javar구문포함) 파일명: test_2.jsp, Owners.java , TestController.java 이렇게 파일이 나눠 집니다. 결과는 아래 처럼 똑 같습니다.


위 화면의 jsp 소스는 아래와 같습니다.(jsp화면에 네이티브 Java코드가 없이 구현 됩니다.)


<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "org.springframework.samples.petclinic.web.Owners" %>
<!DOCTYPE html>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html lang="ko">
<jsp:include page="../fragments/headTag.jsp"/>

<body>
<div class="container">
    <h2>환영합니다.</h2>
    <br/>HELLO JSP! 결과 확인<br/>
    <jsp:useBean id="toDay" class="java.util.Date" />
    <fmt:formatDate value="${toDay}" pattern="yyyy-MM-dd HH:mm:ss" />
    <c:out value="${testStr}"/><br/>
    <table width="550" border="1">
    <tr>
    <td width="100">no</td>
    <td width="100">fn</td>
    <td width="100">ln</td>
    <td width="100">addr</td>
    <td width="100">tel</td>
    </tr>
    <c:forEach var="owners" items="${list}">
    <tr>
        <td width="100">${owners.id}</td>
        <td width="100">${owners.fn}</td>
        <td width="100">${owners.ln}</td>
        <td width="100">${owners.addr}</td>
        <td width="100">${owners.tel}</td>
    </tr>
    </c:forEach>
    </table>
</div>
</body>

</html>



위 코드처럼 디자인 입히기 편하게 깨긋 한 코드가 되었지만, 컨트롤러와 변수필드전용 자바 파일 2개가 추가로 사용 되게 됩니다.


- 파일명: TestController.java

package org.springframework.samples.petclinic.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.*;
import java.sql.*;
import org.springframework.ui.Model;
import org.springframework.samples.petclinic.web.Owners;

/**
 * @author 김일국
 * @author Kim ilguk
 */
class Database{
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    Connection conn = null;                               // null로 초기화 한다.
    public void connect() {
        try{
        String url = "jdbc:mysql://db:3306/petclinic?useUnicode=true&characterEncoding=UTF-8";        // 사용하려는 데이터베이스명을 포함한 URL 기술
        String id = "petclinic";                              // 사용자 계정
        String pw = "password";                               // 사용자 계정의 패스워드
        Class.forName("com.mysql.jdbc.Driver");               // 데이터베이스와 연동하기 위해 DriverManager에 등록한다.
        conn = DriverManager.getConnection(url,id,pw);          // DriverManager 객체로부터 Connection 객체를 얻어온다.
        System.out.println("제대로 연결되었습니다.");                // 커넥션이 제대로 연결되면 수행된다.
        }catch(Exception e){                                  // 예외가 발생하면 예외 상황을 처리한다.
        e.printStackTrace();
        }
    }
    public void disconnect() {
        if(rs != null) try{rs.close();}catch(SQLException sqle){}       // Rsultset 객체 해제
        if(pstmt != null) try{pstmt.close();}catch(SQLException sqle){} // PreparedStatement 객체 해제
        if(conn != null) try{conn.close();}catch(SQLException sqle){}   // Connection 해제
    }
}

@Controller
public class TestController {
    Database db = new Database();//공통사용 DB클래스
   
    @RequestMapping(value = "/test/test_1", method = RequestMethod.GET)
    public String initView(Map<String, Object> model) {
        return "test/test_1";
    }
    @RequestMapping(value = "/test/test_2", method = RequestMethod.GET)
    public String listView(Model model) {
        db.connect();
        int n = 0;
        try{
            String usql = "update owners set last_name=? where first_name = 'George'";
            db.pstmt = db.conn.prepareStatement(usql);
            db.pstmt.setString(1,"test");
            n = db.pstmt.executeUpdate();
           
            String sql = "select * from owners";// sql 쿼리 where idx = ?
            db.pstmt = db.conn.prepareStatement(sql);// prepareStatement에서 해당 sql을 미리 컴파일한다.
            db.rs = db.pstmt.executeQuery();
           
            ArrayList<Owners> ownersResultList = new ArrayList<Owners>();
            while(db.rs.next()){
                Owners owners = new Owners();
                System.out.println( db.rs.getString("first_name") );
                owners.setid( db.rs.getString("id") );
                owners.setfn( db.rs.getString("first_name") );
                owners.setln( db.rs.getString("last_name") );
                owners.setaddr( db.rs.getString("address") );
                owners.settel( db.rs.getString("telephone") );
                ownersResultList.add(owners);
            }
            model.addAttribute("list", ownersResultList);
            /* 출력결과 디버그
            int totalElements = ownersResultList.size();// arrayList의 요소의 갯수를 구한다.
              for (int index = 0; index < totalElements; index++) {
                    Owners test = ownersResultList.get(index);
                    System.out.println( test.getfn() );
              }
             */
        }catch(Exception e){                   // 예외가 발생하면 예외 상황을 처리한다.
            e.printStackTrace();
            System.out.println("users 테이블 호출에 실패했습니다.");
        }finally{                              // 쿼리가 성공 또는 실패에 상관없이 사용한 자원을 해제 한다.  (순서중요)
            if(n>0) {
                model.addAttribute("testStr", "업데이트 성공했습니다.");
            }else{
                model.addAttribute("testStr", "업데이트 실패했습니다.");
            }
            db.disconnect();
        }
        return "test/test_2";
    }
}


- 파일명: Owners.java (사용자가 추가한 멤버변수들 일반적인 get(), set() 변수들 입니다.)

public class Owners {
    private String id; 
        private String fn;
        private String ln;
        private String addr;
        private String city;
        private String tel;
        //constructors   //getter-setters
        public String settel(String tel){    
            return this.tel = tel; 
         }  
        public String gettel() {
            return this.tel;
         }
         public String setcity(String city){    
            return this.city = city; 
         }  
        public String getcity() {
            return this.city;
         }
        public String setaddr(String addr){    
            return this.addr = addr; 
         }  
        public String getaddr() {
            return this.addr;
         }
        public String setln(String ln){    
            return this.ln = ln; 
         }  
        public String getln() {
            return this.ln;
         }
        public String setfn(String fn){    
            return this.fn = fn; 
         }  
        public String getfn() {
            return this.fn;
         }
        public String setid(String id){    
            return this.id = id; 
         }  
         public String getid() {
            return this.id;
         }
}


==========================================================================================================================

3). 2010~2017년 사이: MVC(모델,뷰,컨트롤러)로 확정된 스프링프레임웍4버전이 사용 중입니다. 즉, 위에서는 V, C 2부분에서 C부분이 M(모델:DB핸들링,쿼리) 와 C(컨트롤러:Java 서블릿)으로 분리가 되어서, 뷰(jsp파일), 모델(Model), 컨트롤러(Controller)로 3부분으로 정착되었습니다. *문제는 위의 옛날 방식 1).2). 처럼 한곳에 모든 기술이 들어가 있지 않아서, 구조적으로 알아야 할 지식이 많아 져서 아마추어들이 접근하기 쉽지 않다는데 있습니다.

스프링에 관련된 사항은 이전 포스트에서 확인 가능하십니다. http://blog.daum.net/web_design/388 

현재는 스프링을 사용하지 않으면, 2명이상인 프로젝트에서 공동작업을 할 수 없습니다.

공동작업을 위해서도 스프링은 알아야 합니다. 스프링공동작업시 확인할 사항들5가지=> http://blog.daum.net/web_design/362

관련글 더보기

댓글 영역