자바 gui 예약프로그램 - jaba gui yeyagpeulogeulaem

🙏 들어가기에 앞서 작성한다

이 글을 작성한지 5개월이 지났다, 그럼에도 많은 분들이 이 글을 읽고 있는 것 같다.
이렇게 앞단에 추가적인 내용을 작성하는 이유는 짧지만 먼저 코딩을 배운 사람으로서,
이 글의 작성자로서, 전공자보단 비전공자가 더 많이 읽을거라 생각되기에
이 글을 읽을때 잘못된 점은 따라하지 않길 바라며 작성한다.

1. 이 글의 코드가 정답이라고 생각하지 말고 다양한 코드를 찾아보고 직접 경험하길 바란다.
   이 코드를 작성할 때는 비전공자로서 2개월 배운 상태였으니 과연 좋은 코드를 작성했을까?

2. 시간이 지나면서 느낀점은 메소드를 작성할 때,
   한 메소드에는 최대한 한 가지의 기능만을 구현하도록 노력해라.
   이후 이 글을 읽는 당신들도 지금 당장은 감이 안올수도 있지만 코딩을 계속 하다보면 느낄 것이다.
   한 메소드 안에 모든 기능이 구현되면 가독성이 떨어짐은 물론이고 코드의 복잡성만 상승한다.

   이 말이 어떤 말인지 이해가 가지 않는다면 "클린코드" 라는 책을 꼭 읽어보길 바란다.

3. 클래스명, 메소드명, 변수명 이름을 짓는 모든 것들은 그 의미가 명확하게 지어야 한다.
   다른 사람이 이름을 읽었을때 "이건 편의점에서 음식을 사는 행위가 담긴 코드구나" 라는 예시와 같이
   명확하게 느껴지게 작성해라, 줄임말은 멋부리는 거다 길어도 좋으니 명확하게 작성해라
   이 또한 "클린코드" 라는 책에 작성되어 있다.

등등 많은 잘못된점이 있겠지만 이 정도만이라도 고쳐서 지금부터 코딩 습관을 들이면
이후 좋은 프로그래머가 될 것이라 생각된다. 다들 잘 되길 바라겠다.

자바 스윙을 이용한 항공사 예약 프로그램 만들기(Team project/Cloud Airline )


Toy Project이고, DB에는 저장이 되지만 진짜 항공사와 연계하여 예약까지 되는 시스템을 구현한 것은 아니라는 점을 미리 알리고 시작한다.

이 코드를 올리는 이유는 내가 했었던 프로젝트에 대한 기록도 있겠지만
나처럼 국비지원 교육을 다니며 처음 시작하는 사람들이
어떻게 시작하면 될지에 대해 감을 잡지 못한다면

한 번 훑어 봄으로써 "아 이 사람은 이렇게 했구나" 하는 길잡이의 역할로, 도움이라도 되길 바라는 것이 목적이겠다.

팀 프로젝트로 진행하였기 때문에 내가 작성한 코드만 업로드하도록 하겠다.
* 다만, 크게는 고객페이지 관리자 페이지로 나뉘어 있으나 내가 작성한 frame과 코드를 기반으로 수정 변경돼서 만들어진 부분이 많기 때문에 거진 비슷하다고 생각하면 되겠다.
* Oracle DataBase Data도 있으나 이 부분은 공개하지 않도록 하겠다.

내가 만든 페이지의 구성은 총 8가지이며 각 페이지당 View, DB, VO로 나뉘어 있다.


1. 메인(로그인 화면)
1)로그인시 아이디, 비밀번호 1차적인 오류 제한 기능 구현
> 아이디, 비밀번호 미입력시 dialog message
> 잘못된 아이디 비밀번호 입력시 dialog message
2) 비밀번호 까지 작성하고 enter key 입력 시 로그인 기능 수행
3) 상단 구름과 Thread를 통해 우에서 좌로 움직이는 비행기 구현하여 항공사 프로그램이라는 것을 어필

2. 회원가입
1) 아이디 중복확인 후 회원가입 가능 기능
2) 아이디 길이 및 사용되는 특수문제 제한 기능
3) 비밀번호 길이 및 사용되는 특수문자 제한 기능
4) 비밀번호 일치여부 확인 기능
5) 이메일 @과. 확인하여 제한 기능

// 고객 페이지, 관리자 페이지로 나뉘어 있으며
frame을 만들어 두어 가운데 change 패널만 변경되는 방식을 이용했다.

3. 고객페이지 항공일정 (로그인 후 화면)
1) 상단 패널 로그인한 사람 이름 반영, 메뉴 마우스 클릭을 통해중단 패널 화면 전환
마이페이지 메뉴는 마우스를 올려놓을 경우 팝업 메뉴 출력
2) 중단에 있는 항공일정은 오늘의 ( 한국->외국 ) / ( 외국->한국 ) 항공 일정을 보여주고
현재 시간을 기준으로 이전 일정은 제외하고 출력
3) 하단 패널은 세계 주요 도시 시간이 10초 단위로 전환 ( 국기 포함 )

4. 예약하기
1) 날짜 선택 후 다음 단계 이동 가능
2)
달력 아이콘 선택 시 현재 연도 / 월을 기준으로 달력 출력
날짜 첫 번째 클릭시 출발 날짜, 두 번째 클릭시 도착 날짜 textField입력 / 반복
3)
당일보다 이전 날짜를 선택할 경우 다음 단계 이동 불가
4)
예약은 본인 포함 동승자 4명까지만 예약 가능하도록 제한

5. 예약하기 2
1) 항공편 선택 화면, 편도 선택 시 출발할 때의 일정만 출력
2) 예약자 정보 입력 화면, 정보 입력
3) 예약자 정보입력 후 정확히 입력하였는지 확인하도록 체크 생성, 클릭 후 다음 단계 이동 가능
4) 동승자의 모든 정보를 입력

6. 예약하기 3
1) 출발 편에 예약되어 있는 좌석번호는 검은색으로 출력 및 enabled
2) 내가 선택한 좌석은 회색으로 출력 및 좌석번호 우측에 출력
3) 한번 더 클릭할 경우 다시 하얀색으로 표시 및 체크한 좌석번호도 제거

7. 예약하기 4
1) 선택 항공 내역과 탑승자 정보 출력
2) 모든 사항 체크 후 결제하기 가능
3) jpg 파일로 예약 확인서 저장됨
4) 마지막 예약 확인된 내용 출력
5) 정보 입력을 잘못할 경우 모든 내용 초기화 후 다시 입력

8. 마이페이지
1) 마일리지 현황 및 탑승 횟수 확인 가능
2) 사용내역을 확인 가능
3) 회원정보 수정 가능, 공백으로 둘 경우 전에 입력되어 있던 데이터 그대로 저장됨
4) 회원 탈퇴 시 모든 데이터 삭제 가능

프로젝트하며 느낀 점


구현하면서 있었던 애로사항에 대해 몇 자 적겠다.

1. 자바 스윙만으로 만들기에는 부족한 점이 많았다.
 > 특히나 UI 구현 부분에서 다소 떨어지는 듯하다

2. 자바만을 이용하니 한계점은 분명히 있는 듯했다.

3. 화면 이동을 구현하는데 가장 고통을 받았다.
 > 처음 틀을 잡을 때 기본 틀을 상/중/하단으로 나누어 시작했고 중단만 바꿔주는 식으로 시작했다.
 > 처음에는 다른 페이지로 이동하는 모션을 해당 페이지의 데이터를 지워주고 다시 뿌려주는 방식으로도 잘 해결됐다.
    하지만 페이지 내에서 다음 페이지로 이동하는 기능을 만들기 시작하면서 이 기능이 먹통이 되었다.
    ex) 예약(시간, 날짜, 위치 입력) -> 다음 페이지 예약(항공편 선택) -> 다음페이지 예약(탑승자 정보 입력).....

   분석해본 결과 이유로는 프로젝트를 실행할 경우 static으로 지정한 데이터는 처음에 불러온 데이터가 저장되는데
   이 데이터를 처음에 저장된 데이터는 지우는 기능을 사용할 경우 본인이 무엇을 지워야 하는지 알기 때문에 가능하다.

 

하지만 다음 페이지로 이동한다면? 이 데이터는 내가 알고 있는 데이터는 처음에 알았던 데이터인데
  다음 페이지에 대한 데이터를 갖고 있지 않기 때문에 지우기가 불가능했다.
  어떻게 해서든 다음 페이지에 대한 데이터를 갖고 있게 하고 싶었지만 구현이 되지 않아 setvisible을 통해
  이전 페이지를 가리고(false) 다음 페이지를(true)하는 방식으로 바꾸어 페이지 이동이 구현 가능해졌다.

4. 최대한 객체지향의 이점을 활용하기 위해 기능을 다양하게 그리고 중복이 없도록
   효율적으로 나누는데 중점을 가지고 진행했다.
 > 얼마나 잘 이뤄졌는지는 현업에 가보지 않았으니 잘했는지는 모르겠다만 최대한 노력은 했다.

5. 일부러 많은 방법들을 사용해보기 위해 페이지마다 다른 방식으로 만들어도 봤다.
 > border, grid 만으로도 잘 만들 수 있다. 다만, 정말 이건 안 되겠다 싶은 레이아웃이 아니라면
    setBound 방식으로 좌표를 통해 위치를 지정하는 방식은 웬만하면 지양하는 게 좋다는 의견이다.
    나중에 오류 또는 수정사항이 있어 고치게 될 경우
    모든 좌표를 다 고쳐야 할 수도 있기에 매우 비효율적이게 되었었다.

6. GitHub를 반드시 이용하라
 > 팀원들이 github를 이용하는 방법을 모르니 지금까지 한 데이터 몽땅 날아갈까 봐 사용을 하지 않더라...
   나도 2번인가 3번 정도 데이터에 문제가 있어 고생하긴 했지만
   팀 협업을 위해서는 필수이기 때문에 다 같이 공부해서 꼭 꼭 꼭 사용해서 협업을 하기 바란다.

7. 자바 스윙을 이용해 프로젝트하기 전부터 검색해서 알았던 것이 있다.
 > 자바 스윙을 현업에서 사용하지 않는다.
 > 즉, 자바 스윙에 목숨 걸고 프로젝트 잘해야지! 하지 말고, 얼마나 코드를 깔끔하게 중복 없이 작성할까에 대해 더 중점을 두고 진행하길 추천한다.

8. 최대한 주석을 활용하자
 > 주석을 아예 안 적은 사람들 코드를 보면 이게 그래서 뭔데? 뭐하는 코드인데? 를
    계속 분석만 해야 하니까 시간도 아깝고 매우 비효율적이었다.
 > 나도 지금에 와서 봤을때 이게 뭐하는 부분이였지? 하는 것들이 있다.
    조금 읽어보면 기억이 나긴 하지만 주석이 있는것이 추후에 반드시 도움 될것이다.

이 글을 읽는 사람들에게 도움이 되길 바란다.


1. 메인(로그인 화면)
1) 로그인 시 아이디, 비밀번호 1차적인 오류 제한 기능 구현
> 아이디, 비밀번호 미입력 시 dialog message
> 잘못된 아이디 비밀번호 입력시 dialog message
2) 비밀번호까지 작성하고 enter key 입력 시 로그인 기능 수행
3) 상단 구름과 Thread를 통해 우에서 좌로 움직이는 비행기 구현하여 항공사 프로그램이라는 것을 어필

자바 gui 예약프로그램 - jaba gui yeyagpeulogeulaem
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

import dbAll.AirlineLoginDAO;

public class AirlineMain extends JFrame implements ActionListener{
	Font titleFnt = new Font("휴먼둥근헤드라인",Font.BOLD,32);
	Font fnt = new Font("굴림체",Font.BOLD,14);
	JPanel mainPane = new JPanel();
	JPanel loginPane = new JPanel();
		JPanel topPane = new JPanel();
			JLabel loginTitle = new JLabel("CLOUD AIRLINE");
		JPanel centerPane = new JPanel();
			//이미지
			static ImageIcon icon = new ImageIcon("img/flights.png");
			static Image im = icon.getImage();
			Image im2 = im.getScaledInstance(300, 300, Image.SCALE_DEFAULT);
			ImageIcon icon2 = new ImageIcon(im2);
			JLabel lbl = new JLabel(icon2);
		JPanel southPane = new JPanel();
			JPanel southCenterPane = new JPanel();
			JPanel idPane = new JPanel();
				JLabel idLbl = new JLabel("USERNAME");
				static JTextField idField = new JTextField(20);
			JPanel pwdPane = new JPanel();
				JLabel pwdLbl = new JLabel("PASSWORD");
				JPasswordField pwdField = new JPasswordField(20);
			JPanel btnPane = new JPanel();
				JButton joinBtn = new JButton("회원가입");
				JButton loginBtn = new JButton("로그인");
	
		JPanel mainSouthPane = new JPanel();
			AirlineMoving move = new AirlineMoving();
	public AirlineMain() {
		//////////////////////////레이아웃////////////////////////

		add(mainPane);
		
		// 메인 패널 레이아웃 그리드백레이아웃 
		mainPane.setLayout(new GridBagLayout());
		
		//그리드백 제약사항을 정의
		GridBagConstraints gbc = new GridBagConstraints();
		
		// 전체를 그리드백레이웃으로 채운다
		gbc.fill = GridBagConstraints.BOTH;
	
		// moving
		gbc.weightx=1.0;
		gbc.weighty=1.5;
		gbc.gridx=0;
		gbc.gridy=0;
		mainPane.add(move,gbc);
		
		// grid top
		gbc.weightx=1.0;
		gbc.weighty=0.5;
		gbc.gridx=0;
		gbc.gridy=1;
		mainPane.add(loginPane,gbc);
			loginPane.setLayout(new BorderLayout());
			loginPane.add(loginTitle);
			// 제목 폰트 설정
			loginTitle.setFont(titleFnt);
			loginTitle.setHorizontalAlignment(JLabel.CENTER);
//			loginTitle.setVerticalAlignment(JLabel.BOTTOM);
			loginPane.setBackground(Color.white);
	
		// grid center
		gbc.weightx=1.0;
		gbc.weighty=3.0;
		gbc.gridx=0;
		gbc.gridy=2;
		mainPane.add(centerPane,gbc);
			centerPane.setLayout(new BorderLayout());
			centerPane.add(lbl);
			centerPane.setBackground(Color.white);
			
		
		//grid south
		gbc.weightx=1.0;
		gbc.weighty=2.0;
		gbc.gridx=0;
		gbc.gridy=3;
		mainPane.add(southPane,gbc);
			southCenterPane.setLayout(new GridLayout(3,1));
			// 아이디 패널
			southCenterPane.add(idPane);
				idPane.add(idLbl);
				idPane.add(idField);
				idPane.setFont(fnt);
				idPane.setBackground(Color.white);
			//패스워드 패널
			southCenterPane.add(pwdPane);
				pwdPane.add(pwdLbl);
				pwdPane.add(pwdField);
				pwdPane.setFont(fnt);
				pwdPane.setBackground(Color.white);
			// 회원가입 로그인 버튼 패널
			southCenterPane.add(btnPane);
				btnPane.add(joinBtn);
					joinBtn.setBackground(new Color(0,130,255));
					joinBtn.setForeground(Color.white);
				btnPane.add(loginBtn);
					loginBtn.setBackground(new Color(0,130,255));
					loginBtn.setForeground(Color.white);
				btnPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
				btnPane.setBackground(Color.white);
			southPane.add(southCenterPane);
			southPane.setBackground(Color.white);
			southCenterPane.setBackground(Color.white);
					
		// 전체화면 풀릴경우 기본화면 크기
		setResizable(false);
		setSize(1000,800);
		// 화면 보이기 여부
		setVisible(true);
		// 자원해제, 끄기
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		// 타이틀
		setTitle("CLOUD AIR");
		setIconImage(im);
		// 이벤트
		joinBtn.addActionListener(this);
		loginBtn.addActionListener(this);
		// 키 이벤트 (로그인)
		pwdField.addKeyListener(new KeyAdapter() {
			public void keyReleased(KeyEvent e) {
				int key = e.getKeyCode();
				if(key==KeyEvent.VK_ENTER) {
					getLoginData();
				}
			}
		});

		//////////////무브 클래스 사이즈와 바탕 정의////////
		move.setBackground(Color.white);
		move.getFrameSize();

		Thread t1 = new Thread(move);
		t1.start();
		/////////////////////////////////
	}
	////////////////////////// 이벤트 등록//////////////////////
	public void actionPerformed(ActionEvent ae) {
		Object eventBtn = ae.getSource();
		if(eventBtn==joinBtn) {
			dispose();
			new AirlineSignUp();
		} else if(eventBtn==loginBtn) {
			getLoginData();
		}
	}
	////////////////////////// 로그인 db //////////////////////
	public void getLoginData() {
		String user_id = idField.getText();
		String user_pwd = pwdField.getText();
		String admin[] = {"ghdrlfehd"};
		AirlineLoginDAO dao = new AirlineLoginDAO();
		int customLogin = 0;
		for(int i=0;i<admin.length;i++) {
			if(user_id.equals(admin[i])) {
				int loginCheck = dao.getLogin(user_id, user_pwd);
				if(loginCheck == 0)JOptionPane.showMessageDialog(this, "아이디 또는 비밀번호가 틀렸습니다.");
				else if(loginCheck==1) {
					customLogin = 1;
					dispose();
					Thread sta = new Thread(new EmpMainFrame());
					sta.start();
					break;
				}
			}
		}
		if(customLogin==0) {
			if(user_id.equals("")) {
				JOptionPane.showMessageDialog(this, "아이디를 입력하셔야 합니다");
			} else if(user_pwd.equals("")) {
				JOptionPane.showMessageDialog(this, "비밀번호를 입력하셔야 합니다.");
			} else {
				int loginCheck = dao.getLogin(user_id, user_pwd);
				if(loginCheck == 0) JOptionPane.showMessageDialog(this, "아이디 또는 비밀번호가 틀렸습니다.");
				else if(loginCheck ==1 ) {
					dispose(); // main 종료
					Thread sta = new Thread(new CustomFrame());
					sta.start();// customframe 시작
				}
			}
		}
	}
	
	public static void main(String[]args) {
		new AirlineMain();
	}
}

항공기와 구름


import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.util.Random;

import javax.swing.JPanel;

public class AirlineMoving extends JPanel implements Runnable{
	// 캔버스와 이미지 정의
	private MyCanvas mc = new MyCanvas();
	private Image airplane = Toolkit.getDefaultToolkit().getImage("img/airplane.png");
	private Image cloud1 = Toolkit.getDefaultToolkit().getImage("img/cloud1.png");
	private Image cloud2 = Toolkit.getDefaultToolkit().getImage("img/cloud2.png");
	private int airplaneX, airplaneY;// 항공기 x,y 좌표
	private Random ran = new Random();
	private int[][] r = new int[30][2]; // 구름 위치 랜덤
	private int cloudMotion;// 구름 움직임,
	private int change=0, change1 =0; // 구름 움직이는 기준
	private Dimension frameSize; // 프레임 사이즈와 풀스크린 사이즈 구하기
	public AirlineMoving() {
		setLayout(new BorderLayout());
		setBackground(Color.white);
		add(mc);
	}
	// 스레드 런 메소드
	public void run() {
		while(true) {
			// 스레드 0.1초
			try {Thread.sleep(100);}catch(Exception e) {e.printStackTrace();}
			
			// 비행기 위치가 -100 일 때 첫 위치로 이동
			if(airplaneX==-100) airplaneX = ( (int)frameSize.getWidth()/10 )*10;
			// 비행기는 서쪽으로 쭉 이동
			airplaneX-=5;
			/////////////// 구름모션////////////			
			change1++;
			if(change1==10) {
				// 구름 모션 +1 , -1
				if(change==0) {
					cloudMotion = 1;
					change = 1;
				} else if(change == 1 ) {
					cloudMotion = -1;
					change = 0;
				}
				change1=0;
			}
			/////////////////////////////////
			mc.repaint();
		}
	}
	///////////////// 캔버스///////////////
	class MyCanvas extends Canvas{
		public void paint(Graphics g) {
			g.drawImage(airplane, airplaneX, airplaneY, 100, 100, this);
			for(int i=0; i<r.length;i++) {
				if(i<(r.length/2)) g.drawImage(cloud1, r[i][0]+cloudMotion, r[i][1], 40, 20, this);
				else if(i>=(r.length/2)) g.drawImage(cloud2, r[i][0]+cloudMotion, r[i][1], 40, 20, this);
			}
		}
	}
	
	////////////////// 프레임 사이즈 구하기///////////////
	public void getFrameSize() {
		frameSize = getSize();
		airplaneSize();
		cloudSize();
	}
	
	//// 항공기 사이즈////////
	public void airplaneSize() {
		airplaneX = ( (int)frameSize.getWidth()/10 )*10;
		airplaneY = (( (int)frameSize.getHeight()/2 - 50) /10 ) *10;

	}
	
	///////// 구름 위치//////////
	public void cloudSize(){
		for(int i =0; i<r.length;i++) {
			r[i][0] = ran.nextInt(((int)frameSize.getWidth()/10))*10;
			r[i][1] = ran.nextInt(((int)frameSize.getHeight()/10))*10;
		}
	}
}

Database

package dbAll;

import java.util.ArrayList;
import java.util.List;

public class AirlineLoginDAO extends DBConn{

	public AirlineLoginDAO() {}
	public List<AirlineLoginVO> LoginAllSelect(){
		List<AirlineLoginVO> lst = new ArrayList<AirlineLoginVO>();
		try {
			getConn();
			sql = "select user_id, user_pwd from ac_user";
			
			pstmt = conn.prepareStatement(sql);
			
			rs = pstmt.executeQuery();
			while(rs.next()) {
				AirlineLoginVO vo = new AirlineLoginVO(rs.getString(0),rs.getString(1));
				lst.add(vo);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			dbClose();
		}
		return lst;
	}
	
	public int getLogin(String user_id,String user_pwd){
		List<AirlineLoginVO> lst = new ArrayList<AirlineLoginVO>();
		
		int state = 0;
		try {
			getConn();
			sql = "select user_id, user_pwd from ac_user where user_id = ? and user_pwd = ?";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, user_id);
			pstmt.setString(2, user_pwd);
			
			rs = pstmt.executeQuery();
			if(rs.next()) state = 1;
			
		} catch(Exception e) {
			System.out.println("DB 아이디 비밀번호 확인에러"+e.getMessage());
		} finally {
			dbClose();
		}
		return state;
	}
	
}
package dbAll;


public class AirlineLoginVO {
	private String user_id;
	private String user_pwd;
	
	public AirlineLoginVO() {}
	public AirlineLoginVO(String user_id,String user_pwd) {
		this.user_id = user_id;
		this.user_pwd = user_pwd;
	}
	public String getUser_id() {
		return user_id;
	}
	public void setUser_id(String user_id) {
		this.user_id = user_id;
	}
	public String getUser_pwd() {
		return user_pwd;
	}
	public void setUser_pwd(String user_pwd) {
		this.user_pwd = user_pwd;
	}
}

DBConnection

package dbAll;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DBConn {
	static {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch(Exception e) {
			System.out.println("DB로딩 에러발생"+e.getMessage());
		}
	}
	String sql = null;
	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	String url = "jdbc:oracle:thin:@localhost:1521:xe";
	String username = "c##scott";
	String userpwd = "tiger";
	
	public DBConn() {}
	public void getConn() {
		try {
			conn = DriverManager.getConnection(url,username,userpwd);
		}catch(Exception e) {
			System.out.println("DB연결 에러발생"+e.getMessage());
		}
	}
	public void dbClose() {
		try {
			if(rs!=null)rs.close();
			if(pstmt!=null)pstmt.close();
			if(conn!=null)conn.close();
		}catch(Exception e) {
			System.out.println("DB종료가 실패하였습니다."+e.getMessage());
		}
	}
}