«   2025/05   »
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
Tags more
Archives
Today
Total
관리 메뉴

장미의 개발일기

JSP 프로그래밍: 모델1 방식의 웹 개발하기(게시판 만들기) - 1 FBoard 본문

개발일기/JSP 프로그래밍 (Java 웹프로그래밍)

JSP 프로그래밍: 모델1 방식의 웹 개발하기(게시판 만들기) - 1 FBoard

민장미 2023. 6. 4. 21:39

*Model 1 방식: JSP 프로그래밍에서 Model과 View를 따로 분리하지 않고 같이 섞어서 개발하는 방식이다.

   => UI(디자인)와 비즈니스 로직을 함께 처리하는 방식이라  코드의 재사용성이 떨어진다 => 유지보수가 어렵다.

*JSP 프로그래밍: jsp(Java Server Page)파일에서 Java 코드를 작성하는 프로그래밍 방식이다.

 - jsp파일에 html과 java코드를 함께 작성

 

 

 

-셋팅: 톰캣 9.0 , 이클립스 EE, Tern 라이브러리 (js) , 오라클 , SQLgate 

 

 

 

프로젝트 생성시, 다이나믹 프로젝트를 선택하고, 마지막에 web.xml 옵션 반드시 체크 ! 

 

모델1 파일경로 예시

 

 

 

 

1.  SQL  GATE에서  테이블 및 시퀀스 생성 

--fboard
/*1.요구사항
미니게시판
-번호, 제목, 작성자,내용,
-조회수,
-작성자의 아이피,비밀번호
-작성날짜
*/
CREATE TABLE FBOARD(
NUM NUMBER CONSTRAINT FBOARD_NUM_PK PRIMARY KEY,
SUBJECT VARCHAR2(100) NOT NULL,
WRITER VARCHAR2(30) NOT NULL,
PWD VARCHAR2(10) NOT NULL,
CONTENT VARCHAR2(200),
HIT NUMBER(10),
REIP VARCHAR2(34),
FDATE DATE
);

CREATE SEQUENCE FBOARD_SEQ
INCREMENT BY 1
START WITH 1;

 

 

 

2. 데이터를  담을 DTO (Data Transfer Object) , VO 클래스를 생성 . 

sql에서 생성한 테이블 코드를 그대로 가져와서 보고 작성하는 것이 좋다.


FBoardVO 클래스 : alt+s+sh =>  getter/setter => all 선택 

package vo;

public class FBoardVO {
	/*CREATE TABLE FBOARD(
	NUM NUMBER CONSTRAINT FBOARD_NUM_PK PRIMARY KEY,
	SUBJECT VARCHAR2(100) NOT NULL,
	WRITER VARCHAR2(30) NOT NULL,
	PWD VARCHAR2(10) NOT NULL,
	CONTENT VARCHAR2(200),
	HIT NUMBER(10),
	REIP VARCHAR2(34),
	FDATE DATE
	);*/
	
	private int num;
	private String subject;
	private String writer;
	private String pwd;
	private String content;
	private int hit; //조회수
	private String reip;  //사용자의 ip
	private String fdate;
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public int getHit() {
		return hit;
	}
	public void setHit(int hit) {
		this.hit = hit;
	}
	public String getReip() {
		return reip;
	}
	public void setReip(String reip) {
		this.reip = reip;
	}
	public String getFdate() {
		return fdate;
	}
	public void setFdate(String fdate) {
		this.fdate = fdate;
	}
	

}

 

 

 

3. DB에 접근할 객체, DAO (Data Access Object) 생성 / 인터페이스 생성    => DB처리를 전담한다. 

연습용으로는 인터페이스는 굳이 안만들어도 되지만 가능한 사용을 권장 (실전에서는 거의 쓰기 때문)


FBoardDaoInter <interface>  추상메서드 설계

 

*FBoardDao class , 오버라이딩,  싱글톤 처리*
-//싱글톤 : 자원이 제한적일때 스레드간의 간섭을 피하면서 자원을 효율적으로 사용하기 위한 패턴이다. 
- static 영역에 오직 하나만 생성하고 , 다른객체가 공유하는 개념

( static 변수, 멤버필드, 메소드 등의 개념을 잘 알고 있다면 이해하기 수월하다)

 

- 외부에서 생성되지 않고 getDao()메서드를 호출 시에 최초에 한번만 생성하고 다음부터는 이미 생성된 주소를 사용하자!

  => 매번 new 키워드를 사용해서 객체를 만들어내면 메모리 낭비가 심하니, 한번 dao객체를 생성 한 뒤에,  그 객체에 

     데이터를 담고, 한 작업을 끝내고 다른 작업을 할 때 다시 다른 데이터를 담고... 이런식으로 진행 된다. 

 

package dao;

import java.util.List;

import vo.FBoardVO;

public interface FBoardDaoInter {
	//설계가 들어가야한다.=> 추상메서드 설계
	
	//입력을 처리하는 메서드
	public void addFBoard(FBoardVO vo);
	
	public List<FBoardVO> listFBoard(); //게시판 리스트
	
	public void updateHit(int num); //hit 조회수 증가 
	public FBoardVO detailFBoard(int num); //상세보기 메서드
	
	public boolean checkPwd(FBoardVO vo); //비번, 넘버 받아야하지만 1개이상이면 vo 객체로 해버려도된다.
	//(String pwd, int num) 비번 체크 메서드  비번 중복 방지-넘버 ///비번조회
	
	public void deleteFBoard(int num); //게시판 삭제 
	
	public void updateFBoard(FBoardVO vo); //게시판 수정
	
	
	
}

 

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.sun.net.httpserver.Authenticator.Result;

import vo.FBoardVO;

public class FBoardDao implements FBoardDaoInter {

	//싱글톤 : 자원이 제한적일때 스레드간의 간섭을 피하면서
		//자원을 효율적으로 사용하기 위한 패턴이다. 
		// 싱글톤 처리 영역 
		// static 영역에 오직 하나만 생성하고 , 다른객체가 공유하는 개념 
		private static FBoardDao dao;
		// 외부에서 생성되지 않고 getDao()메서드를 호출 시에 최초에 한번만 생성하고
		//다음부터는 이미 생성된 주소를 사용하자!
		
		private FBoardDao() {
		}
		
		public static FBoardDao getDao() {
			if(dao==null) {
				dao = new FBoardDao();
			}
			return dao;
		}
		
		//싱글톤 처리 영역
	
	
	
	
	@Override
	public void addFBoard(FBoardVO vo) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public List<FBoardVO> listFBoard() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void updateHit(int num) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public FBoardVO detailFBoard(int num) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean checkPwd(FBoardVO vo) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void deleteFBoard(int num) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void updateFBoard(FBoardVO vo) {
		// TODO Auto-generated method stub
		
	}
	
	
	
}

 

4.셋팅 점검 및 변경 

TOMCAT서버의 server.xml 파일에서 Connector 부분을 찾는다.

  1. port를 80으로 변경  (오라클도 포트 8080을 쓴다고 들어서 충돌방지하려고 변경하는 걸로 추정)

  2. URIEncoding="EUC-KR" 을  코드 안에 추가 해주기 

 

<Connector URIEncoding="EUC-KR" connectionTimeout="20000" maxParameterCount="1000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>

 

- OJDBC6.jar를 복사해서 apache-tomcat-9.0.75\lib 폴더에 넣어주기  => 프로젝트 refresh 

-------한번 설정해두면 그 다음 프로젝트부턴 안바꿔도 된다. 

 

 

5. meta-inf  폴더 안에 context.xml 파일 생성

(파일 위치랑 파일명을 임의로 지정 x  똑같이 해줘야함)

 context.xml   안에 코드  복붙: 

myora는 내가 원하는대로 임의 지정이 가능하지만 jdbc는 불가능

username과 password에는 오라클 DB의 유저 이름과 비번을 작성 ! 


<Context>
<Resource name="jdbc/myora"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:orcl"
username=""
password=""
maxActive="20"
maxIdle="10"
maxWait="-1"
/>
</Context> 

 

=> WAS (web application server) 즉 톰캣이 DB에 접속을 해주는 셈 

 

 


6.MyConn 클래스 생성  
DataSource 객체를 획득해서 Connection을 반환하는 메서드를 정의하는 것이 목적
// context.xml에 작성한 context를 읽어와서
// DataSource 객체를 획득해서 Connection을 반환하는 메서드를 정의하는 것이 목적 

package conn;

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class MyConn {
	// context.xml에 작성한 context를 읽어와서
	// DataSource 객체를 획득해서 Connection을 반환하는 메서드를 정의하는 것이 목적 
	
	private static DataSource ds;
	
	
	static {
		try {
			// context.xml에 Resource 객체를 통해서
			// jndi 방식: context.xml에 있는 name= "jdbc/myora" lookup이란 메서드로 검색
			/* JNDI(java Naming and Directory Interface)는
			 * Was 단에 데이터베이스 커넥션 객체를 미리 네이밍 해두는 방식(context.xml)이다.
			 * Connetion Pool에 Connection을 가져와서 Connection으로 반환하는 객체
			 * 즉, DataSource의 이름을 검색하는 방식이다.
			 * 사전적으로는 디렉토리 서비스에서 제공하는 데이터 및 객체를 발견하고
			 * 참고하기 위한 자바 API라고 한다. 
			 */
			
			InitialContext ctx = new InitialContext();
			ds=(DataSource) ctx.lookup("java:comp/env/jdbc/myora"); //외우기
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}
	public static Connection getConn() throws SQLException{  //connection: sql관련 interface
		return ds.getConnection(); 
	}
	
	

}


7.weapapp 폴더에 간단한 jsp 파일을 생성하여 연결 테스트를 해본다.

 테스트 코드는 자유지만, 나는 이걸 썼다.

 

<%@page import="conn.MyConn"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
//conntest
<%
	Connection con = MyConn.getConn();
%>
<p>con => <%=con %></p>

 

아래 처럼 출력이되고, 오류창이 뜨지 않는다면 web  작업할 준비 완료 !!

다음 포스팅에서 본격 게시판 만들기 !!!