주다람
개미는 뚠뚠🎵 오늘도 뚠뚠🎵 열심히 개발하네✨
주다람
전체 방문자
오늘
어제
  • 분류 전체보기
    • 💭 기록해보자
      • BackEnd
      • FrontEnd
      • 회고
    • 💻 수업정리 (2020)
      • 오라클
      • 자바
      • CSS & HTML
      • JavaScript
      • Servlet
      • JSP
    • 📚 알고리즘
      • DP(다이나믹 프로그래밍)
      • 탐색(BFS,DFS)
      • 다익스트라
      • 순열과 조합
      • 백트래킹
      • 이분탐색(binarySearch)
      • 탐욕(Greedy)
      • 스택,큐,덱(Stack,Queue,Deque)
      • 유니온파인드(Union-Find)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 오라클
  • 날짜함수
  • 문자함수
  • 변환함수
  • oracle
  • 숫자함수
  • 그룹함수
  • group by
  • 일반함수
  • background-gradient
  • 박스모델
  • 함수

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
주다람

개미는 뚠뚠🎵 오늘도 뚠뚠🎵 열심히 개발하네✨

[7/2] DAO와 DTO 클래스, 정규표현식 사용해보기
💻 수업정리 (2020)/오라클

[7/2] DAO와 DTO 클래스, 정규표현식 사용해보기

2020. 7. 2. 18:11

📌DTO클래스

  • DTO(DATA Transfer Object)클래스 
    : DAO클래스의 메소드에서 행정보를 전달받거나 반환하기 위한 목적의 클래스 - 일종의 VO클래스
  • 테이블의 컬럼과 1:1로 매칭되는 필드 선언 - getter & setter이용
  • 필드명은 테이블의 컬럼명과 동일하게 작성하는 것을 권장
//DTO(DATA Transfer Object)클래스 : DAO클래스의 메소드에서 행정보를 전달받거나 반환하기 위한 목적의 클래스 (값을 전달해 준다)- 일종의 VO클래스

//student 테이블의 행정보(학생정보)를 저장하여 전달하기 위한 클래스

public class StudentDTO {
	private int no;
	private String name;
	private String phone;
	private String address;
	private String birthday;
	
	public StudentDTO() {
		
	}

	public StudentDTO(int no, String name, String phone, String address, String birthday) {
		super();
		this.no = no;
		this.name = name;
		this.phone = phone;
		this.address = address;
		this.birthday = birthday;
	}

	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getBirthday() {
		return birthday;
	}

	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
}

 

📌DAO클래스

  • 저장매체를 대상으로 행 정보의 저장, 변경, 삭제, 검색 기능을 제공하기 위한 목적의 클래스
  • 즉, C(reate)R(ead)U(pdate)D(elete)기능을 제공
  • 저장매체 : 데이터를 행단위로 저장하기 위한 하드웨어 또는 소프트웨어
  • 인터페이스를 상속받아 작성하는 것을 권장
  • 싱글톤 클래스(프로그램에 하나의 인스턴스를 제공하는 클래스)로 작성하는 것을 권장(메소드만 제공할것이기 때문)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

//DAO(Data Access Object) 클래스 : 저장매체를 대상으로 행정보의 저장,변경
//,삭제,검색 기능을 제공하기 위한 목적의 클래스 - CRUD 기능 제공
//=> 저장매체 : 데이타를 행(레코드)단위로 저장하기 위한 하드웨어 또는 소프트웨어
//=> 인터페이스를 상속받아 작성하는 것을 권장
//=> 싱글톤 클래스(프로그램에 하나의 인스턴스만을 제공하는 클래스)로 작성하는 것을 권장

//STUDENT 테이블의 학생정보에 대한 저장,변경,삭제,검색 기능을 제공하기 위한 클래스
//=> Connection 인스턴스를 DBCP로부터 제공받기 위해 JDBC DAO클래스를 상속받아 작성
public class StudentDAO extends jdbcDAO {
	//싱글톤 디자인 패턴이 적용된 클래스 작성 방법
	//1.클래스의 인스턴스를 저장하기 위한 참조필드 선언
	private static StudentDAO _dao;//시스템필드
	
	//2.생성자의 은닉화 선언
	private StudentDAO() {
		
	}
	
	//3.정적영역에서 클래스의 인스턴스를 생성하여 시스템필드에 저장
	//클래스를 여러번 호출해도 한번만 실행될 수 있도록 한다.
	static {
		_dao = new StudentDAO();
		
	}
	
	//4.시스템 필드에 저장된 인스턴스를 반환하는 메소드를 작성
	public static StudentDAO getDAO() {
		if(_dao == null)//정적영역을 선언하지 않은경우(위의 static영역) 만들어 주기 위해서
			_dao = new StudentDAO();
		return _dao;
	}
	
	//학생정보를 전달받아 student테이블에 행을 저장하고 저장행의 갯수를 반환하는 메소드
	public int insertStudent(StudentDTO student) {
		Connection con = null;
		PreparedStatement pstmt = null;
		int rows = 0;
		
		try {
			con = getConnection();
			String sql = "insert into student values(?,?,?,?,?)";
			pstmt = con.prepareStatement(sql);
			
			pstmt.setInt(1, student.getNo());
			pstmt.setString(2, student.getName());
			pstmt.setString(3, student.getPhone());
			pstmt.setString(4, student.getAddress());
			pstmt.setString(5, student.getBirthday());
			
			rows = pstmt.executeUpdate();
			
		}catch (SQLException e) {
			System.out.println("insetStudent메소드의 sql오류" + e.getMessage());
			
		}finally {
			close(con, pstmt);
		}
		return rows;
	}
	
	//학생정보를 전달받아 student테이블에 저장행을 변경하고, 변경행의 갯수를 반환하는 메소드
	public int updateStudent(StudentDTO student) {
		Connection con = null;
		PreparedStatement pstmt = null;
		int rows = 0;
		try {
			con = getConnection();
			String sql = "update student set name = ?, phone=?, address=?, birthday=? where no = ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, student.getName());
			pstmt.setString(2, student.getPhone());
			pstmt.setString(2, student.getAddress());
			pstmt.setString(2, student.getBirthday());
			pstmt.setInt(5, student.getNo());
			
			rows = pstmt.executeUpdate();
			
		}catch(SQLException e) {
			System.out.println("updateStudent메소드의 sql오류" + e.getMessage());
			
		}finally {
			close(con, pstmt);
		}
		
		return rows;
		
	}
	
	//학번을 전달받아 student테이블의 저장행의 갯수를 반환하는 메소드
	public int deleteStudent(String no) {
		Connection con = null;
		PreparedStatement pstmt = null;
		int rows = 0;
		try {
			con = getConnection();
			String sql = "delete from student where no = ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, no);			
			
			rows = pstmt.executeUpdate();
			
		}catch(SQLException e) {
			System.out.println("deleteStudent메소드의 sql오류" + e.getMessage());
			
		}finally {
			close(con, pstmt);
		}
		
		return rows;
	}
	
	//학번을 전달받아 student테이블의 저장행을 검색하고 반환하는 메소드
	//=> 단일행 검색 : 검색행이 하나인 경우 값 또는 DTO를 반환하면 된다.
	public StudentDTO selectNoStudent(int no) {
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		StudentDTO student = null;
		
		try {
			con = getConnection();
			String sql = "select * from student where no = ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, no);
			
			rs = pstmt.executeQuery();
			
			//검색행이 있는 경우 dTO인스턴스를 생성하고 컬럼값을 반환
			if(rs.next()) {
				student = new StudentDTO();
				student.setNo(rs.getInt("no"));
				student.setName(rs.getString("name"));
				student.setPhone(rs.getString("phone"));
				student.setAddress(rs.getString("address"));
				student.setBirthday(rs.getString("birthday").substring(0, 10));
			}			
			
		}catch (Exception e) {
			System.out.println("selectNoStudent메소드의 sql오류" + e.getMessage());
		}finally {
			close(con, pstmt, rs);
		}
		
		return student;
	}
	
	//이름을 전달받아 student테이블의 저자행을 이름으로 검색하여 학생목록으로 반환하는 메소드
	//=> 다중행 검색
	public List<StudentDTO> selectNameStudentList(String name){
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		List<StudentDTO> list = new ArrayList<StudentDTO>();
		
		try {
			con = getConnection();
			String sql = "select * from student where name = ? order by no";
			pstmt.setString(1, name);
			
			while(rs.next()) {
				StudentDTO dto = new StudentDTO();
				
				dto.setNo(rs.getInt("no"));
				dto.setName(rs.getString("name"));
				dto.setPhone(rs.getString("phone"));
				dto.setAddress(rs.getString("address"));
				dto.setBirthday(rs.getString("birthday").substring(0, 10));
				list.add(dto);
			}
			
		}catch (Exception e) {
			System.out.println("selectNameStudentList메소드의 sql오류" + e.getMessage());
		}finally {
			close(con, pstmt, rs);
		}
		
		return list;
	}
	
	//student테이블의 저장행을 모두 검색하여 학생목록으로 반환하는 메소드
	public List<StudentDTO> selectAllStudentList(String name){
		Connection con = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		List<StudentDTO> list = new ArrayList<StudentDTO>();
		
		try {
			con = getConnection();
			String sql = "select * from student order by no";
			pstmt.setString(1, name);
			
			while(rs.next()) {
				StudentDTO dto = new StudentDTO();
				dto.setNo(rs.getInt("no"));
				dto.setName(rs.getString("name"));
				dto.setPhone(rs.getString("phone"));
				dto.setAddress(rs.getString("address"));
				dto.setBirthday(rs.getString("birthday").substring(0, 10));
				list.add(dto);
			}
			
		}catch (Exception e) {
			System.out.println("selectAllStudentList메소드의 sql오류" + e.getMessage());
		}finally {
			close(con, pstmt, rs);
		}
		
		return list;
	}
}

 

📌DBCP(DataBase Connection Pool)

  • 관련 인스턴스를 생성하여 Connection인스턴스를 반환하거나, 제거하는 기능을 제공하기 위한 클래스
  • dbms 관련 dao클래스에서 상속받아 사용하는 클래스
  • 상속만을 목적으로 하는 추상클래스로 선언하는 것을 권장.
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.jdbc.PoolDataSourceFactory;

//DBCP(DataBase Connection Pool)관련 인스턴스를 생성하여 Connection인스턴스를
//반환하거나, 제거하는 기능을 제공하기 위한 클래스
//=> dbms 관련 dao클래스에서 상속받아 사용하는 클래스
//=> 상속만을 목적으로 하는 추상클래스로 선언하는 것을 권장.

public abstract class jdbcDAO {
	private static PoolDataSource _pds;
	
	static {
		_pds = new PoolDataSourceFactory().getPoolDataSource();
		try {
			_pds.setConnectionFactoryClassName("oracle.jdbc.driver.OracleDriver");
			_pds.setURL("jdbc:oracle:thin:@localhost:1521:xe");
			
			_pds.setUser("scott");
			_pds.setPassword("tiger");
			_pds.setInitialPoolSize(3);
			_pds.setMaxPoolSize(5);
			_pds.getConnection().close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public Connection getConnection() {
		Connection con = null;
		try {
			con = _pds.getConnection();
			
		}catch (SQLException e) {
			e.printStackTrace();
		}
		return con;
	}
	
	public void close(Connection con , PreparedStatement pstmt, ResultSet rs) {
		try {
			if(rs != null) rs.close();
			if(pstmt != null) pstmt.close();
			if(con != null) con.close();
		}catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public void close(Connection con , PreparedStatement pstmt) {
		try {
			//if(rs != null) rs.close();
			if(pstmt != null) pstmt.close();
			if(con != null) con.close();
		}catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 

📌정규표현식(Regular Expression) :

  • 메타 문자 등을 이용하여 일정한 규칙의 문자열을 표현하는 방법
  • ^문자열 : 문자열로 시작됨을 의미
  • 문자열$ : 문자열로 종료됨을 의미
  •   . : 임의의 하나의 문자를 의미 (\)문자는 표현 불가능
  • [문자1문자2문자3] : 나열된 문자들 중 하나를 의미
  • [^문자1문자2문자3] : 나열된 문자들이 아닌 문자들 중 하나를 의미(일종의 not)
  • [문자1 - 문자2] : 문자1부터 문자2범위의 문자 중 하나를 의미
  • {문자열1|문자열2} : 나열된 문자열들 중 하나를 의미 (1아니면 2)
  • 문자열+ : 문자열이 한번이상 반복됨을 의미
  • 문자열* : 문자열이 0번이상 반복됨을 의미
  • 문자열? : 문자열이 0번또는 1번 존재함을 의미
  • 문자열{숫자} : 문자열이 숫자만큼의 반복됨을 의미
  • 문자열{숫자1, 숫자2} : 문자열이 숫자1부터 숫자2 범위만큼의 반복됨을 의미
  • \s : 공백이 존재하는 문자열을 의미 
  • \S : 공백이 존재하지 않는 문자열을 의미
  •  \w : 영문자, 숫자, 특수문자(_)의 문자로만 표현되는 문자열을 의미
  • \W : 영문자, 숫자, 특수문자(_)의 문자를 제외한 문자로 표현되는 문자열ㅇ르
  • \d : 숫자형태의 문자로만 표현되는 문자열을 의미
  • \D : 숫자 형태의 문자를 제외한 문자로 표현되는 문자열을 의미
  • \메타문자 : 메타문자를 문자로 표현
  • (?!) 문자열 : 문자열에서 대소문자를 구분하지 않음을 의미
  • (?=문자열) : 문자열을 포함하고 있음을 의미
  • (?!문자열) : 문자열을 포함하고 있지 않음을 의미
  • \\ : \ 문자를 표현

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/* 	정규표현식(Regular Expression) : 메타 문자 등을 이용하여 일정한 규칙의 문자열을 표현하는 방법
 * 	
 	^문자열 : 문자열로 시작됨을 의미
 	문자열$ : 문자열로 종료됨을 의미
 	. : 임의의 하나의 문자를 의미	(\)문자는 표현 불가능
 	[문자1문자2문자3] : 나열된 문자들 중 하나를 의미
 	[^문자1문자2문자3] : 나열된 문자들이 아닌 문자들 중 하나를 의미(일종의 not)
 	[문자1 - 문자2] : 문자1부터 문자2범위의 문자 중 하나를 의미
 	{문자열1|문자열2} : 나열된 문자열들 중 하나를 의미 (1아니면 2)
 	문자열+ : 문자열이 한번이상 반복됨을 의미
 	문자열* : 문자열이 0번이상 반복됨을 의미
 	문자열? : 문자열이 0번또는 1번 존재함을 의미
 	문자열{숫자} : 문자열이 숫자만큼의 반복됨을 의미
 	문자열{숫자1, 숫자2} : 문자열이 숫자1부터 숫자2 범위만큼의 반복됨을 의미
 	
 	\s : 공백이 존재하는 문자열을 의미
 	\S : 공백이 존재하지 않는 문자열을 의미
 	\w : 영문자, 숫자, 특수문자(_)의 문자로만 표현되는 문자열을 의미
 	\W : 영문자, 숫자, 특수문자(_)의 문자를 제외한 문자로 표현되는 문자열을 의미
 	\d : 숫자형태의 문자로만 표현되는 문자열을 의미
 	\D : 숫자 형태의 문자를 제외한 문자로 표현되는 문자열을 의미
 	\메타문자 : 메타문자를 문자로 표현
 	
 	(?!) 문자열 : 문자열에서 대소문자를 구분하지 않음을 의미
 	(?=문자열) : 문자열을 포함하고 있음을 의미
 	(?!문자열) : 문자열을 포함하고 있지 않음을 의미
 	\\: \ 문자를 표현
 
 * */


//키보드로 입력받은 값에 대한 검증 프로그램
public class Validation {
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		System.out.println("아이디 입력 >> ");
		String id = br.readLine();
		
		//기본 유효성검사
		//입력값의 존재유무
		if(id == null || id.equals("")) {
			System.out.println("에러 : 아이디를 반드시 입력해 주세요");
			System.exit(0);
		}
		
		//--------------------------------------------------------방법1-----------------------------------------------------------
		//입력규칙에 의한 유효성 검사 >> 아이디는 영문자로 시작되며, 영문자 숫자, 특수문자_의 조합으로 6~20범위의 문자로 입력되도록 설정
		//=>정규표현식을 이용하여 입력값에 유효성 검사를 하도록 한다
		//Pattern.matches(regx - 정규표현식, charsequence - inpt) : 정규표현식과 입력값을 비교하여 boolean결과를 반환하는 메소드
		//=> flase 반환 : 불일치, true : 일치
		if(!Pattern.matches("^[a-zA-Z][a-zA-z0-9]{5,19}$", id)) {
			System.out.println("에러 : 아이디가 형식에 맞지 않습니다.");
			System.exit(0);
		} else {
			System.out.println("정상정인 아이디 입니다.");
		}
		
		//--------------------------------------------------------방법2-----------------------------------------------------------
		//이방법이 좋은이유 : 내가 원하는 문자가 존재하는지의 유무나 기타 등등 많은 메소드를 사용할 수 있기 때문이다.
		//Pattern : 정규표현식을 저장하기 위한 클래스
		//문자열을 전달받아 정규표현식으로 저장한 pattern인스턴스를 반환하는 메소드
		Pattern idPattern = Pattern.compile("^[a-zA-Z]\\w{5,19}$");
		
		//정규표현식과 문자열을 비교 처리하는 기능을 제공하기 위한 클래스
		//Matcher.matcher(CharSequence input) : Pattern인스턴스에 저장된 정규표현식과 비교하기 위한 문자열을 전달받아 처리하는 Matcher 인스턴스를 반환
		Matcher idMatcher = idPattern.matcher(id);  
		
		//Matches() : 정규표현식과 입력값을 비교하여 결과값을 반환하는 메소드
		if(!idMatcher.matches()) {
			System.out.println("에러 : 아이디가 형식에 맞지 않습니다.");
			System.exit(0);
		}else {
			System.out.println("정상정인 아이디 입니다.");
		}
		
		System.out.println("비밀번호 입력 >> ");
		String pwd = br.readLine();
		
		if(pwd == null || pwd.equals("")) {
			System.out.println("에러 : 아이디를 반드시 입력해 주세요");
			System.exit(0);
		}
		
		//영문자 숫자 특수문자(_포함)문자를 반드시 한개이상 포함하며, 8~30범위의 문자로 입력되도록 설정
		String passwordReg = "^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[~!@#$%^&*_+-]).{8,30}";
		
		if(!Pattern.matches(passwordReg, pwd)) {
			System.out.println("에러 : 비밀번호가 형식에 맞지 않습니다.");
			System.exit(0);
		}
		
		
		System.out.println("이메일 입력 >> ");
		String email = br.readLine();
		
		if(email == null || email.equals("")) {
			System.out.println("에러 : 이메일을 반드시 입력해 주세요");
			System.exit(0);
		}
		
		//영문자 숫자 특수문자(_포함)문자를 반드시 한개이상 포함하며, 8~30범위의 문자로 입력되도록 설정
		//String passwordReg = "^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[~!@#$%^&*_+-]).{8,30}";
		//이메일은 [사용자명@도메인]형식의 문자로 입력되도록 작성
		String emailReg = "^([a-zA-Z0-9_-]+@[a-zA-Z0-9]+(\\.[a-zA-Z0-9]+)+)";
		if(!Pattern.matches(emailReg, email)) {
			System.out.println("에러 : 이메일이 형식에 맞지 않습니다.");
			System.exit(0);
		}else {
			System.out.println("정상정인 이메일 입니다.");
		}
		
	}
}
저작자표시 (새창열림)

'💻 수업정리 (2020) > 오라클' 카테고리의 다른 글

[7/1] PreparedStatement  (0) 2020.07.01
[6/30]ConnectionFactory와 ResultSet커서 이용  (0) 2020.06.30
[6/29]JDBC연동 ( + 리플랙션에 대해서 알아두기)  (0) 2020.06.29
[6/26] 객체권한, 저장프로시저, 트리거  (0) 2020.06.26
[6/25] 인라인뷰와 시퀀스, 권한 부여  (0) 2020.06.25
    '💻 수업정리 (2020)/오라클' 카테고리의 다른 글
    • [7/1] PreparedStatement
    • [6/30]ConnectionFactory와 ResultSet커서 이용
    • [6/29]JDBC연동 ( + 리플랙션에 대해서 알아두기)
    • [6/26] 객체권한, 저장프로시저, 트리거
    주다람
    주다람
    신입 어린이 -> 주니어개발자 성장중

    티스토리툴바