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

32일차. DTO와 SET, MAP

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

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

 

2022.12.07 - [Study/중앙정보처리학원과정] - 31일차. ArrayList와 DTO

 

31일차. ArrayList와 DTO

2022.12.05 - [Study/중앙정보처리학원과정] - 30일차. DTO(Data Tranfer Object) 30일차. DTO(Data Tranfer Object) 오늘은 DTO에 대해서 강의를 들었다. DAO - Data Access Object 는 데이터베이스의 data에 접근하기 위한 객

yat-ong.tistory.com

 

30일차부터 계속 이어지고 있다.

 

31일차에는 DTO 클래스를 ArrayList를 이용해서 변형해봤고, 32일차인 오늘은 DTO 클래스를 Map과 Set을 이용하여 변형해주었다.

 

여기서 잠깐 Collection Framwork의 대표적인 List, Set, Map에 특징들을 다시한번 짚고 넘어가겠다.

 

2022.11.14 - [Study/중앙정보처리학원과정] - 15일차. collection framework(컬렉션 프레임워크) ArrayList

 

15일차. collection framework(컬렉션 프레임워크) ArrayList

오전엔 interface...오후엔 드디어 collection framework를 배우기 시작했다. 아... 벌써부터 머리엔 지진이 나기 시작한거같고 목덜미에 식은땀이 나는거같고 복통이 밀려오는거같은데... 하아.... 여기에

yat-ong.tistory.com

 

 

  • List - 추가된 순서가 유지된다, 중복을 허용한다
  • Set - 추가된 순서유지X, 중복을 허용하지않는다. 중복값이 들어온다면 가장 마지막에 들어온 중복값 1개만 출력
  • Map - Key와 Value의 한쌍으로 이루어져있다. Key는 중복을 허용하지않고 Set과 마찬가지로 중복값은 가장 마지막 1개만 출력된다. Value는 중복이 가능하다.

 

 

31일차에는 ArrayList를 이용한 전체컬럼을 조회하는 Select를 했었는데 이를 다시 HashSet과 HashMap으로 변경해보도록 하겠다.

 

먼저 HashSet을 이용하여 전체 Select를 해주는 메소드를 추가로 작성해보았다.

 

Set<NoticeBoardDTO> allSelectSet() {
		//단일쓰레드라 스트링빌더 사용
		StringBuilder sqlSet = new StringBuilder();
		sqlSet.append("select nbno,title,contant,cre_date,writer,rcnt,empno");
		sqlSet.append(" from noticeboard");
		sqlSet.append(" order by cre_date desc");
		
		
		//HashSet 객체 생성 Set타입의 NoticeBoardDTO를 제네릭으로 표현해준 참조변수 생성
		Set<NoticeBoardDTO> dtoSet = new HashSet<NoticeBoardDTO>();
		
		try {
			stmt = con.prepareStatement(sqlSet.toString());
			ResultSet rs = stmt.executeQuery();
			while(rs.next()) {
				
				//DTO클래스에 값을 하나하나 대입
				NoticeBoardDTO dto = new NoticeBoardDTO();
				dto.setNbno(rs.getInt("nbno"));
				dto.setTitle(rs.getString("title"));
				dto.setContant(rs.getString("contant"));
				dto.setCre_date(rs.getDate("cre_date"));
				dto.setWriter(rs.getString("writer"));
				dto.setRcnt(rs.getInt("rcnt"));
				dto.setEmpno(rs.getInt("empno"));
				
				//.ADD를 이용하여 DTO클래스의 값들을 dtoSet 변수에 대입
				dtoSet.add(dto);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//HashSet의 참조변수를 리턴
		return dtoSet;
	}

 

그리고 Main클래스에서 Set형식으로 작성된 메소드를 호출해주면서 Select 실행

 

		while(true) {
			System.out.println();
			System.out.println("--1.전체조회	2.상세조회	3.등록	4.수정	5.삭제	6.종료");
			System.out.print("메뉴 번호를 입력하세요▶");
			int input = sc.nextInt();
			if(input == 1) {
				//allSelectSet 메소드를 실행하면 리턴값이 Set타입의 dtoSet이 리턴된다, 따라서 받을때도 Set 타입으로 받아야한다
				Set<NoticeBoardDTO> dtoSet = nbd.allSelectSet();
				//ArrayList는 인덱스 번호가 주어지지만 Set은 인덱스번호같은 순번이 주어지지 않기때문에 Iterator을 이용하여 반복적으로
				//Set의 요소들을 읽어온다
				Iterator<NoticeBoardDTO> iter = dtoSet.iterator();
				
				//iter가 다음요소가 없을때까지
				while(iter.hasNext()) {
					NoticeBoardDTO dto = iter.next();
					System.out.println(dto);
				}
				
				
				
				/*ArrayList를 이용한 전체조회 Select 메소드 호출
				List<NoticeBoardDTO> dto = nbd.allSelect();
				for(int i=0; i<dto.size(); i++) {
					System.out.println(dto.get(i).toString());
				}*/
				
			}

 

실행하면 결과값은 ArrayList때와 동일하다

 

 

 

다음은 HashMap을 이용해보겠다.

 

	Map<Integer,NoticeBoardDTO> allSelectMap() {
		//단일쓰레드라 스트링빌더 사용
		StringBuilder sqlSet = new StringBuilder();
		sqlSet.append("select nbno,title,contant,cre_date,writer,rcnt,empno");
		sqlSet.append(" from noticeboard");
		sqlSet.append(" order by cre_date desc");
		
		//key값이 Integer이고 value값이 NoticeBoardDTO 클래스를 제네릭으로 가지고 있는 HashMap 객체 생성
		Map<Integer,NoticeBoardDTO> map = new HashMap<Integer,NoticeBoardDTO>();
		
		try {
			stmt = con.prepareStatement(sqlSet.toString());
			ResultSet rs = stmt.executeQuery();
			while(rs.next()) {
				
				//DTO클래스에 값을 하나하나 대입
				NoticeBoardDTO dto = new NoticeBoardDTO();
				dto.setNbno(rs.getInt("nbno"));
				dto.setTitle(rs.getString("title"));
				dto.setContant(rs.getString("contant"));
				dto.setCre_date(rs.getDate("cre_date"));
				dto.setWriter(rs.getString("writer"));
				dto.setRcnt(rs.getInt("rcnt"));
				dto.setEmpno(rs.getInt("empno"));
				
				//map은 값을 put으로 key와 value를 정해줘야한다 여기서 key는 글번호인 nbno, 값은 dto객체를 던져주었다
				map.put(rs.getInt("nbno"), dto);
			}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		
		//map 참조변수를 리턴
		return map;
	}

 

다음은 Main에서 Map을 낱낱히 파헤쳐보겠다.

 

if(input == 1) {
				
	//map 객체 생성하면서 seletMap 쿼리 실행
	Map<Integer,NoticeBoardDTO> map = nbd.allSelectMap();
			
	//map의 키값을 꺼내오기 위해 keyset을 이용, map의 키값이 Integer기때문에 Keyset은 Set<Integer>를 반환한다
	Set<Integer> set = map.keySet();
	Iterator<Integer> iter = set.iterator();
	//while문을 이용하여 key값을 얻은후에. gey(key) 메소드로 value를 동시에 얻고 그걸 NoticeBoardDTO 클래스 타입의 dto클래스로 받는다.
	while(iter.hasNext()) {
		int keys = iter.next();
		NoticeBoardDTO dto = map.get(keys);
		System.out.println(dto);
	}
}

 

Map의 키값과 Value 값을 확인할때 Keyset도 있지만 EntrySet도 있다. EntrySet도 알아보자.

 

Map<Integer,NoticeBoardDTO> entryMap = nbd.allSelectMap();
				
		//enytySet은 리턴타입을 Set으로 준다 그리고 제네릭에 Map.Entry로 명시해준다
		Set<Map.Entry<Integer,NoticeBoardDTO>> entry = entryMap.entrySet();
				
		//Set 형식으로 받았으니 Iterator를 이용하여 반복해서 값을 받아온다
		Iterator<Map.Entry<Integer, NoticeBoardDTO>> mapIter = entry.iterator();
				
		while(mapIter.hasNext()) {
					
			Entry<Integer, NoticeBoardDTO> getMap = mapIter.next();
			int key = getMap.getKey();//EntrySet을 이용하면 getKey, getValue로 각각 key와 value를 가져올수 있다.
			NoticeBoardDTO value = getMap.getValue();
			System.out.println("key="+key+" value="+value);
		}

 

결과는 비슷해보이나 Map은 Key값과 Value값을 각각 찍어주는데 구별하기위해서 출력시 key와 value를 구별하기위해

 

System.out.println("key="+key+" value="+value) 양식으로 출력해주었다.

 

Key는 nbno와 동일하니 정상적으로 수행된것을 확인할수 있다.

반응형