[MongoDB] 자바에서 Item/ItemDB/Main1, Main1으로 호출하기

kafa·2023년 2월 28일
0

Java 복습

목록 보기
2/7

전체구문

Item (collection)

자,
이게 우리가 정한 Item 이다.
정보로 물품코드, 물품명, 물품설명, 가격, 재고수량, 등록일자가 포함되어있다.


package day6;

import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor

public class Item {
	private long code = 0;
	private String name = null;
	private String content = null;
	private int price = 0;
	private int quantity = 0;
	private Date date = new Date() ; 
    //Date타입으로 된 date는 디폴트값이 new Date() ~자동으로들어감~ 이다
}

ItemDB

몽고디비를 사용해서 이 Item을 관리하기로 했다.
Bson을 사용했다.
Bson filter와 update 등을 사용해서 물품목록을 불러오거나 등록하고 수정하고 삭제해 볼 것이다.
나중에는 Impl이 일을 하고 DB는 DB로만 존재할 예정이지만 이 포스팅에선 DB가 일을 한다. 일을 한다는 뜻은 말 그대로 일만 한다는 것이다. 발표는 다른 애가 한다. Main1이라든지.

package day6;

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

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.InsertOneResult;
import com.mongodb.client.result.UpdateResult;

public class ItemDB {
	private MongoCollection<Document> collection = null;

	// db연결하고 컬렉션을 item으로
	public ItemDB() {
		try {
			final String url = "(------삐-------)"; 
            // final: 새로 할당할 수 없다 바꿀수 없는 상수 초기화만 가능
			MongoClient client = MongoClients.create(url);
			MongoDatabase db = client.getDatabase("--삐--");
			this.collection = db.getCollection("items");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void printAction(Bson filter) {
		MongoCursor<Document> list = this.collection.find(filter).iterator();

		while (list.hasNext()) {
			Document doc = list.next();
			System.out.println("코드: " + doc.getLong("_id"));
			System.out.println("이름: " + doc.getString("name"));
			System.out.println("내용: " + doc.getString("content"));
			System.out.println("가격: " + doc.getInteger("price"));
			System.out.println("재고: " + doc.getInteger("quantity"));
			System.out.println("날짜: " + doc.getDate("Date"));
			System.out.println("------------");
		}
	}

	// 물품등록
	public int insertItem(Item item) {
		try {
			Document doc = new Document();
			doc.append("_id", item.getCode());
			doc.append("name", item.getName());
			doc.append("content", item.getContent());
			doc.append("price", item.getPrice());
			doc.append("quantity", item.getQuantity());
			doc.append("redate", item.getDate());
			// result => {insert 블라블라 asInt64().getValue()} //그래서
			InsertOneResult result = this.collection.insertOne(doc);
			System.out.println(result.toString());
			if (result.getInsertedId().asInt64().getValue() == item.getCode()) {
				return 1;
			} else {
				return 0;
			}
			// if문으로 result를 받아서 1혹은 0
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}

	// 전체 물품 출력
	public void printItems() {
		// MongoCursor<Document> : ArrayList<Document>
		// 사이즈를 알 수 없음 : 사이즈를 알 수 없음
		// 사이즈를 알 수 없기 때문에 while을 쓴다
		MongoCursor<Document> list = this.collection.find().cursor();
		// 반복문을 돌릴 수 없어서 cursor() 사용
		while (list.hasNext()) {
			// 꺼낼 것이 있나요?
			Document doc = list.next();
			// 꺼낼 것이 있네용 (전체에서 1개 줄어듦)
			System.out.println("코드: " + doc.getLong("_id"));
			System.out.println("이름: " + doc.getString("name"));
			System.out.println("내용: " + doc.getString("content"));
			System.out.println("가격: " + doc.getInteger("price"));
			System.out.println("재고: " + doc.getInteger("quantity"));
			System.out.println("날짜: " + doc.getDate("Date"));
			System.out.println("------------");
		}
	}

	// 물품 코드를 이용한 수정
	// 물품명, 물품내용, 가격, 수량 변경 가능
	public int updateItem(Item item) { // 수정할 항목이 많으니까 그냥item을 받기
		try {
			Bson filter = Filters.eq("_id", item.getCode());

			Bson update1 = Updates.set("name", item.getName());
			Bson update2 = Updates.set("content", item.getContent());
			Bson update3 = Updates.set("price", item.getPrice());
			Bson update4 = Updates.set("quantity", item.getQuantity());

			Bson update = Updates.combine(update1, update2, update3, update4);

			UpdateResult result = this.collection.updateOne(filter, update);
			if (result.getModifiedCount() == 1L) {
				return 1;
			}
			return 0;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}

	// 물품정보 지우기
	public int deleteItem(long code) {
		try {
			Bson filter = Filters.eq("_id", code);
			DeleteResult result = this.collection.deleteOne(filter);
			System.out.println(result.toString());
			if (result.getDeletedCount() == 1L) {
				return 1;
			}
			return 0;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}
}

Main1

그리고 이걸 Main1에서 테스트 해보자.

메인은 어디까지나 코드가 잘 돌아가는지 확인용이다.
Main1은 값을 잘 돌아간다고 우리에게 발표해 줄 뿐이다.
여기서 안에 돌아가는 내용은 다 DB를 호출해 사용한다.
(insertItem 이나 updateItem 같은것들.)

또한, 지금 Main1에서 하는 건 테스트일 뿐이다. 테.스.트.
물론 물품을 등록하면 들어가긴 한다.

public class Main1 {

	public static void main(String[] args) {
		
		ItemDB iDB = new ItemDB();
		
		// 물품등록
		Item item = new Item(4515621L, "홍길동", "내용", 41000, 23, new Date());
		int ret = iDB.insertItem(item);
		System.out.println(ret);

		// 전체 물품 출력
		iDB.printItems();
		
		// 물품 코드를 이용한 수정
		// 물품명, 물품내용, 가격, 수량 변경 가능
		Item item = new Item();
		item.setCode(4515621L);
		item.setName("홍상수");
		item.setContent("어쩌구저쩌구");
		item.setPrice(51000);
		item.setQuantity(154);
		int ret = iDB.updateItem(item);
		System.out.println(ret);
		
		// 물품정보 지우기
		int ret = iDB.deleteItem(4515621L);
 		System.out.println(ret);
	}
}

이제 하나하나 뜯어보자


구문 뜯어보기

Item (collection)

private

public class Item {
	private long code = 0;
	private String name = null;
	private String content = null;
	private int price = 0;
	private int quantity = 0;
	private Date date = new Date() ; 
    //Date타입으로 된 date는 디폴트값이 new Date() ~자동으로들어감~ 이다
}

대체 private은 뭘까
위의 링크를 클릭하면 우리같은 가엾은 비전공자 6개월 자바웹개발반 학생들을 위한 private과 public의 차이점이 나온다. 사랑해요
private은 오로지 클래스 내부에서만 생성자를 호출할 수 있고 객체를 만들 수 있다.

근데 사실 제약을 받은적이 없어서 모르겠다.
클래스 안에서 안 호출하면 어디서 호출하지?

try catch 문

위에서 본 코드에는

try {
	} 
catch (Exception e) {
	e.printStackTrace();
	}

이런게 있었다.

// 1. 자체적으로 오류 처리하기 (try-catch)
	public float sumDiv(int n, int m) {
		try {
			float div = n / m; // 나누기라 0을 넣으면 안돌아감
			return div; // 예외처리한다. 서버가 죽는걸 막기 위해
		} catch (Exception e) {
			System.err.println(e.getMessage());
			e.printStackTrace(); 
            // 오류를 파악할 수 있게 상세히 출력해줌. 개발자가 죽는걸 막기 위해
			return 0.0f;
		}
	}

	// 2. 오류처리 안하고 그냥 주기 (throws Exception)
		public int sumMinus(int n, int m) throws Exception {
		// throws Exception : 오류 안잡고 오류 그대로 내보낼거다
		int tmp = n - m;
		return tmp;
	}

그렇다면 오류가 났을때 e.printStackTrace()은 뭘까?

여기 또 어떤 은혜로운 분이 설명을 잘 해주셨다

상세히 어디가 어떻게 오류가 났는지 메세지를 띄워준다고 한다. 내가 지금까지 본 스크롤 긴 빨간문자들이 그거였구나.

System.err.println(e.getMessage()는 빨간색으로 메세지를 내보낸다는 뜻이다. 우리가 잘 아는 out.대신 그 자리에 err.가 있다.


ItemDB

DB연결하기

ItemDB에서도 맨 위에 있는 DB연동이다.
DB와 이클립스를 연결하기 위해서는
DB서버 url, DB이름, collection이름이 필요하다.

	// final: 새로 할당할 수 없다 바꿀수 없는 상수 초기화만 가능
	final String url = "(------삐-------)"; //url: 연동할 db서버 url    
	MongoClient client = MongoClients.create(url); //client: 우리가 생성한 url로 만듦
	MongoDatabase db = client.getDatabase("--삐--"); //db이름
	this.collection = db.getCollection("items"); //collection이름

iterator()
hasNext() next() 그리고 List

자바(JAVA) Iterator 인터페이스

협업시 각자의 데이터자료구조 알고리즘이나 메소드를 서로에게 자세히 알려주기 위해 자바에서는 Iterator 인터페이스를 사용하는 것을 권장하고 있다.

따라서 Collection 인터페이스에서는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메소드를 정의하여 각 요소에 접근하도록 하고 있다. 따라서 Collection 인터페이스를 상속받는 List와 Set 인터페이스에서도 iterator() 메소드를 사용할 수 있다.

LinkedList<Integer> lnkList = new LinkedList<Integer>();
​
lnkList.add(4);
lnkList.add(2);
lnkList.add(3);
lnkList.add(1);ListIterator<Integer> iter = lnkList.listIterator();
while (iter.hasNext()) {
   System.out.print(iter.next() + " ");}while (iter.hasPrevious()) { //역순으로 데이터가 있는지 확인한다.
   System.out.print(iter.previous() + " "); //역순으로 가져온다
}

하면 결과는

실행 결과
-----------------------------------------------------
4 2 3 1
1 3 2 4

다음과 같이 가져올 수 있다.

private void printAction(Bson filter) {
		MongoCursor<Document> list = this.collection.find(filter).iterator();

		while (list.hasNext()) {
			Document doc = list.next();
			System.out.println("코드: " + doc.getLong("_id"));
			System.out.println("이름: " + doc.getString("name"));
			System.out.println("내용: " + doc.getString("content"));
			System.out.println("가격: " + doc.getInteger("price"));
			System.out.println("재고: " + doc.getInteger("quantity"));
			System.out.println("날짜: " + doc.getDate("Date"));
			System.out.println("------------");
		}
	}

이와 같이 우리도 MongoCursor list로 되어있는 데이터베이스를 iterator()로 가져올 수 있다.

Iterator는 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 것
hasNext() : 읽어올 요소가 남아있는지 확인하는 메서드, 요소가 있으면 true, 없으면 false
next() : 다음 데이터를 반환
remove() : next()로 읽어온 요소를 삭제
hasNext/next 관련 설명


물품등록

append
insertOne
InsertOneResult
&
이게뭐지:

	if (result.getInsertedId().asInt64().getValue() == item.getCode()) {
			return 1;
		} else {
			return 0;
		}
public int insertItem(Item item) {
		try {
			Document doc = new Document();
			doc.append("_id", item.getCode());
			doc.append("name", item.getName());
			doc.append("content", item.getContent());
			doc.append("price", item.getPrice());
			doc.append("quantity", item.getQuantity());
			doc.append("redate", item.getDate());
			InsertOneResult result = this.collection.insertOne(doc);
			System.out.println(result.toString());
  			// result => {insert 블라블라 asInt64().getValue()} //그래서
			if (result.getInsertedId().asInt64().getValue() == item.getCode()) {
				return 1;
			} else {
				return 0;
			}
			// if문으로 result를 받아서 1혹은 0
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}

append()

append는 기존 문자열의 뒤쪽에 문자열을 추가하는 기능이다.

  public class String_appendTest {
 
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        
        sb.append(" kafa's ");
        sb.append(" velog ");
        sb.append(" IS Best :)");
        
        System.out.println(sb);
    }
}
  
  //------------
  kafa's velog IS Best :)  
  

insertOne
InsertOneResult

MongoDB에서 데이터를 1개 추가하는 명령어다.
[MongoDB] 삽입(insert), 단일 삽입(insertOne), 다수 삽입(insertMany)

InsertOneResult result = this.collection.insertOne(doc);
	System.out.println(result.toString());

전체 물품 출력

public void printItems() {
	// MongoCursor<Document> : ArrayList<Document>
	// 사이즈를 알 수 없음 : 사이즈를 알 수 없음
	// 사이즈를 알 수 없기 때문에 while을 쓴다
	MongoCursor<Document> list = this.collection.find().cursor();
	// 반복문을 돌릴 수 없어서 cursor() 사용
	while (list.hasNext()) {
		// 꺼낼 것이 있나요?
		Document doc = list.next();
		// 꺼낼 것이 있네용 (전체에서 1개 줄어듦)
		System.out.println("코드: " + doc.getLong("_id"));
		System.out.println("이름: " + doc.getString("name"));
		System.out.println("내용: " + doc.getString("content"));
		System.out.println("가격: " + doc.getInteger("price"));
		System.out.println("재고: " + doc.getInteger("quantity"));
		System.out.println("날짜: " + doc.getDate("Date"));
		System.out.println("------------");
	}
}

물품수정

updateOne -- MongoDB
UpdateResult -- MongoDB
Bson filter
Filters.eq
Bson update
combine
getModifiedCount

public int updateItem(Item item) { // 수정할 항목이 많으니까 그냥item을 받기
		try {
			Bson filter = Filters.eq("_id", item.getCode());

			Bson update1 = Updates.set("name", item.getName());
			Bson update2 = Updates.set("content", item.getContent());
			Bson update3 = Updates.set("price", item.getPrice());
			Bson update4 = Updates.set("quantity", item.getQuantity());

			Bson update = Updates.combine(update1, update2, update3, update4);

			UpdateResult result = this.collection.updateOne(filter, update);
			if (result.getModifiedCount() == 1L) {
				return 1;
			}
			return 0;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}

물품정보지우기

deleteOne
DeleteResult
getDeletedCount

	public int deleteItem(long code) {
		try {
			Bson filter = Filters.eq("_id", code);
			DeleteResult result = this.collection.deleteOne(filter);
			System.out.println(result.toString());
			if (result.getDeletedCount() == 1L) {
				return 1;
			}
			return 0;
		} catch (Exception e) {
			e.printStackTrace();
			return -1;
		}
	}

몽고디비에서 사용하는 명령어들을

여기에

넣어둠.

다 걍 컨트롤 스페이스 누르면 나와서 안적음.

profile
kafa is kafa. not be something other.

0개의 댓글