본문 바로가기
JSP

[JDBC] Bean & JDBC연결

by amoomar 2022. 3. 1.
반응형

 

이번 포스팅의 목차는 다음과 같다.

1. Bean
   1) 개요
   2) 계산기 실습
   3) 로그인 실습
   4) 퀴즈 실습
   5) 게시판글작성 실습

2. JDBC
   
1) 데이터 연결

 

 


1. Bean

 

1) 개요

이전 포스팅들에서도 간간히 bean에 대한 개념들이 조금씩 언급되었으나, 내용에 대한 정리는 해당 포스팅에서 본격적으로 이루어 질 예정이다.

 

빈즈(Beans)는 특정한 일을 독립적으로 수행하는 컴포넌트를 의미한다. 여기서 컴포넌트는 쉽게 말해 기능 덩어리라고 표현이 가능할 것 같다.

 

JSP 빈즈는 말 그대로 JSP와 연동하려고 만들어진 컴포넌트 클래스를 의미한다. 또한 이 JSP 빈즈는 컨테이너에 위치하고 있다. JSP에서 사용하는 로직파트를 빈즈라고 표현하고, 자바 언어로 사용되므로 자바빈즈라고도 한다.

유지보수를 용이하게 할 목적으로 행해진다. 유지보수가 용이한 코드의 특징은 다음과 같다.

 

1. 낮은 결합도 : 코드간 의존성 낮아야함

2. 높은 응집도 : 로직마다 잘 응집되어 수정시 하나만 수정할 수 있어야 한다.

 

 



2) 계산기 실습

 

① View 완성하기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form method="post">
   <input type="text" name="num1">
   <select name="op">
      <option>+</option>
      <option>-</option>
      <option>x</option>
   </select>
   <input type="text" name="num2">
   <input type="submit" value="계산하기">
</form>

<hr>

계산결과: ?
</body>
</html>

 

 


 

② Bean 만들기

패키지 만들고 그 안에 파일을 생성하도록 한다. 사용되는 모든 멤버변수를 작성하고, 이때 getter&setter은 다 선언해도 상관이 크게 있는 것은 아니나 반환될 변수와, 입력되는 변수를 구분해서 각각 getter와 setter를 선언할 수도 있다.

package day043;

//JSP에서 사용하는 로직파트 == (자바)빈즈
public class CalcBean { 

   private int num1;
   private int num2;
   private int res;
   private String op;

   public int getRes() {
      return res;
   }

   public void setNum1(int num1) {
      this.num1 = num1;
   }
   public void setNum2(int num2) {
      this.num2 = num2;
   }
   public void setOp(String op) {
      this.op = op;
   }

   public void calc() {
	  //op가 null일 수 있어 발생하는 500대 서버 오류방지 
	  if(op==null) {
		  op="+";
	  }
      if(op.equals("+")) {
         res=num1+num2;
      }
      else if(op.equals("-")) {
         res=num1-num2;
      }
      else if(op.equals("x")) {
         res=num1*num2;
      }else {
         System.out.println("로그: 연산자 오류!");
      }
   }
}

 

 


 

③ JSP에 Bean 불러오기

jsp에 bean을 불러오는 방법에는 두가지가 있다. 어떤 방법을 선택하냐에 따라 특징은 구분되지만 전체 동작 자체는 동일함을 알아야한다.

<% 첫번째 방법 : 객체화해서 클래스 불러오기
CalcBean cb=(CalcBean)application.getAttribute("cb"); // request
   if(cb==null){
      cb = new CalcBean();
      application.setAttribute("cb",cb); // request
}
%>
클래스는 객체로 생성되어 동작하며, 이때 멤버변수를 setter로 초기화하는 작업이 필요하다.
물론 생성자 오버로딩해서 사용해도 되지만 ! 안되는 이유는 아래와 같다.

1) 자동 처리를 사용할 예정인데, 이때 기본 생성자를 사용한다.
2) 생성자를 5개 오버로딩하게 되면 경우의 수가 방대하다.즉, 다양한 사용방법을 구현하기가 현실적으로 어렵다.
3) 싱글톤 패턴이 깨진다!
객체 불러올때 맨날 new 안하고 if있니? 있으면 그거 재사용하고, 없으면 그때 new!하는게 싱글톤 패턴임
<!-- 두번째 방법 : 액션태그로 불러오기-->
<jsp:useBean id="cb" class="day043.CalcBean" scope="application" />
<jsp:setProperty property="*" name="cb"/>

class: 어떤빈즈를 사용할지 패키지명까지 작성
     id: 인스턴스명,객체명
     scope: 현재 객체의 유효범위
     "싱글톤 패턴"을 유지합니다! -->

 

두번째 방법으로 bean불러오기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
<jsp:useBean id="cb" class="day043.CalcBean" scope="application" />
<jsp:setProperty property="*" name="cb"/>

<% cb.calc(); %>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

(생략)

<hr>

<!-- 둘은 완벽히 똑같으며, 보통 표현식이 더 짧기때문에 표현식을 사용하여 출력하는게 일반적이다. -->
계산결과: <jsp:getProperty property="res" name="cb"/> | <%= cb.getRes() %>
</body>
</html>

 

결과 화면

 

 



3) 로그인 실습

 

① view만들기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>메인페이지</title>
</head>
<body>

<form action="a_main.jsp" method="post">
   <table border="1">
      <tr>
         <td>아이디</td>
         <td><input type="text" name="id"></td>
      </tr>
      <tr>
         <td>비밀번호</td>
         <td><input type="password" name="passwd"></td>
      </tr>
      <tr>
         <td colspan="2" align="right"><input type="submit" value="로그인"></td>
      </tr>
   </table>
</form>

</body>
</html>

 


 

② bean만들기

내용을 확인해보면 vo와 dao가 구분되지 않은 model의 내용 그 자체임을 확인할 수 있다.

package day043;

public class LoginBean {
	//멤버변수
	private String id;
	private String passwd;
	
	//getter&setter
	public String getId() {
		return id;
	}

	public String getPasswd() {
		return passwd;
	}

	public void setId(String id) {
		this.id = id;
	}

	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}

	//DB를 대신할 상수값
	final String rootId="root";
	final String rootPasswd="1234";
	
	public boolean check() {
		if(id.equals(rootId)&&passwd.equals(rootPasswd)) {
			return true;
		}else {
			return false;
		}
	}
}

 


 

③ 결과 화면

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- 인코딩설정 -->
    <% request.setCharacterEncoding("UTF-8"); %>
    
<!-- bean연결 및 자동 setter -->    
<jsp:useBean id="lb" class="day043.LoginBean"/>
<jsp:setProperty property="*" name="lb"/>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>결과화면</title>
</head>
<body>

<%//check메서드를 돌려보고 true면 성공, false는 실패
	if(lb.check()){
		out.println("로그인 성공");
	}else {
		out.println("로그인 실패");
	}
%>

입력한 아이디 : <%= lb.getId() %><br>
입력한 비밀번호 : <%= lb.getPasswd() %>

</body>
</html>

 

 

로직의 정상수행 확인 가능하다.

 

 

 

 



4) 퀴즈 실습

 

① view생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>초기화면</title>
</head>
<body>

<h1>아재동아리 입동 테스트</h1>
<hr>
<br>

<form action="b_result.jsp" method="post">
	<fieldset>
	<legend>Q</legend>
		<label>문제 : 레스토랑에서 스튜를 주문했는데 안나왔을때 하는 말은?</label><br>
		<label>정답 : 
			<select name="input">
				<option>스튜내놔</option>
				<option>제 스튜는요?</option>
				<option>스튜가 안나왔네요</option>
				<option>스튜어디스</option>
			</select>
		</label>
	</fieldset>
	<input type="submit" value="답변 제출">
</form>

</body>
</html>

 


 

② bean생성

package day043;

public class B_Bean {
	//변수
	private String input;//멤버변수
	final private String answer="스튜어디스";//DB대체변수
	
	//getter&setter
	public String getInput() {
		return input;
	}
	public void setInput(String input) {
		this.input = input;
	}
	
	//로직
	public boolean check() {
		if(input.equals(answer)) {			
			return true;
		}else {
			return false;
		}
	}
}

 

 


 

③ bean불러오기 및 결과 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>    

<jsp:useBean id="bb" class="day043.B_Bean"/>
<jsp:setProperty property="*" name="bb"/>    

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>결과화면</title>
</head>
<body>
<h1>
<%
	if(bb.check()){
		out.println("합격!");
	}else{
		out.println("불합격^^");
	}
%>
</h1>
당신이 선택한 답변은 <%= bb.getInput() %>입니다.
</body>
</html>

 

정상 작동 확인

초기화면

 

return false
return true

 

 


 

 

5) 게시판글작성 실습

 

① VO작성

String타입으로 저장된 작성일 변수(date)를 Date타입으로 자료형을 변경하는 내용은 주석을 통해 확인할 수 있다.

package day043;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class C_VO {
	
	//멤버변수
	private String name;
	private String content;
	private Date date;
	//DB대신
	private String stringDate;
	//외부에서 입력된 date를 Date타입에 맞게 변경
	public void setStringDate(String stringDate) {
		this.stringDate = stringDate;
		 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
	      try {
	         this.date=sdf.parse(stringDate);
	      } catch (ParseException e) {
	         // TODO Auto-generated catch block
	         e.printStackTrace();
	      }
	}
	
	//getter & setter
	public String getName() {
		return name;
	}
	public String getContent() {
		return content;
	}
	public Date getDate() {
		return date;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public void setDate(Date date) {
		this.date = date;
	}
	public String getStringDate() {
		return stringDate;
	}
	
	@Override
	public String toString() {
		return "[작성자:" + name + ", 내용:" + content + ", 작성일:" + stringDate + date +"]";
	}
	
}

 

 


 

② view생성(bean연결 필요)

사용자의 첫 화면에서 글 작성과 동시에 작성된 글들의 목록을 출력해주어야한다. 그러기 위해서는 model에 접근하기 위해 vo와 bean의 호출이 필요하며, vo의 값을 set하는 행동이 필요하다.

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="day043.*"%>
<!-- 인코딩 -->    
<% request.setCharacterEncoding("UTF-8"); %>
<!-- 사용할 java파일 객체화 및 스코프 set -->
<jsp:useBean id="cb" class="day043.C_bean" scope="application"/>
<jsp:useBean id="vo" class="day043.C_VO"/>
<!-- 빈즈의 값을 설정하고 가져오도록하는 액션,
	 빈즈 클래스의 setXxx 메소드를 호출 -->
<jsp:setProperty property="*" name="vo"/>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>초기화면</title>
</head>
<body>

<form method="post">
	검색: <input type="text" name="name"> <input type="submit" value="작성자 검색하기">
</form>

<%
	ArrayList<C_VO> datas = cb.selectAll(vo);
	
	if(datas.size()==0){
		out.println("내용 없음");%><br><%
	}else{
		for(C_VO v:datas){
			out.println(v);
			%>
			<br>
			<%
		}
	}
%>

<a href="c_main.jsp">글쓰러 가기</a>

</body>
</html>

 


 

③ 글작성하는 페이지 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>글쓰기페이지</title>
<style type="text/css">
	input[name="content"]{
		width: 50%;
		height: 200px;
	}
</style>
</head>
<body>

<form action="c_result.jsp" method="post">
	<fieldset>
		<legend>작성자</legend>
		<input type="text" name="name">
	</fieldset>
	<fieldset>
		<legend>내용</legend>
		<input type="text" name="content">
	</fieldset>
	<fieldset>
		<legend>작성일</legend>
		<input type="date" name="stringDate">
	</fieldset>
	<input type="submit" value="글쓰기">
</form>

</body>
</html>

 

 


 

④ bean로직구현

글쓰기를 위한 insert메서드와 글 목록 조회 및 검색을 위한 selectAll메서드가 존재한다.

package day043;

import java.util.ArrayList;

public class C_bean {
	//DB를 대체할 LIST
	ArrayList<C_VO> datas=new ArrayList<C_VO>();
	
	public ArrayList<C_VO> selectAll(C_VO vo) {//원래는 VO를 인자로 추가해야함
		if(vo.getName()!=null) {//검색이라면
			ArrayList<C_VO> data=new ArrayList<C_VO>();
			//검색결과가 있으면!
			for(int i=0; i<datas.size(); i++) {
				if(datas.get(i).getName().equals(vo.getName())) {
					data.add(datas.get(i));
				}
			}
			return data;//검색결과 반환
		}else {//검색이 아니라면
			return datas;//datas반환
		}
	}
	
	public void insert(C_VO vo) {
		datas.add(vo);
	}
}

 

 


 

⑤ bean연결 및 결과페이지

insert메서드를 사용하기 위해서는 매개변수로 vo를 넣어야한다. 이때 setProperty액션을 사용하여 자동 set되도록 한다.

<%@page import="day043.C_VO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %>
<jsp:useBean id="cb" class="day043.C_bean" scope="application"/>  
<jsp:useBean id="vo" class="day043.C_VO"/>
<jsp:setProperty property="*" name="vo"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과페이지</title>
</head>
<body>

<%
	cb.insert(vo);
%>

<%= vo.getName() %><br>
<%= vo.getContent() %><br>
<%= vo.getStringDate() %>

<hr>
<a href="c_first.jsp">메인페이지</a>


</body>
</html>

 

참조 링크

https://m.blog.naver.com/shb1833/221758957083

 

[Web] JSP 빈즈, Beans

● 빈즈, Beans 빈즈(Beans)는 특정한 일을 독립적으로 수행하는 컴포넌트를 의미합니다. 이러한 컴포넌...

blog.naver.com

 


 

 

2. JDBC연결

 

Oracle을 활용하여 작업하였다.

 

1) table생성

select * from all_tables;

create table test(
	writer varchar(15),
	content varchar(200)
);

select * from test;
drop table test;​

 

파일 생성 위치는 아래와 같이 하였다.

 

 


 

2) DB연결

java에서 활용할때와 동일한 순서로 진행하였다.

// 1. DBMS에 맞는 드라이버 데이터를 로드 // 2. DB에 연결 // 3. 데이터를 read,write // 4. DB와의 연결을 해제☆

다시 정리하면 로드, 연결, excute, 연결해제의 단계로 진행된다. insert와 select문을 준비하여 DB에 데이터를 삽입하고, 불러와 출력하는 작업을 진행하였다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.sql.*" %>
<% request.setCharacterEncoding("UTF-8"); %>
<!-- import와 encoding필요 -->
<%
   String driverName="oracle.jdbc.driver.OracleDriver";
   String url="jdbc:oracle:thin:@localhost:1521:xe";
   String user="ham";
   String passwd="1234";
   Connection conn=null;
   PreparedStatement pstmt=null;
   String sql="insert into test values(?,?)";
   try{
      Class.forName(driverName);
      conn=DriverManager.getConnection(url,user,passwd);
      pstmt=conn.prepareStatement(sql);
      pstmt.setString(1, request.getParameter("writer"));
      pstmt.setString(2, request.getParameter("content"));
      if(request.getParameter("writer")!=null){//작성자가 입력 되었을때
         pstmt.executeUpdate();//DB에 업데이트
      }
   }catch(Exception e){
      e.printStackTrace();
   }
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form method="post">
   <input type="text" name="writer">
   <input type="text" name="content">
   <input type="submit" value="DB에 저장하기">
</form>
<hr>
<%
   sql="select * from test";
   try{
      pstmt=conn.prepareStatement(sql);
      ResultSet rs=pstmt.executeQuery();
      while(rs.next()){//불러올 형식도 포함하여 작성
         out.println(rs.getString("writer")+" >> "+rs.getString("content")+"<br>");
      }
      rs.close();
   }catch(Exception e){
      e.printStackTrace();
   }

   pstmt.close();
   conn.close();
%>

</body>
</html>

 

결과는 다음과 같다

 

 

참조링크

https://m.blog.naver.com/shb1833/221760562513

 

[Web] JDBC (JSP, MySQL), JDBC 드라이버 설치 및 연동

● JDBC JDBC( Java Database Connectivity )는 Java 프로그램에서 여러가지 데이터베이스(오...

blog.naver.com

 

 


 

반응형

'JSP' 카테고리의 다른 글

[View업그레이드] EL & JSTL  (0) 2022.03.03
[JDBC] MVC나누기_1 : 게시글  (0) 2022.03.02
[JSP] 내장객체  (0) 2022.02.25
[JSP] 서버프로그래밍_기초2  (0) 2022.02.24
[JSP] 서버프로그래밍의 기초  (0) 2022.02.23