빅데이터 Java 개발자 교육 - 08일차 [DB의 내용을 Swing JFrame으로 나타내기-1]

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

오늘은 어제 배운 '상속'을 바탕으로 swing을 이용해서 만든 인터페이스 창으로 MongoDB에 저장된 데이터를 표시해보도록 하겠다!

들어가기 앞서서 먼저 아래의 표를 참고하겠다. 아래의 표는 JFrame을 이용해 인터페이스의 버튼을 누르면 어떤식으로 작동이 되는지에 대해서 간략하게 나타낸 관계도이다.

  • ActionListener interface에서 implements로 명령을 보낸다.

  • 하달된 명령을 수행하는 메소드(버튼 클릭시 반응)에서 명령을 처리한 뒤

  • 처리된 명령이 실행되도록 버튼을 관리하는 클래스로 보낸다.

(원래라면 1 - 3 - 2의 순서가 절차상 올바르지만 이해를 돕고자 위와 같이 표현하였다.)

위의 내용이 정리를해서 저렇게 보일 뿐이지, 사실상 굉장히 어려운 부분이다.

(꼭 시간내서 복습 철저하게 하자.)

금일 수업은 실습 위주로 나갔던 터라 소스코드를 참고하며 포스팅하도록 하겠다. 오늘 목표는 책 데이터를 불러주는 시스템이다.

package day8;

import java.util.Date;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor

// 책번호 no, 책제목 title, 저자 author, 가격 0, 분류 cate 'A','B','C', 등록일자 date
public class Book {

	private int no = 0; // 책번호no
	private String title = ""; // 책제목
	private String author = ""; // 저자
	private long price = 0; // 가격
	private char cate = 'A'; // 분류
	private Date date = null; // 등록일자

}

먼저 책의 정보를 저장할 class Book을 구성해준다.

package day8;

import java.util.List;

public interface BookDB {
	// 책등록 (int인 이유는 책넘버가 int이기 때문! (_id ))
	public int insertBook(Book book);

	// 책 전체조회
	public List<Book> selectBookList();

	// 책 10개씩 조회
	public List<Book> selectBookListPage(int page);

	// 책 삭제
	public int deleteBook(int no);

	// 책 수정
	public int updateBook(Book book);

	// 책1권 조회 // 반환타입
	public Book selectOneBook(int no);

	// n이상의 가격에 해당하는 책 조회
	public List<Book> selectBookPrice(long price);

	// 분류에 해당하는 항목만 조회
	public List<Book> selectBookCate(char cate);

}

이후 전달받은 책 데이터를 이용해 여러가지 조건들을 수행시키고자 "BookDB" 이름의 interface 를 만들어주었다.

오늘은 시간관계상 //'책 10개씩 조회' 까지 진도를 나갔다.
(그런데도 하루시간 순삭이다;)

먼저 책 등록 메소드다.

코드가 좀 긴 관계로 implements 클래스인 "BookDBlmpl"의 메소드는 각각 나누어서 올리도록 하겠다.

아참,

시작하기전 먼저 MongoDB로 접속해 줄 생성자부터 꼭 입력해두고 코딩을 하자!

용도는 위에서도 말했듯이 MongoDB로의 접속과 더불어 sequence(수량관리), 그리고 books 항목 생성이다.

생성자의 역할 (기억하고 넘어가자!)

  1. 객체를 생성하는 역할
  2. 멤버변수의 초기값을 할당하는 역할
  3. 객체를 생성하는 시점에 자동적으로 처리해야 할 내용을 설정하는 역할

[ 생성자는 우클릭, Source, Generate Constructor ~(조건에 맞는 생성자) 로 생성하면 된다. ]

// 생성자 먼저 생성!
	public BookDBImpl() { // DB에 책 항목 생성
		try {// 몽고DB -> 접속URL -> DB이름
			MongoDatabase db = MongoClients.create(Config.URL).getDatabase(Config.DBNAME);
			this.sequence = db.getCollection("sequence");
			this.books = db.getCollection("books");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

먼저 책 등록 메소드이다.

@Override
	public int insertBook(Book book) { // 책등록 (int인 이유는 책넘버가 int이기 때문!)
		try {
			// 책번호(시퀀스를 이용한다!)
			Bson filter = Filters.eq("_id", "SEQ_BOOK_NO"); // 책넘버와 DB시퀀스값 해당
			Bson update = Updates.inc("idx", 1); // 1개씩 추가하도록
			Document doc = this.sequence.findOneAndUpdate(filter, update); // 위의 두 객체

			Document doc1 = new Document(); // doc1을 만들어 책의 정보들을 저장할 객체를 생성
			doc1.append("_id", doc.getInteger("idx")); // 등록될때마다 +1
			doc1.append("title", book.getTitle());
			doc1.append("author", book.getAuthor());
			doc1.append("price", book.getPrice());
			doc1.append("cate", book.getCate());
			doc1.append("regdate", new Date());

			InsertOneResult result = this.books.insertOne(doc1);// 받았던 위의 doc1을 출력
			System.out.println(result);
			if (result.getInsertedId().asInt32().getValue() == doc.getInteger("idx")) {
            // 오늘 낮에 asInt64()로 잘못 코딩했다가 수정함. DB에서 한번 확인해보기
				return 1;

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

다음으로는 책 전체조회 메소드이다.

@Override
	public List<Book> selectBookList() { // 책 전체조회
		try {
			// 반환 타입을 위한 빈 배열 객체 생성
			List<Book> list = new ArrayList<Book>();

			FindIterable<Document> docs = this.books.find();
			// docs의 값을 list로 다 복사하기
			for (Document doc : docs) {
				Book book = new Book();
				book.setNo(doc.getInteger("_id"));
				book.setTitle(doc.getString("title"));
				book.setAuthor(doc.getString("author"));
				book.setPrice(doc.getLong("price"));
				book.setCate(doc.getString("cate").charAt(0)); // String -> char
				book.setDate(doc.getDate("regdate"));

				list.add(book); // 반복횟수만큼 list에 추가하기
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}

	}

마지막으로 10권씩 조회하기 메소드이다. 오늘은 여기까지 진도를 나갔다.

// 데이터를 최소 21 이상을 추가하세요
	// BookSelectListPageFrame.java
	@Override
	public List<Book> selectBookListPage(int page) {
		try {
			// 반환 타입을 위한 빈 배열 객체 생성(비어 있음)
			List<Book> list = new ArrayList<Book>();

			Bson sort = Filters.eq("_id", -1);// 책번호를 기준으로 내림차순(-1)
			// page = 1 => 0 page= 2 =>10, page=3 => 20
			FindIterable<Document> docs = this.books.find().sort(sort).skip(10 * (page - 1)).limit(10);
                                                                                           //limit이 표시수량
			// FindIterable<Document> docs = this.books.find();
			// docs의 값을 list로 다 복사하기
			for (Document doc : docs) {
				Book book = new Book();
				book.setNo(doc.getInteger("_id"));
				book.setTitle(doc.getString("title"));
				book.setAuthor(doc.getString("author"));
				book.setPrice(doc.getLong("price"));
				book.setCate(doc.getString("cate").charAt(0)); // String -> char
				book.setDate(doc.getDate("regdate"));

				list.add(book); // 반복 횟수 만큼 list에 추가하기
			}
			return list;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

이를 메인에서 한번 실행해보았다.

package day8;

import day8.frame.BookInsertFrame;
import day8.frame.BookSelectListFrame;
import day8.frame.BookSelectListPageFrame;

public class Main {

	// 화면을 실행시키는 역활만 수행
	public static void main(String[] args) {

		// 책 추가하기
		new BookInsertFrame();

		// 책 전체조회
		new BookSelectListFrame();

		// 책 10개씩조회
		new BookSelectListPageFrame();
     }
}

위부터 결과만 간단하게 사진으로 첨부하자면









모두 기능적으로 잘 작동되고 있음을 확인하였다!


강사님이 말씀하시길, 좋은 개발자란 코드를 한줄한줄 해석을 할 줄 아는 사람이 아니라, 자료를 들고와서 적용할 줄 아는 응용력이 빠른 사람이라고 하셨다.

국어, 영어, 수학을 공부하듯이 주입과 반복을 통해 기술을 습득해서는 빠르게 변화하는 시대에 살아가고 있는 현재로써 새로이 등장하는 기술의 속도를 따라갈 수 없다는것이다.

그 말을 듣고 개발자를 진로로 결정하길 참 잘했다는 생각이 들었다.

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

0개의 댓글