본문 바로가기
Study/중앙정보처리학원과정

31일차. ArrayList와 DTO

by 얏옹이 2022. 12. 7.
반응형

 

2022.12.05 - [Study/중앙정보처리학원과정] - 30일차. DTO(Data Tranfer Object)

 

30일차. DTO(Data Tranfer Object)

오늘은 DTO에 대해서 강의를 들었다. DAO - Data Access Object 는 데이터베이스의 data에 접근하기 위한 객체이며, 보통 Connection을 위한 기능구현까지만 DAO로 분리해서 설정해주는 경우가 많다. DTO - Data

yat-ong.tistory.com

 

30일차 과정과 이어지는 과정으로 생성했던 NoticeBoardDTO 클래스를 이용하면서 NoticeBoardDAO 클래스에서

 

쿼리문을 수행하면서 이를 ArrayList에 담아주는 방식을 알아보겠다.

 

오전에 HTML 수업을 진행하느라 ArrayList에 대한 부분은 적지만. 개인적으로는 HTML보다 더 중요한것이

 

현재 언급하고 있는 ArrayList와 DTO를 좀더 수월하게 사용하는것이 더 중요하다고 판단하였다.

 

NoticeBoard의 전체 목록 조회를 ArrayList로 받아주고 설정하는 코드를 작성해보겠다.

 

먼저 NoticeBoardDTO의 클래스는 아래와 같다.

 

package db.dbEx2;

import java.util.Date;

public class NoticeBoardDTO {
	//field
	private int nbno; //글번호
	private String title; //제목
	private String contant; //내용
	private Date cre_date; //작성일
	private String writer; //작성자
	private int rcnt; //조회수
	private int empno; //회원번호
	
	//defalt constructor
	NoticeBoardDTO() {
		
	}
	
	//매개변수가 있는 constructor
	NoticeBoardDTO(int nbno, String title, String contant, Date cre_date, String writer, int rcnt, int empno) {
		this.nbno = nbno;
		this.title = title;
		this.contant = contant;
		this.cre_date = cre_date;
		this.writer = writer;
		this.rcnt = rcnt;
		this.empno = empno;
	}
	
	
	
	//method
	public int getNbno() {
		return nbno;
	}
	public void setNbno(int nbno) {
		this.nbno = nbno;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContant() {
		return contant;
	}
	public void setContant(String contant) {
		this.contant = contant;
	}
	public Date getCre_date() {
		return cre_date;
	}
	public void setCre_date(Date cre_date) {
		this.cre_date = cre_date;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public int getRcnt() {
		return rcnt;
	}
	public void setRcnt(int rcnt) {
		this.rcnt = rcnt;
	}
	public int getEmpno() {
		return empno;
	}
	public void setEmpno(int empno) {
		this.empno = empno;
	}

	@Override
	public String toString() {
		return "NoticeBoardDTO [nbno=" + nbno + ", title=" + title + ", contant=" + contant + ", cre_date=" + cre_date
				+ ", writer=" + writer + ", rcnt=" + rcnt + ", empno=" + empno + "]";
	}

	
}

 

 

그리고 쿼리문을 실행하는 NoticeBoardDAO에서 전체 컬럼을 조회하는 Select만 우선적으로 ArrayList로 응용해보겠다.

 

public class NoticeBoardDAO {
	//private String sql = ""; 기존 String 타입에서 하단 Stringbuilder로 변경
	Connection con = JdbcUtil.getConnection();
	PreparedStatement stmt = null;
	
	//기존에 void타입의 리턴값이 없는 메소드에서 ArrayList를 리턴하는 메소드로 수정
	List<NoticeBoardDTO> allSelect() { //전체글조회
		StringBuilder sql1 = new StringBuilder(); //단일스레드 환경이므로 buffer보다는 Builder가 더 적합할것이라고 생각
		sql1.append("select nbno,title,contant,cre_date,writer,rcnt,empno");
		sql1.append(" from noticeboard");
		sql1.append(" order by cre_date desc");
		//.append 메소드를 이용하여 Stringbuilder에 쿼리문을 입력
		
		//sql = "select nbno,title,contant,cre_date,writer,rcnt,empno" + 
		//		" from noticeboard order by cre_date desc";
		List<NoticeBoardDTO> dtoArr = new ArrayList();
		try {
			stmt = con.prepareStatement(sql1.toString()); //tostring을 이용하여 값 대입
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()) {
				NoticeBoardDTO dto = new NoticeBoardDTO(); //NoticeBoardDTO의 기본생성자를 호출하여 객체 생성
				int nbno = rs.getInt("nbno");
				String title = rs.getString("title");
				String contant = rs.getString("contant");
				Date cre_date = rs.getDate("cre_date");
				String writer = rs.getString("writer");
				int rcnt = rs.getInt("rcnt");
				int empno = rs.getInt("empno");
				
				//rs.get메소드로 가져온 변수를 NoticeBoardDTO 타입의 참조변수에 set메소드를 이용하여 전체 컬럼의 값을 대입
				dto.setNbno(nbno);
				dto.setTitle(title);
				dto.setContant(contant);
				dto.setCre_date(cre_date);
				dto.setWriter(writer);
				dto.setRcnt(rcnt);
				dto.setEmpno(empno);
				
				//위에서 set한 dto 변수를 NoticeBoardDTO를 제네릭으로 가진 ArrayList에 add메소드를 이용하여 추가
				dtoArr.add(dto);
				
				
			//System.out.println(nbno+","+title+","+contant+","+cre_date+","+writer+","+rcnt+","+empno);	
			}
			
		} catch (SQLException e) {
			System.out.println("allSelect 실패");
			e.printStackTrace();
		}
		return dtoArr; //ArrayList타입 dtoarr을 리턴
	}
}

 

메소드 리턴 타입에 List 클래스 타입을 지정해두고 제네릭으로 NoticeBoardDTO 클래스를 지정해두었다.

 

이렇게 되면 어떠한 데이터 타입이던 NoticeBoardDTO 객체들은 다 List에 담을수 있으며, List 클래스를 이용한 이유는 ArrayList의 상위 클래스기때문에 ArrayList 말고도 하위 다른클래스도 범용적으로 사용할수 있기 때문이다.

 

그리고 기존 String 타입의 sql 변수에서 Stringbuilder를 사용하여 .append를 이용한 쿼리문 대입으로 변경해주었고

기존에 사용하던 sql 참조변수는 일단 주석처리 해주었다.

 

while문 안에 DTO 클래스를 객체 생성해주었고 get메소드를 이용하여 변수에 담아준후. 그 변수를 다시 DTO클래스의 set메소드를 이용하여 DTO 클래스의 필드에 값을 대입해준후 그 DTO클래스를 List타입의 dtoArr 변수에 대입해주었다.

 

그리고 return값으로 값을 대입받은 dtoArr을 리턴하였다.

 

밑은 이제 변경된 Main 실행클래스이다.

 

while(true) {
			System.out.println();
			System.out.println("--1.전체조회	2.상세조회	3.등록	4.수정	5.삭제	6.종료");
			System.out.print("메뉴 번호를 입력하세요▶");
			int input = sc.nextInt();
			if(input == 1) {
				List<NoticeBoardDTO> dto = nbd.allSelect();
				for(int i=0; i<dto.size(); i++) {
					System.out.println(dto.get(i).toString());
				}

 

Main 클래스에서 전체조회하는 부분만 단락으로 가져왔다.

 

실행하고 1번을 누르면 nbd.allSelect(); 메소드를 실행하고, 그 실행한 리턴값으로 List가 넘어오니 그대로 List타입의 DTO클래스를 제네릭으로 가진 dto 참조변수로 받아준다.

 

그리고 이 리스트를 For문이나 while문을 통해 값을 꺼내서 출력해주면 된다.

 

여기서 toString은 DTO클래스에서 Override되었기때문에. ArrayList의 객체 주소들이 찍히는것이 아닌

 

실제 인덱스의 값들이 나열되게 된다

 

 

이렇게 Override 된 toString 메소드의 양식에 따라 List의 값들이 출력되는것을 볼수 있다.

 

반응형