공부의 기록/자바 풀 스택 : 수업내용정리

자바 풀 스택 12/31 오전 기록 028-1

파티피플지선 2024. 12. 31. 13:20

9:25 경 도착 ㅎ

2024년 마지막 날 아침, 일어나기 힘들었는데 지지 않고 일어났다(물론 여러번 알람을 미루긴 했지만 원래 일찍 일어나던 사람이라 참 다행이다 그렇게 미뤄도 늦지 않았어)

어제 계획했던 건 못하겠지만..

오늘 밤에 혼자 무뼈 닭발이랑 계란찜이랑 주먹밥이랑 맥주 사다가 잔뜩 먹을 생각하니까 벌써 신난다 꺄르륵

 

 

 

<9:30 1교시>

html과 자바스크립트, css 만로 git의 작동 원리를 만들어 놓은거... 대단하다...(변태들)

Explain Git with D3

 

Explain Git with D3

We are going to skip instructing you on how to add your files for commit in this explanation. Let's assume you already know how to do that. If you don't, go read some other tutorials. Pretend that you already have your files staged for commit and enter git

onlywei.github.io

 

git fetch 화면에서 origin/dev 와 origin/master 두 가지의 원격 브랜치가 있길래 git push에서 시도해봤더니 이 페이지에서는 지원을 하지 않는 다는 것 같은데, 이 시뮬레이션 환경 말고 실제로 git 에서는 가능할지 궁금하다.

 

git rebase master

내가 지저분하게(?) 여러 갈래 가지치기 한 이력을 rebase 해서 하나의 가지로 다시 합쳐 버릴 수 있음(충돌이 많이 일어날 수 있음)

 

 

git push 하기 전에 누군가 origin/master에 변경한 사항이 있을 수 있는 것을 fetch+merge 또는 pull 해서 해결하고 push 해야 한다.

 

git 존잼이네 ㅎㅎ

이제 개발만 제대로 하면 되겠당 ㅎㅎㅎ

 

 

 

<10:30 2교시>

 

package test.frame;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MemberFrame extends JFrame implements ActionListener{
	//필요한 필드 정의하기
	JTextField inputName, inputAddr;
	
	//생성자
	public MemberFrame(String title) {
		super(title);
		//레이아웃 설정
		setLayout(new BorderLayout());
		//JLabel 2개
		JLabel label2= new JLabel("이름");
		JLabel label3= new JLabel("주소");
		//JTextField 1개
		inputName = new JTextField(10);
		inputAddr = new JTextField(10);
		//JButton
		JButton addBtn=new JButton("추가");
		//패널에 UI 배치(add는 패널의 메소드)
		JPanel panel =new JPanel();
		panel.add(label2);
		panel.add(inputName);
		panel.add(label3);
		panel.add(inputAddr);
		panel.add(addBtn);
		//패널의 배경색 설정
		panel.setBackground(Color.orange);
		//패널을 프레임의 위쪽에 배치
		add(panel, BorderLayout.NORTH);
		//버튼에 액션 리스너 등록
		addBtn.addActionListener(this);
		
	}
	
	public static void main(String[] args) {
		MemberFrame f=new MemberFrame("회원 정보 관리");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//가독성 좋게+부모자식이라 JFrame.생략하고 
		f.setBounds(100,100,800,500);
		f.setVisible(true);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		//입력한 이름과 주소를 읽어 온다
		String name=inputName.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
		String addr=inputAddr.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
		//입력한 이름과 주소를 MEmebrDto 객체에 담는다
		MemberDto dto=new MemberDto();
		dto.setName(name);
		dto.setAddr(addr);
		//MemberDao 객체를 생성해서
		MemberDao dao=new MemberDao();
		//insert() 메소드를 이용해서 회원 정보를 DB에 저장한다
		dao.insert(dto);
	}
}

 

테이블도 만들음. 다음 교시에 테이블에 출력하는거 이어서 할거임.

여기까지의 코드 백업

더보기
package test.frame;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MemberFrame extends JFrame implements ActionListener{
	//필요한 필드 정의하기
	JTextField inputName, inputAddr;
	
	//생성자
	public MemberFrame(String title) {
		super(title);
		//레이아웃 설정
		setLayout(new BorderLayout());
		//JLabel 2개
		JLabel label2= new JLabel("이름");
		JLabel label3= new JLabel("주소");
		//JTextField 1개
		inputName = new JTextField(10);
		inputAddr = new JTextField(10);
		//JButton
		JButton addBtn=new JButton("추가");
		//패널에 UI 배치(add는 패널의 메소드)
		JPanel panel =new JPanel();
		panel.add(label2);
		panel.add(inputName);
		panel.add(label3);
		panel.add(inputAddr);
		panel.add(addBtn);
		//패널의 배경색 설정
		panel.setBackground(Color.orange);
		//패널을 프레임의 위쪽에 배치
		add(panel, BorderLayout.NORTH);
		//버튼에 액션 리스너 등록
		addBtn.addActionListener(this);
		//회원 목록을 출력할 테이블
		JTable table=new JTable();
		//테이블의 칼럼명을 배열로 미리 준비한다
		String[] colNames= {"번호", "이름", "주소"};
		//테이블에 연결할 모델 객체
		DefaultTableModel model =new DefaultTableModel();
		model.setColumnIdentifiers(colNames);
		model.setRowCount(0);
		
		//모델을 테이블에 연결
		table.setModel(model);
		//스크롤이 가능하도록 테이블을 JScrollPane에 감싼다
		JScrollPane scroll=new JScrollPane(table);
		//JScrollPnae을 프레임의 가운데에 배치하기
		add(scroll, BorderLayout.CENTER);
	}
	
	public static void main(String[] args) {
		MemberFrame f=new MemberFrame("회원 정보 관리");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//가독성 좋게+부모자식이라 JFrame.생략하고 
		f.setBounds(100,100,800,500);
		f.setVisible(true);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		//입력한 이름과 주소를 읽어 온다
		String name=inputName.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
		String addr=inputAddr.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
		//입력한 이름과 주소를 MEmebrDto 객체에 담는다
		MemberDto dto=new MemberDto();
		dto.setName(name);
		dto.setAddr(addr);
		//MemberDao 객체를 생성해서
		MemberDao dao=new MemberDao();
		//insert() 메소드를 이용해서 회원 정보를 DB에 저장한다
		dao.insert(dto);
	}
}

 

<11:30 3교시>

 

package test.frame;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MemberFrame extends JFrame implements ActionListener{
	//필요한 필드 정의하기
	JTextField inputName, inputAddr;
	
	//생성자
	public MemberFrame(String title) {
		super(title);
		//레이아웃 설정
		setLayout(new BorderLayout());
		//JLabel 2개
		JLabel label2= new JLabel("이름");
		JLabel label3= new JLabel("주소");
		//JTextField 1개
		inputName = new JTextField(10);
		inputAddr = new JTextField(10);
		//JButton
		JButton addBtn=new JButton("추가");
		//패널에 UI 배치(add는 패널의 메소드)
		JPanel panel =new JPanel();
		panel.add(label2);
		panel.add(inputName);
		panel.add(label3);
		panel.add(inputAddr);
		panel.add(addBtn);
		//패널의 배경색 설정
		panel.setBackground(Color.orange);
		//패널을 프레임의 위쪽에 배치
		add(panel, BorderLayout.NORTH);
		//버튼에 액션 리스너 등록
		addBtn.addActionListener(this);
		//회원 목록을 출력할 테이블
		JTable table=new JTable();
		//테이블의 칼럼명을 배열로 미리 준비한다
		String[] colNames= {"번호", "이름", "주소"};
		//테이블에 연결할 모델 객체
		DefaultTableModel model =new DefaultTableModel();
		model.setColumnIdentifiers(colNames);
		model.setRowCount(0);
		
		//모델을 테이블에 연결
		table.setModel(model);
		//스크롤이 가능하도록 테이블을 JScrollPane에 감싼다
		JScrollPane scroll=new JScrollPane(table);
		//JScrollPnae을 프레임의 가운데에 배치하기
		add(scroll, BorderLayout.CENTER);
		
		//프레임 객체가 생성되는 시점에 DB에 있는 내용을 읽어와서 출력할 수 있게 해준다.
		//JTable에 출력할 sample row 데이터
		//Object[] row= {1, "글린다", "오즈"};
		//테이블에 연결된 모델에 row 추가하기
		//model.addRow(row);
	
		//테이블에 출력할 회원 목록 얻어오기
		MemberDao dao = new MemberDao();
		List<MemberDto> list= dao.getList();
		//반복문 돌면서
		for (MemberDto tmp:list ) {
			//MemberDto 객체에 담긴 회원정보를 이용해서 Object[] 에 담은 다음
			Object[] rowData = {tmp.getNum(), tmp.getName(), tmp.getAddr()};
			//테이블에 연결된 모델에 추가하기
			model.addRow(rowData);
		}
		
		
	}//생성자 : 프레임 객체가 생성되는 시점에 만들어짐 
	
	public static void main(String[] args) {
		MemberFrame f=new MemberFrame("회원 정보 관리");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//가독성 좋게+부모자식이라 JFrame.생략하고 
		f.setBounds(100,100,800,500);
		f.setVisible(true);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		//입력한 이름과 주소를 읽어 온다
		String name=inputName.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
		String addr=inputAddr.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
		//입력한 이름과 주소를 MEmebrDto 객체에 담는다
		MemberDto dto=new MemberDto();
		dto.setName(name);
		dto.setAddr(addr);
		//MemberDao 객체를 생성해서
		MemberDao dao=new MemberDao();
		//insert() 메소드를 이용해서 회원 정보를 DB에 저장한다
		dao.insert(dto);
	}
}

 

나는 아직도 확장 for 문을 제대로 돌릴줄 모른다 ㅠㅠ 그게 안되니까 그 이후도 안 됨 ㅠㅠ

//테이블에 출력할 회원 목록 얻어오기

MemberDao dao = new MemberDao();

List<MemberDto> list= dao.getList();

//반복문 돌면서

for (MemberDto tmp:list ) {

    //MemberDto 객체에 담긴 회원정보를 이용해서 Object[] 에 담은 다음

    Object[] rowData = {tmp.getNum(), tmp.getName(), tmp.getAddr()};

     //테이블에 연결된 모델에 추가하기

     model.addRow(rowData);

}

 

 

참조값으로 사용할 수가 없어진 model을 필드로 바꾸기(생성자에서 생성된 이 객체의 참조값이 다른 메소드에서도 필요한 상황 -> 이 값을 지역 변수가 아닌 필드로 옮기기)

동일한 코드 블록은 메소드 안에 집어 넣고 필요한 곳에서 그 메소드를 콜하는 구조로 만들기

 

 

 

package test.frame;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MemberFrame extends JFrame implements ActionListener{
	//필요한 필드 정의하기
	JTextField inputName, inputAddr;
	DefaultTableModel model;
	//생성자
	public MemberFrame(String title) {
		super(title);
		//레이아웃 설정
		setLayout(new BorderLayout());
		//JLabel 2개
		JLabel label2= new JLabel("이름");
		JLabel label3= new JLabel("주소");
		//JTextField 1개
		inputName = new JTextField(10);
		inputAddr = new JTextField(10);
		//JButton
		JButton addBtn=new JButton("추가");
		//패널에 UI 배치(add는 패널의 메소드)
		JPanel panel =new JPanel();
		panel.add(label2);
		panel.add(inputName);
		panel.add(label3);
		panel.add(inputAddr);
		panel.add(addBtn);
		//패널의 배경색 설정
		panel.setBackground(Color.orange);
		//패널을 프레임의 위쪽에 배치
		add(panel, BorderLayout.NORTH);
		//버튼에 액션 리스너 등록
		addBtn.addActionListener(this);
		//회원 목록을 출력할 테이블
		JTable table=new JTable();
		//테이블의 칼럼명을 배열로 미리 준비한다
		String[] colNames= {"번호", "이름", "주소"};
		//테이블에 연결할 모델 객체
		model =new DefaultTableModel(); //생성자에서 생성된 이 객체의 참조값이 다른 메소드에서도 필요한 상황 -> 이 값을 지역 변수가 아닌 필드로 옮기기
		model.setColumnIdentifiers(colNames);
		model.setRowCount(0);
		
		//모델을 테이블에 연결
		table.setModel(model);
		//스크롤이 가능하도록 테이블을 JScrollPane에 감싼다
		JScrollPane scroll=new JScrollPane(table);
		//JScrollPnae을 프레임의 가운데에 배치하기
		add(scroll, BorderLayout.CENTER);
		
		//프레임 객체가 생성되는 시점에 DB에 있는 내용을 읽어와서 출력할 수 있게 해준다.
		//JTable에 출력할 sample row 데이터
		//Object[] row= {1, "글린다", "오즈"};
		//테이블에 연결된 모델에 row 추가하기
		//model.addRow(row);
	
		
		printMember();
		//테이블에 출력할 회원 목록 얻어오기
		//MemberDao dao = new MemberDao();
		//List<MemberDto> list= dao.getList();
		//반복문 돌면서
		//for (MemberDto tmp:list ) {
			//MemberDto 객체에 담긴 회원정보를 이용해서 Object[] 에 담은 다음
			//Object[] rowData = {tmp.getNum(), tmp.getName(), tmp.getAddr()};
			//테이블에 연결된 모델에 추가하기
			//model.addRow(rowData);
		//}
		
		
		//칼럼의 제목 글자 조정
		table.getTableHeader().setFont(new Font("Sans-serif", Font.BOLD, 18));
		table.setFont(new Font("Sans-serif", Font.PLAIN,16));//데이터 글자 크기 14
		table.setRowHeight(25);//각 행의 높이를 조정
		
	}//생성자 : 프레임 객체가 생성되는 시점에 만들어짐 
	
	public static void main(String[] args) {
		MemberFrame f=new MemberFrame("회원 정보 관리");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//가독성 좋게+부모자식이라 JFrame.생략하고 
		f.setBounds(100,100,800,500);
		f.setVisible(true);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		//입력한 이름과 주소를 읽어 온다
		String name=inputName.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
		String addr=inputAddr.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
		//입력한 이름과 주소를 MEmebrDto 객체에 담는다
		MemberDto dto=new MemberDto();
		dto.setName(name);
		dto.setAddr(addr);
		//MemberDao 객체를 생성해서
		MemberDao dao=new MemberDao();
		//insert() 메소드를 이용해서 회원 정보를 DB에 저장한다
		dao.insert(dto);
		
		printMember();

		
	}
	
	//회원 목록을 JTable에 출력하는 메소드
	public void printMember() {
		//기존에 출력된 내용을 초기화한 후에
		model.setRowCount(0);
		
		//테이블에 출력할 회원 목록 얻어오기
		MemberDao dao = new MemberDao();
		List<MemberDto> list= dao.getList();
		//반복문 돌면서
		for (MemberDto tmp:list ) {
			//MemberDto 객체에 담긴 회원정보를 이용해서 Object[] 에 담은 다음
			Object[] rowData = {tmp.getNum(), tmp.getName(), tmp.getAddr()};
			//테이블에 연결된 모델에 추가하기 -> 모델을 필드로 만들기
			model.addRow(rowData);
		}
	}
	
}

 

 

로우를 선택하면 삭제할 수 있는 기능까지 추가하기

4교시에 이어서

 

 

<12:30 4교시>

 

더보기
package test.frame;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MemberFrame extends JFrame implements ActionListener{
	//필요한 필드 정의하기
	JTextField inputName, inputAddr;
	DefaultTableModel model;
	JTable table;
	//생성자
	public MemberFrame(String title) {
		super(title);
		//레이아웃 설정
		setLayout(new BorderLayout());
		//JLabel 2개
		JLabel label2= new JLabel("이름");
		JLabel label3= new JLabel("주소");
		//JTextField 1개
		inputName = new JTextField(10);
		inputAddr = new JTextField(10);
		//JButton
		JButton addBtn=new JButton("추가");
		JButton deleteBtn=new JButton("삭제");
		//패널에 UI 배치(add는 패널의 메소드)
		JPanel panel =new JPanel();
		panel.add(label2);
		panel.add(inputName);
		panel.add(label3);
		panel.add(inputAddr);
		panel.add(addBtn);
		panel.add(deleteBtn);
		//패널의 배경색 설정
		panel.setBackground(Color.orange);
		//패널을 프레임의 위쪽에 배치
		add(panel, BorderLayout.NORTH);
		
		//버튼에 액션 리스너 등록
		addBtn.addActionListener(this);
		deleteBtn.addActionListener(this);
		//버튼에 액션 command 설정
		addBtn.setActionCommand("add");
		deleteBtn.setActionCommand("delete");
		
		//회원 목록을 출력할 테이블-> 필드로 뽑는다 ->여기 있던 JTable table에 대해 앞의 JTable을 지워준다
		table=new JTable();
		//테이블의 칼럼명을 배열로 미리 준비한다
		String[] colNames= {"번호", "이름", "주소"};
		//테이블에 연결할 모델 객체
		model =new DefaultTableModel(); //생성자에서 생성된 이 객체의 참조값이 다른 메소드에서도 필요한 상황 -> 이 값을 지역 변수가 아닌 필드로 옮기기
		model.setColumnIdentifiers(colNames);
		model.setRowCount(0);
		
		//모델을 테이블에 연결
		table.setModel(model);
		//스크롤이 가능하도록 테이블을 JScrollPane에 감싼다
		JScrollPane scroll=new JScrollPane(table);
		//JScrollPnae을 프레임의 가운데에 배치하기
		add(scroll, BorderLayout.CENTER);
		
		//프레임 객체가 생성되는 시점에 DB에 있는 내용을 읽어와서 출력할 수 있게 해준다.
		//JTable에 출력할 sample row 데이터
		//Object[] row= {1, "글린다", "오즈"};
		//테이블에 연결된 모델에 row 추가하기
		//model.addRow(row);
	
		
		printMember();
		//테이블에 출력할 회원 목록 얻어오기
		//MemberDao dao = new MemberDao();
		//List<MemberDto> list= dao.getList();
		//반복문 돌면서
		//for (MemberDto tmp:list ) {
			//MemberDto 객체에 담긴 회원정보를 이용해서 Object[] 에 담은 다음
			//Object[] rowData = {tmp.getNum(), tmp.getName(), tmp.getAddr()};
			//테이블에 연결된 모델에 추가하기
			//model.addRow(rowData);
		//}
		
		
		//칼럼의 제목 글자 조정
		table.getTableHeader().setFont(new Font("Sans-serif", Font.BOLD, 18));
		table.setFont(new Font("Sans-serif", Font.PLAIN,16));//데이터 글자 크기 14
		table.setRowHeight(25);//각 행의 높이를 조정
		
	}//생성자 : 프레임 객체가 생성되는 시점에 만들어짐 
	
	public static void main(String[] args) {
		MemberFrame f=new MemberFrame("회원 정보 관리");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//가독성 좋게+부모자식이라 JFrame.생략하고 
		f.setBounds(100,100,800,500);
		f.setVisible(true);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		//눌러진 버튼의 action command를 읽어온다
		String command=e.getActionCommand();
		if(command.equals("add")) {//java 에서는 문자열 비교를 .equals()메소드를 이용해서 비교해야 한다.  (자바스크립트에서는 command =="add")
			//입력한 이름과 주소를 읽어 온다
			String name=inputName.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
			String addr=inputAddr.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
			//입력한 이름과 주소를 MEmebrDto 객체에 담는다
			MemberDto dto=new MemberDto();
			dto.setName(name);
			dto.setAddr(addr);
			//MemberDao 객체를 생성해서
			MemberDao dao=new MemberDao();
			//insert() 메소드를 이용해서 회원 정보를 DB에 저장한다
			dao.insert(dto);
			
			
		}else if(command.equals("delete")) {
			int selectedRow=table.getSelectedRow();
			if(selectedRow==-1) {
				JOptionPane.showMessageDialog(this, "삭제할 row를 선택하세요");//자바 frame 창에서 알림을 띄우기 this는 알림을 띄울 컴포넌트(멤버프레임)의 참조값, 알림 메시지를 전달.
				return;// 메소드를 여기서 끝내기
			}
			
		}
		
		printMember();

		
	}
	
	//회원 목록을 JTable에 출력하는 메소드
	public void printMember() {
		//기존에 출력된 내용을 초기화한 후에
		model.setRowCount(0);
		
		//테이블에 출력할 회원 목록 얻어오기
		MemberDao dao = new MemberDao();
		List<MemberDto> list= dao.getList();
		//반복문 돌면서
		for (MemberDto tmp:list ) {
			//MemberDto 객체에 담긴 회원정보를 이용해서 Object[] 에 담은 다음
			Object[] rowData = {tmp.getNum(), tmp.getName(), tmp.getAddr()};
			//테이블에 연결된 모델에 추가하기 -> 모델을 필드로 만들기
			model.addRow(rowData);
		}
	}
	
}

 

package test.frame;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import test.dao.MemberDao;
import test.dto.MemberDto;

public class MemberFrame extends JFrame implements ActionListener{
	//필요한 필드 정의하기
	JTextField inputName, inputAddr;
	DefaultTableModel model;
	JTable table;
	//생성자
	public MemberFrame(String title) {
		super(title);
		//레이아웃 설정
		setLayout(new BorderLayout());
		//JLabel 2개
		JLabel label2= new JLabel("이름");
		JLabel label3= new JLabel("주소");
		//JTextField 1개
		inputName = new JTextField(10);
		inputAddr = new JTextField(10);
		//JButton
		JButton addBtn=new JButton("추가");
		JButton deleteBtn=new JButton("삭제");
		//패널에 UI 배치(add는 패널의 메소드)
		JPanel panel =new JPanel();
		panel.add(label2);
		panel.add(inputName);
		panel.add(label3);
		panel.add(inputAddr);
		panel.add(addBtn);
		panel.add(deleteBtn);
		//패널의 배경색 설정
		panel.setBackground(Color.orange);
		//패널을 프레임의 위쪽에 배치
		add(panel, BorderLayout.NORTH);
		
		//버튼에 액션 리스너 등록
		addBtn.addActionListener(this);
		deleteBtn.addActionListener(this);
		//버튼에 액션 command 설정
		addBtn.setActionCommand("add");
		deleteBtn.setActionCommand("delete");
		
		//회원 목록을 출력할 테이블-> 필드로 뽑는다 ->여기 있던 JTable table에 대해 앞의 JTable을 지워준다
		table=new JTable();
		//테이블의 칼럼명을 배열로 미리 준비한다
		String[] colNames= {"번호", "이름", "주소"};
		//테이블에 연결할 모델 객체
		model =new DefaultTableModel(); //생성자에서 생성된 이 객체의 참조값이 다른 메소드에서도 필요한 상황 -> 이 값을 지역 변수가 아닌 필드로 옮기기
		model.setColumnIdentifiers(colNames);
		model.setRowCount(0);
		
		//모델을 테이블에 연결
		table.setModel(model);
		//스크롤이 가능하도록 테이블을 JScrollPane에 감싼다
		JScrollPane scroll=new JScrollPane(table);
		//JScrollPnae을 프레임의 가운데에 배치하기
		add(scroll, BorderLayout.CENTER);
		
		//프레임 객체가 생성되는 시점에 DB에 있는 내용을 읽어와서 출력할 수 있게 해준다.
		//JTable에 출력할 sample row 데이터
		//Object[] row= {1, "글린다", "오즈"};
		//테이블에 연결된 모델에 row 추가하기
		//model.addRow(row);
	
		
		printMember();
		//테이블에 출력할 회원 목록 얻어오기
		//MemberDao dao = new MemberDao();
		//List<MemberDto> list= dao.getList();
		//반복문 돌면서
		//for (MemberDto tmp:list ) {
			//MemberDto 객체에 담긴 회원정보를 이용해서 Object[] 에 담은 다음
			//Object[] rowData = {tmp.getNum(), tmp.getName(), tmp.getAddr()};
			//테이블에 연결된 모델에 추가하기
			//model.addRow(rowData);
		//}
		
		
		//칼럼의 제목 글자 조정
		table.getTableHeader().setFont(new Font("Sans-serif", Font.BOLD, 18));
		table.setFont(new Font("Sans-serif", Font.PLAIN,16));//데이터 글자 크기 14
		table.setRowHeight(25);//각 행의 높이를 조정
		
	}//생성자 : 프레임 객체가 생성되는 시점에 만들어짐 
	
	public static void main(String[] args) {
		MemberFrame f=new MemberFrame("회원 정보 관리");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//가독성 좋게+부모자식이라 JFrame.생략하고 
		f.setBounds(100,100,800,500);
		f.setVisible(true);
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		//눌러진 버튼의 action command를 읽어온다
		String command=e.getActionCommand();
		if(command.equals("add")) {//java 에서는 문자열 비교를 .equals()메소드를 이용해서 비교해야 한다.  (자바스크립트에서는 command =="add")
			//입력한 이름과 주소를 읽어 온다
			String name=inputName.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
			String addr=inputAddr.getText();//this. 이 생략되어 있는데 JTextField의 참조값이 필드에 저장되어 있어서 생략됨
			//입력한 이름과 주소를 MEmebrDto 객체에 담는다
			MemberDto dto=new MemberDto();
			dto.setName(name);
			dto.setAddr(addr);
			//MemberDao 객체를 생성해서
			MemberDao dao=new MemberDao();
			//insert() 메소드를 이용해서 회원 정보를 DB에 저장한다
			dao.insert(dto);
			
			
		}else if(command.equals("delete")) {
			int selectedRow=table.getSelectedRow();
			if(selectedRow==-1) {
				JOptionPane.showMessageDialog(this, "삭제할 row를 선택하세요");//자바 frame 창에서 알림을 띄우기 this는 알림을 띄울 컴포넌트(멤버프레임)의 참조값, 알림 메시지를 전달.
				return;// 메소드를 여기서 끝내기
			}
			int num= (int)model.getValueAt(selectedRow, 0);
			new MemberDao().delete(num);
		}
		
		printMember();

		
	}
	
	//회원 목록을 JTable에 출력하는 메소드
	public void printMember() {
		//기존에 출력된 내용을 초기화한 후에
		model.setRowCount(0);
		
		//테이블에 출력할 회원 목록 얻어오기
		MemberDao dao = new MemberDao();
		List<MemberDto> list= dao.getList();
		//반복문 돌면서
		for (MemberDto tmp:list ) {
			//MemberDto 객체에 담긴 회원정보를 이용해서 Object[] 에 담은 다음
			Object[] rowData = {tmp.getNum(), tmp.getName(), tmp.getAddr()};
			//테이블에 연결된 모델에 추가하기 -> 모델을 필드로 만들기
			model.addRow(rowData);
		}
	}
	
}

 

여기까지가 java의 기초 마무리.

오늘 남은 교시동안 할 거는 내가 사용할 수 있는 app 만들기

0. 주제 기획하고

1. DB에 테이블 만들고

2. Dto, Dao 만들고

3. frame 만들기

 

 

일단 만들거 기획하면.

만들 테이블 주제는 읽을 책 목록

번호 /책 제목/ 저자

읽을 책 목록에 번호나 시퀀스는 필요없지만 연습용으로 만들자

 

테이블과 시퀀스 만들기

테이블 제목 BtR  (Books to Read 대신에 두문자어)

테이블 칼럼

번호(no) - number(자바int), primary key / 책 제목(title)- varchar2(100)(자바String) / 저자(writer) - varchar2(50)(자바String)

데이터베이스 안보고 오랜만에 따라하려니까 헤맸다 ㅋㅋㅋ

휴... 복습 꾸준히 해야겠어 ㅠ

 

시퀀스 seq_BtR 만들기

 

이제 Dto 만들러 가야지

일단 dto 클래스 만드는 건 확실히 쉽다. source에서 생성하면 되기도 하고 내가 방법을 완전히 숙지한 듯

 

아래는 dto 코드

더보기
package test.dto;

public class BtRDto {
	private int no;
	private String title;
	private String writer;
	
	public BtRDto() {}

	public BtRDto(int no, String title, String writer) {
		super();
		this.no = no;
		this.title = title;
		this.writer = writer;
	}

	public int getNo() {
		return no;
	}

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

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}
}