20220901 [Spring Boot]

Yeoonnii·2022년 9월 2일
0

TIL

목록 보기
18/52
post-thumbnail

물품 등록/조회/삭제/변경 (MongoDB)

📁 Application.java

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();
    }
}

📁 config/MongoConfig.java

DB연동

  1. MongoConfig.java에서 MongoConfig class 생성
  2. 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;
        }
    }
}

📁 Item.java

entity 생성

```
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Item {

    // 기본키 설정 불가!
    private Long no = 0L;
    private String name = "";
    private Long price = 0L;
    private Date regdate = null;

}
```

📁 ItemService.java

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 );
}

📁 ItemServiceImpl.java

service 생성

  • mongoconfig 이용하여 DB 접속
  • public ItemServiceImpl() 사용하여 java_exam컬렉션 받아오기
    ➡️ collection = mongodb.getConnection("java_exam");
  • ItemServiceimpl.java 에서 implements ItemService
    🌎 참고 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;
        }
    }
}

📁 ItemView.html

선택 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();
    }
}

0개의 댓글