Application.java에서 실행
클래스명 변수명 = new 생성자명➡️ItemView obj = new ItemView();
변수 미사용시new ItemView();형태로 간략하게 사용가능
import com.example.view.ItemView;
public class App 
{
    public static void main( String[] args )
    {
        new ItemView();
    }
}
- MongoConfig.java에서 MongoConfig class 생성
 - MongoConfig class에
 MongoCollection<Document> getConnection메서드 생성
➡️ String Collectionname 을 넣어주면 return값으로 DB에서 Collectionname과 일치하는 해당 컬렉션이 반환된다 =db.getCollection(collectionName);
- DB연동시 객체 여러개 생성하는 방식으로 생성하면 안된다
 
@autowired=싱글턴 패턴= 객체를 1개만 생성하게 하는 클래스 = 더 이상 객체 생성 불가- DB접속시
 싱글턴 패턴을 사용하는 경우 DB접속을 빠르고 원활하게 해준다
➡️ DB접속시싱글턴 패턴을 사용하지 않는 경우 과부하가 걸리기 때문에 모든 DB연동은싱글턴 패턴을 사용한다- 🌎 참고 수식자(public, static, ...)와 접근제어자(public, private, ...) 개념
 
import org.bson.Document;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
public class MongoConfig {
	// static 외부에서 생성자 생성 불가
    // private 사용하면 외부에서 만들 수 없음
    private static MongoConfig obj = new MongoConfig();
    // 기본 생성자
    private MongoConfig() {
    }
    // 외부에서 객체 생성시 static의 create 호출해야 함
    public static MongoConfig create() {
        return obj;
    }
     // 3. 메소드
     public MongoCollection<Document> getConnection(String collectionName ) {
        try{
            String url = "mongodb://id207:pw207@1.234.5.158:37017/db207";
            MongoClient client = MongoClients.create(url);
            if(client != null) {
                MongoDatabase db = client.getDatabase("db207");
                return db.getCollection(collectionName);
            }
            return null;
        }
        catch(Exception e){
            return null;
        }
    }
}
entity생성
```
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Item {
    // 기본키 설정 불가!
    private Long no = 0L;
    private String name = "";
    private Long price = 0L;
    private Date regdate = null;
}
```
interface생성
mongorepository에서는 기본적으로 사용가능한 CRUD가 있어서 interface 구현 없이 상속받아 사용했었다 지금은mongorepository사용하지 않으니 직접 설계 해야한다interface➡️ 설계만 가능! 구현은 불가- 등록, 수정, 삭제, 1개 조회, 여러개 조회 ➡️ 파라미터에 따라 필요한 반환값 생성해주면 된다
 
package com.example.service;
import java.util.List;
import com.example.entity.Item;
// interface => 설계만! 구현 불가
public interface ItemService {
    
    // 등록, 수정, 삭제, 1개 조회, 여러개 조회
    // 파라미터에 따라 필요한 반환값 받아내기
    // Item이 오면 int 반환
    public int insertItem( Item item );
    public int updateItem( Item item );
    public int deleteItem( Item item );
    // Long이 오면 Item 반환
    public Item selectItemOne( Long no );
    // int가 오면 List<Item> 반환
    public List<Item> selectItemList( int page );
}
service생성
mongoconfig이용하여 DB 접속public ItemServiceImpl()사용하여java_exam컬렉션 받아오기
➡️ collection = mongodb.getConnection("java_exam");- ItemServiceimpl.java 에서
 implementsItemService
🌎 참고 extends, implements의 차이점- ItemService의 구현되지 않은 메서드 추가 ➡️ 클릭하면 @Override 생성된다(오류처리도 해주기!)
 
- 물품등록, 수정, 삭제, 1개조회, 전체조회
 service생성- 물품 1개조회시
 cursor()+hasnext()사용 ➡️ cursor.hasNext() 메서드는 커서에 반환할 문서가 더 있는 경우 true를 반환
🌎 참고 cursor.hasNext() 관련 링크
// interface 사용하여 구현
public class ItemServiceImpl implements ItemService {
    private MongoConfig mongodb = MongoConfig.create();
    private MongoCollection<Document> collection = null;
    // mongoconfig이용해서 DB 접속
    public ItemServiceImpl() {
        // 컬렉션 받아오기
        collection = mongodb.getConnection("java_exam");
    }
    // 물품 등록
    @Override
    public int insertItem(Item item) {
        try {
            Document doc = new Document();
            doc.append("_id", item.getNo());
            doc.append("name", item.getName());
            doc.append("price", item.getPrice());
            doc.append("regdate", new Date());
            InsertOneResult result = collection.insertOne(doc);
            System.out.println(result);
            if (result.getInsertedId().asInt64().getValue() == item.getNo()) {
                return 1;
            }
            return 0;
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }
    // 물품 수정
    @Override
    public int updateItem(Item item) {
        try {
            // 조건 : 입력한 아이템 번호와 DB의 _id일치
            Bson query = Filters.eq("_id", item.getNo());
            // name과 price변경가능
            Bson set1 = Updates.set("name", item.getName());
            Bson set2 = Updates.set("price", item.getPrice());
            Bson set3 = Updates.combine(set1, set2);
            // 컬렉션.업데이트(조건, 변경항목)
            UpdateResult result = collection.updateOne(query, set3);
            System.out.println("result = " + result);
            if (result.getModifiedCount() == 1L) {
                return 1;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
        return 0;
    }
    // 물품 삭제
    @Override
    public int deleteItem(Item item) {
        try {
            // 입력한 번호와 DB _id 일치시 삭제
            Bson query = Filters.eq("_id", item.getNo());
            DeleteResult result = collection.deleteOne(query);
            System.out.println("result = " + result);
            if(result.getDeletedCount() == 1L){
                return 1;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
        return 0;
    }
    // 물품 1개조회
    @Override
    public Item selectItemOne(Long no) {
        try {
            // 입력한 물품번호와 일치하는 데이터를 DB에서 조회
            Bson query = Filters.eq("_id", no);
            MongoCursor<Document> list = collection.find(query).limit(1).cursor();
            // 1개 정보니까 반복문 없이 if사용
            if( list.hasNext() ){
                Document doc = list.next();  //1개씩 가져오기
                Item obj = new Item();
                obj.setNo(doc.getLong("_id"));
                obj.setName( doc.getString("name") );
                obj.setPrice( doc.getLong("price") );
                obj.setRegdate( doc.getDate("regdate") );
                // System.out.println("obj => " + obj);
                return obj;
            }
            return null;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    // 물품 전체조회
    @Override
    public List<Item> selectItemList( int page ) {
        try {
            FindIterable<Document> list = collection.find().skip( (page-1)*10 ).limit(10);
            List<Item> list2 = new ArrayList<>();
            for(Document doc : list){
                Item obj = new Item();
                obj.setNo( doc.getLong("_id") );
                obj.setName( doc.getString("name") );
                obj.setPrice( doc.getLong("price") );
                obj.setRegdate( doc.getDate("regdate") );
            
                list2.add(obj);
            }
            return list2;
            
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
선택 menu별 코드 작성
package com.example.view;
import java.util.List;
import java.util.Scanner;
import com.example.entity.Item;
import com.example.service.ItemService;
import com.example.service.ItemServiceImpl;
public class ItemView {
    public ItemView() {
        ItemService iService = new ItemServiceImpl();
        Scanner scanner = new Scanner(System.in);
        while(true){
            System.out.println("1.물품등록");
            System.out.println("2.물품전체조회");
            System.out.println("3.물품1개조회");
            System.out.println("4.물품삭제");
            System.out.println("5.물품수정");
            System.out.println("0.종료");
            System.out.println("메뉴를 입력하세요");
            int menu = scanner.nextInt();
            if(menu == 0){
                break;
            }
            else if( menu == 1){
                // 물품등록
                System.out.println("등록할 물품번호, 이름, 가격 입력 => ");
                String[] arr = scanner.next().split(",");
                Item item = new Item();
                item.setNo( Long.valueOf(arr[0]) );
                item.setName(arr[1]);
                item.setPrice(Long.valueOf(arr[2]));
                int ret = iService.insertItem(item);
                if(ret == 1){
                    System.out.println("물품등록 성공");
                }
                else{
                    System.out.println("물품등록 실패");
                }
            }
            else if( menu == 2){
                // 물품전체조회
                System.out.println("전체 물품 목록");
                List<Item> list =  iService.selectItemList(1);
                for( Item obj : list){
                    System.out.println(obj.toString());
                }
                
            }
            else if( menu == 3){
                // 물품1개조회
                System.out.println("조회할 물품 번호 입력 => ");
                Long no = scanner.nextLong();
                // 입력한 번호로 물품 조회
                Item item = new Item();
                item.setNo(no);
                Item result = iService.selectItemOne(no);
                System.out.println(result);
            }
            else if( menu == 4){
                // 물품삭제
                System.out.println("삭제할 물품 번호 입력 => ");
                Item item = new Item();
                item.setNo(scanner.nextLong());
                
                int ret = iService.deleteItem(item);
                if(ret == 1){
                    System.out.println("물품삭제 성공");
                }
                else{
                    System.out.println("물품삭제 실패");
                }
            }
            else if( menu == 5){
                // 물품수정
                System.out.println("수정할 아이템 번호, 수정할이름, 수정할가격 입력 => ");
                String arr[] = scanner.next().split(",");
                Item item = new Item();
                item.setNo( Long.valueOf(arr[0]) );
                item.setName( arr[1] );
                item.setPrice( Long.valueOf(arr[2]) );
                int ret = iService.updateItem(item);
                if(ret == 1){
                    System.out.println("물품수정 성공");
                }
                else{
                    System.out.println("물품수정 실패");
                }
                
            }
        }
        scanner.close();
    }
}