빅데이터 Java 개발자 교육 - 10일차 [Map, 회원정보 주소 추가&불러오기]

Jun_Gyu·2023년 2월 26일
0
post-thumbnail

지난시간까지 우리는 Vector와 ArrayList를 사용해서 각 항목들에 들어갈 정보들을 배열 형태로 저장하는 방법을 실습을 통해 진행했었다.

오늘은 한번 Map에 대해서 배워보고자 한다.



우선 Map에 대해서 알아보기 이전에

앞서 사용했던

Vector와 ArrayList 두 형태의 단점

이라 하면,


아무래도 값을 하나하나 입력할 때 문자열은 String, 숫자는 int와 long 등으로

형변환을 하나씩 해서 배열에 추가해야 했던 번거로움

이 있었다.

(예를 들면 책 정보를 넣을때 책 가격은 long, 저자는 String으로 해야하던 번거로움..)

하지만 Map은 리스트나 배열처럼 순차적으로(sequential)

해당 요소 값을 구하지 않고 key를 통해 value를 구하는 interface이다.

Map

의 가장 큰 특징이라면

위에서도 이야기하였듯이

key로 value를 얻어낸다는 점

과 더불어

요소의 저장 순서를 유지하지 않으며,

key는 중복을 허용하지 않지만, value값은 중복을 허용한다는 것이다.

아래의 소스코드를 참고해보자.

package day10;

import java.util.HashMap;
import java.util.Map;

public class Main {

	public static void main(String[] args) {

		// 배열과 다른점 : 순차적으로 데이터가 추가되지 않는다.
		// key를 통해서 데이터(value)를 꺼냄.
		// key는 고유해야 함. 같은것은 존재할 수 없음.
		Map<String, Object> map = new HashMap</* 앞의 Map<>과 똑같은 타입 */>();
		map.put("id", "abc");
		map.put("name", "가나다");
		map.put("age", 21);

       // 키는 고유한 값이기 때문에 뒤쪽에 같은 키의 데이터를 넣게되면 마지막 데이터로 수정됨!
		map.put("name", "나다라");

		// (key, value)의 형식. Document도 같은 형식이다. ex) doc.append("_id", doc.get ~)
		
		// -------------------------------------------------------------------------------
		String id = (String) map.get("id"); // 꺼낸 value가 'Object'이기 떄문에 형변환 필요 (String)
		String name = (String) map.get("name");
		int age = (int) map.get("age");
		// -------------넣는값은 아무 값이나 넣을 수 있지만 뺄때는 형변환이 필요함----------

		System.out.println(map.get("id")); //abc
		System.out.println(name); // "가나다"가 아니라 "나다라"로 출력됨.
		System.out.println(age);  // 21	
	}
}

위의 코드와 같은 경우 Map의 key와 value를 각각 <String, Object>로 지정해주었다.

이 말인 즉슨, key값은 String 형태로 입력이 되는 상태이고 value는 Object이기에 모든 클래스를 사용해서 key값으로 지정이 가능한 상태이다.

key에 값을 대입할때는 별도의 형변환은 필요없지만, 인위적으로 값을 꺼내서 사용할때는 형변환이 필요하겠다.

그렇다면 오늘은 한번 회원 정보에서 회원들의 "주소"를 추가하여 회원의 아이디를 입력하면 주소정보가 도출되도록 실습을 진행해볼까 한다.

실습을 위해 지난 시간에 만들어두었던 클래스를 가져와서 진행하였다.

먼저 데이터베이스에서 기능을 수행하기 위해서 인터페이스부터 설계를 했다.

package day10;

import java.util.List;
import java.util.Map;

public interface AddressDB {
	
	// 주소추가
	public int insertAddress(AddressTable address);
	public int insertAddressMap(Map<String, Object> map);

	// 주소한개조회
	public AddressTable selectAddressOne(long code);
	public List<AddressTable> selectAddressOneForId(MemberTable member);
	public Map<String, Object> selectAddressMapOne(long code);
	
	// 회원에 해당하는 주소 전체 조회
	public List<AddressTable> selectAddressList(MemberTable member);
	public List<Map<String, Object>> selectAddressListMap(MemberTable member);

}

그리고 아래의 소스코드는 이를 바탕으로 동작할 implements 클래스 코드이다.

package day10;

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

import org.bson.Document;
import org.bson.conversions.Bson;

import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.InsertOneResult;

import day8.Config;

public class AddressDBImpl implements AddressDB {

	private MongoCollection<Document> addresses = null;
	private MongoCollection<Document> sequence = null;
	private MongoCollection<Document> members = null;

	// -------------DB 연동 및 컬렉션 연결하기 (생성자)------------------
	public AddressDBImpl() {
		this.addresses = MongoClients.create(Config.URL).getDatabase(Config.DBNAME).getCollection(Config.ADDRESSOL);
		this.sequence = MongoClients.create(Config.URL).getDatabase(Config.DBNAME).getCollection(Config.RESEQUENCECOL);
		this.members = MongoClients.create(Config.URL).getDatabase(Config.DBNAME).getCollection(Config.MEMBERCOL);

	}
	// ----주소추가---------------------------------------

	@Override
	public int insertAddress(AddressTable address) {
		// 여기부분도 반복작업. 나중에 숙달이 된다면 꼭 한번 자동으로 되게 해볼것.
		try {
			Document doc = this.sequence.findOneAndUpdate(Filters.eq("_id", "SEQ_ADDRESS_CODE"), Updates.inc("idx", 1));
			long code = doc.getLong("idx");

			Document saveDoc = new Document().append("_id", code).append("address", address.getAddress())
					.append("postcode", address.getPostcode()).append("regdate", address.getRegdate())
					.append("memberid", address.getMemberid().getId());
			/*********** 회원정보 전체 추가하지 않음. 기본키인 아이디만 추가함!! *************/

			InsertOneResult result = this.addresses.insertOne(saveDoc);
			if (result.getInsertedId().asInt64().getValue() == code) {
				return 1;
			}
			return 0;

		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}

	}

	// --주소추가(맵 사용)------------------------------------------------------------
	@Override
	public int insertAddressMap(Map<String, Object> map) {
		try {
			Document doc = new Document();
			MemberTable member = new MemberTable();
			doc.put("_id", map.get("_id"));
			doc.put("address", map.get("address"));
			doc.put("postcode", map.get("postcode"));
			doc.put("regdate", map.get("regdate"));
			/* 수정필요 */ doc.put("memberid", map.get(member.getId()));

		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}
	// ---주소 한개조회 (회원 한명)-----------------------------------------------------------

	@Override
	public AddressTable selectAddressOne(long code) {
		try {
			// 강사님 코드
//      	Bson filter  = Filters.eq("_id", code);
//			Document doc = this.addresses.find(filter).first();
//			
//			// Document -> Address로 변환 메소드 (회원정보는 null)
//			Address address = documentToAddress(doc);
//			
//			// members의 컬렉션에서 해당 아이디 정보를 가져와야 됨.
//			Bson filter1 = Filters.eq("_id", doc.getString("memberid") );
//			Document docMember = this.members.find( filter1 ).first();
//			
//			//Document -> Member로 바꾼후
//			Member member = new Member();
//			member.setId( docMember.getString("_id") );
//			member.setName( docMember.getString("name") );
//			member.setPassword( docMember.getString("password") );
//			member.setPhone( docMember.getString("phone") );
//			member.setRegdate( docMember.getDate("regdate") );
//			member.setRole( docMember.getString("role") );
//			address.setMemberid( member );
//			return address;

			// 내가 짠 코드
			Document doc = this.addresses.find(Filters.eq("_id", code)).first();
			if (doc != null) { // Document -> Reply 타입으로 복사한 후 리턴
				AddressTable address = new AddressTable();
				address.setCode(doc.getLong("_id"));
				address.setAddress(doc.getString("address"));
				address.setPostcode(doc.getString("postcode"));
				address.setRegdate(doc.getDate("regdate"));

				String mid = doc.getString("memberid");
				Document docMember = this.members.find(Filters.eq("_id", mid)).first(); // first()가 빠졌었음.

				// ----------------여기까지는 같음-----------------

				MemberTable member = new MemberTable();
				member.setId(docMember.getString("_id"));
				member.setName(docMember.getString("name"));
				member.setPassword(docMember.getString("password"));
				member.setPhone(docMember.getString("phone"));
				member.setRegdate(docMember.getDate("regdate"));
				member.setRole(docMember.getString("role"));
				address.setMemberid(member);
				return address;

			}
			return null;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	// -----주소한개조회(맵
	// 사용)-------------------------------------------------------------

	@Override
	public Map<String, Object> selectAddressMapOne(long code) {

	return null;
}

(너무 길어서 두번 나눠야 할 것 같다.)

@Override
	public List<AddressTable> selectAddressList(MemberTable member) {
		try {
			// 내가 짠 코드
			// 주소에서 member로 전달되는 해당아이디 주소만 목록조회
			FindIterable<Document> docs = this.addresses.find(Filters.eq("memberid", member.getId()));
			List<AddressTable> list = new ArrayList<>();
			for (Document doc : docs) {
				list.add(documentToAddress(doc));
			}
			if (!list.isEmpty()) {
				return list;
			}
			return null;
			
			// --------------강사님 코드------------- //			
//			List<AddressTable> list = new ArrayList<>();
//			// 주소에서 member로 전달되는 해당아이디 주소만 목록조회
//			Bson filter = Filters.eq("memberid", member.getId());
//			FindIterable<Document> docs = this.addresses.find(filter);
//			for (Document doc : docs) {
//			// 회원에서 아이디가 일치하는 정보 가져오기
//			
//			Bson filter1 = Filters.eq("_id", member.getId());
//			Document doc1 = this.members.find(filter1).first();
//			System.out.println(doc);
//			System.out.println(doc1);
//			// 회원정보는 아직없음
//			AddressTable address = documentToAddress(doc);
//	  		// set을 이용해서 address객체에 회원정보 추가
//	  		address.setMemberid( documentToMember(doc1) );
//			}			
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	// ----회원에 해당하는 주소 전체 조회------------------------------------------

	@Override
	public List<Map<String, Object>> selectAddressListMap(MemberTable member) {
		try {
			// n 개의 데이터
			FindIterable<Document> docs = this.addresses.find(Filters.eq("memberid", member.getId()));
			List<Map<String, Object>> list = new ArrayList<>();
			for (Document doc : docs) {
				list.add((Map<String, Object>) documentToAddress(doc));
			}
			if (!list.isEmpty()) {
				return list;
			}
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	// -------------------------------------------------------------------

	// Document -> Address로 변경하는 메소드
	private AddressTable documentToAddress(Document doc) {
		AddressTable address = new AddressTable();
		address.setCode(doc.getLong("_id"));
		address.setAddress(doc.getString("address"));
		address.setPostcode(doc.getString("postcode"));
		address.setRegdate(doc.getDate("regdate"));

		return address;
	}
	
	// -------------------------------------------------------------------
	// Document -> Member로 변경하는 메소드
	private MemberTable documentToMember(Document doc) {
		MemberTable member = new MemberTable();
		member.setId(doc.getString("_id"));
		member.setPassword(doc.getString("password"));
		member.setName(doc.getString("name"));
		member.setPhone(doc.getString("phone"));
		member.setRole(doc.getString("role"));
		member.setAge(doc.getInteger("age"));
		member.setRegdate(doc.getDate("regdate"));
		return member;
	}
	// -------------------------------------------------------------------

	@Override
	public List<AddressTable> selectAddressOneForId(MemberTable member) {
		try {
			// 필터를 설정, Id값을 받아냄
			Bson filter = Filters.eq("memberid", member.getId());
			// 설정된 필터값을 주소항목에 적용, 찾아낸 값을 doc에 저장.
			FindIterable<Document> docs = this.addresses.find(filter);

			// 주소값들을 받기 위한 빈 List 배열 생성.
			List<AddressTable> list = new ArrayList<>();

			// 반복문. docs 전체를 뜻함.
			for (Document doc : docs) {
				AddressTable address = documentToAddress(doc); // 회원 주소정보들이 저장된 docs를 adress값에 하나하나저장.

				// 다시 필터 설정. 이번엔 [회원 id == 주소에 저장된 멤버 id]를 위한 필터
				Bson filterMem = Filters.eq("_id", (docs.first().getString("memberid")));
				// 필터를 적용하여 docMem에 저장.
				Document docMem = this.members.find(filterMem).first();
				// 회원들의 정보를 세팅하기 위한 객체 생성.
				MemberTable member1 = new MemberTable();

				// 아래는 각 항목에 들어갈 내용들.
				member1.setId(docMem.getString("_id"));
				member1.setPassword(docMem.getString("password"));
				member1.setName(docMem.getString("name"));
				member1.setPhone(docMem.getString("phone"));
				member1.setAge(docMem.getInteger("age"));
				member1.setRole(docMem.getString("role"));
				member1.setRegdate(docMem.getDate("regdate"));
				// 마지막으로 멤버들 id까지
				address.setMemberid(member1);

				list.add(address);
			}
			if (!list.isEmpty()) {
				return list;
			}
			return null;
		} catch (Exception e) {
			e.printStackTrace();
		return null;
	}
}

이번에는 Member interface이다.

package day10;

import java.util.List;
import java.util.Map;

public interface MemberDB {

	// 추가하기
	public int insertMember(MemberTable member);
	public int insertMemberMap(Map<String, Object> map);

	// 1개 조회
	public MemberTable selectMemberOne(String id);
	public Map<String, Object> selectMemberMapOne(String id);

	// 전체 조회
	public List<MemberTable> selectMemberList();
	public List<Map<String, Object>> selectMemberMapList();
}

다음으로는 Implements 클래스이다. 빈 곳은 스스로 해보도록 하자.

package day10;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.bson.Document;

import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.Filters;
import com.mongodb.client.result.InsertOneResult;

import day8.Config;

public class MemberDBImpl implements MemberDB {

	// 클래스 전역 변수 (생성자, 메소드 모든곳에서 사용가능)
	private MongoCollection<Document> members = null;

	// -------------DB 연동 및 컬렉션 연결하기 (생성자)------------------
	public MemberDBImpl() {
		this.members = MongoClients.create(Config.URL).getDatabase(Config.DBNAME).getCollection(Config.MEMBERCOL);
	}

	// -----------------------실습-----------------------
	@Override
	public int insertMember(MemberTable member) {
		return 0;
	}
	// -------------------------------------------------

	@Override
	public int insertMemberMap(Map<String, Object> map) {
		try {
			Document doc = new Document();
			// 몽고DB에서 기본키(중복불가)에 _id,
			doc.put("_id", map.get("_id"));
			doc.put("password", map.get("password"));
			doc.put("name", map.get("name"));
			doc.put("phone", map.get("phone"));
			doc.put("role", map.get("role"));
			doc.put("age", map.get("age"));
			doc.put("regdate", map.get("regdate"));

			InsertOneResult result = this.members.insertOne(doc);
			System.out.println(result);
			// AcknowledgeInsertOneResult{insertedID=BsonSrting

			if (result.getInsertedId().asString().getValue().equals(map.get("_id"))) {
				return 1;

			}
			return 0;

		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}
	// -------------------------------------------------------------------

	@Override
	public MemberTable selectMemberOne(String id) {
		// TODO Auto-generated method stub
		return null;
	}
	// -------------------------------------------------------------------

	@Override
	public Map<String, Object> selectMemberMapOne(String id) {
		try {
			Document doc = this.members.find(Filters.eq("_id", id)).first();
			if (doc != null) {
				return documentToMap(doc);
			}
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}
	// -------------------------------------------------------------------

	@Override
	public List<MemberTable> selectMemberList() {
		// TODO Auto-generated method stub
		return null;
	}
	// -------------------------------------------------------------------

	@Override
	public List<Map<String, Object>> selectMemberMapList() {
		try {
			// n개의 데이터
			FindIterable<Document> docs = this.members.find();
			List<Map<String, Object>> list = new ArrayList<>();
			for (Document doc : docs) {
				list.add(documentToMap(doc));
			}
			if (!list.isEmpty()) {
				return list;
			}
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}
	// -------------------------------------------------------------------
	// 내부적으로 반복적으로 사용 할 메소드.
	private Map<String, Object> documentToMap(Document doc) {
		Map<String, Object> map = new HashMap<>();
		map.put("_id", doc.get("_id"));
		map.put("password", doc.get("password"));
		map.put("name", doc.get("name"));
		map.put("phone", doc.get("phone"));
		map.put("role", doc.get("role"));
		map.put("age", doc.get("age"));
		map.put("regdate", doc.get("regdate"));
		return map;
	}
	// -------------------------------------------------------------------

}

마지막으로 실행할 메인클래스의 코드들이다.

package day10;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		/*--------------------------------------------------------------*/

		// DB연결과 컬렉션 선택 된 상황 ( DB연동 및 컬렉션 연결 )
		MemberDB mDB = new MemberDBImpl();
		AddressDB aDB = new AddressDBImpl();

		/*---------------------회원정보 넣기-----------------------------------------------*/

//		//빈 map 객체를 생성
//		Map<String, Object> map = new HashMap<>();
//		map.put("_id", "ccc5");
//		map.put("password", "ccc1");
//		map.put("name", "이름1");
//		map.put("phone", "010");
//		map.put("role", "C");
//		map.put("age", 16);
//		map.put("regdate", new Date());
//		
//		int ret = mDB.insertMemberMap(map);
//		System.out.println(ret);

		/*---------------------회원정보 한개 불러오기-----------------------------------------------*/

//		Map<String, Object> map = mDB.selectMemberMapOne("ccc1");
//		System.out.println("아이디 => " + map.get("_id"));
//		System.out.println("비밀번호 => " + map.get("password"));
//		System.out.println("이름 => " + map.get("name"));
//		System.out.println("전화번호 => " + map.get("phone"));
//		System.out.println("권한 => " + map.get("role"));
//		System.out.println("나이 => " + map.get("age"));
//		System.out.println("등록일자 => " + map.get("regdate"));
//		System.out.println("------------------------------");

		/*----------------------회원정보 전체 불러오기 -------------------------------------------*/

//		List<Map<String, Object>> list = mDB.selectMemberMapList();
//		for (Map<String, Object> map : list) {
//			System.out.println("아이디 => " + map.get("_id"));
//			System.out.println("비밀번호 => " + map.get("password"));
//			System.out.println("이름 => " + map.get("name"));
//			System.out.println("전화번호 => " + map.get("phone"));
//			System.out.println("권한 => " + map.get("role"));
//			System.out.println("나이 => " + map.get("age"));
//			System.out.println("등록일자 => " + map.get("regdate"));
//			System.out.println("└----------------------------------------┘");
//			System.out.println();
//		}

		/*---------------------- 회원별 주소 생성하기 -------------------------------------------*/

//		AddressTable address = new AddressTable();
//		MemberTable member = new MemberTable();
//
//		member.setId("ccc2");
//
//		address.setAddress("가나다");
//		address.setPostcode("123123");
//		address.setRegdate(new Date());
//		address.setMemberid(member);
//		
//		int test = aDB.insertAddress(address);
//		System.out.println(test);

		/*---------------------- 회원별 주소 생성하기 (맵 사용)-------------------------------------------*/

//		Map<String, Object> map = new HashMap<>();
//		MemberTable member = new MemberTable();
//		
//		map.put("_id", 10009);
//		map.put("address", "부산시");
//		map.put("postcode", "1233321");
//		map.put("regdate", new Date());
//		map.put("memberid", member.getId());  // 뭐가 문제일까
//		
//		int ret = aDB.insertAddressMap(map);
//		System.out.println(ret);

		/*---------------------- 주소 한개 불러오기-------------------------------------------*/

//		Scanner sc = new Scanner(System.in);
//		System.out.print("주소 정보를 조회할 값을 입력해주세요. : ");
//
//		// 아이디 입력받고 -> 아이디_id와 memberId 일치하는 주소값 연결 ->
//		AddressTable address = aDB.selectAddressOne(sc.nextLong()); // 해당 번호의 글 불러오기
//
//		if (address != null) {
//			System.out.println("┌---------------------------------------┐");
//			System.out.println("주소_ID => " + address.getCode()); // 굳이 안불러와도 될 것 같음!
//			System.out.println("주소 => " + address.getAddress());
//			System.out.println("우편번호 => " + address.getPostcode());
//			System.out.println("등록일자 => " + address.getRegdate());
//			System.out.println("회원아이디 정보 => " + address.getMemberid());
//			System.out.println("└---------------------------------------┘");
//		} else {
//			System.out.println("등록된 회원의 주소 정보를 찾을 수 없습니다.");
//		}
//		sc.close();

		/*---------------------- 회원ID 입력하고 주소값 받기-------------------------------------------*/

//		Scanner sc = new Scanner(System.in);
//		MemberTable member = new MemberTable();
//		
//		System.out.print("주소 정보를 조회할 값을 입력해주세요. : ");
//		member.setId(sc.next());
//	
//		List<AddressTable> list = aDB.selectAddressOneForId(member);
//		for (AddressTable address : list) {
//			if (address != null) {
//				System.out.println("┌---------------------------------------┐");
//				System.out.println("주소_ID => " + address.getCode()); // 굳이 안불러와도 될 것 같음!
//				System.out.println("주소 => " + address.getAddress());
//				System.out.println("우편번호 => " + address.getPostcode());
//				System.out.println("등록일자 => " + address.getRegdate());
//				System.out.println("회원아이디 정보 => " + address.getMemberid());
//				System.out.println("└---------------------------------------┘");
//			}
//			else {
//				System.out.println("회원의 주소정보가 존재하지 않습니다.");
//			}sc.close();
//		}
		/*---------------------- 주소 여러개 불러오기-------------------------------------------*/

//		AddressDB addressDB = new AddressDBImpl();
//		MemberTable member = new MemberTable();
//		Scanner sc = new Scanner(System.in);
//
//		System.out.print("주소를 조회하고자 하는 회원의 아이디를 입력해주세요. : ");
//		member.setId(sc.next());
//
//		sc.close();
//
//		List<AddressTable> list = addressDB.selectAddressList(member);
//
//		for (AddressTable one : list) {
//			System.out.println("┌---------------------------------------┐");
//			System.out.println("주소_ID => " + one.getCode());
//			System.out.println("주소 => " + one.getAddress());
//			System.out.println("우편번호 => " + one.getPostcode());
//			System.out.println("등록일자 => " + one.getRegdate());
//			System.out.println("└---------------------------------------┘");
//		}

		/*-----------------------------------------------------------------------------*/
	}
}

실행할땐 실행하고자 하는 부분만 주석처리를 풀고 사용하도록 하자.


profile
시작은 미약하지만, 그 끝은 창대하리라

0개의 댓글