개발자: 사이버데장 (1971063 김윤서 1971079 윤가영 1971082 이유림)
‘롯데베시네마 – 집에서 다시 보는 명작’ 프로그램은 여러 명작 영화 Database를 기반으로 사용자가 편리하게 카테고리별, 영화제별 명작을 검색하거나 조회하고, 사용자가 특정 영화를 ‘나의 명작’에 추가하여 자신이 원하는 명작 리스트를 조회할 수 있는 명작 다시보기 프로그램이다.
-
JDBC 연결
Mysql-connector-java-버전 압축파일 다운
→ Project Settings-Libraries탭의 +를 눌러 Java 선택
→ mysql-connector-java-버전-bin.jar를 선택
-
JavaFX 설치 및 연결
JavaFX 다운
→ JDK에 JavaFX 추가
→ Run-Edit Configurations-Application-Main 선택
→ Modify options-Add VM options 선택
→
--module-path /path/to/javafx/sdk --add-modules javafx.controls,javafx.fxml추가- OpenJDK 14를 쓰는 경우
→
-add-exports javafx.graphics/com.sun.javafx.sg.prism=ALL-UNNAMED추가
- 명작 차트
- 명작 카테고리
- 명작 검색
- 나의 명작
- 영화제 다시보기
- 할인 영화
제목/감독으로 원하는 영화를 찾을 수 있음
- 제목
- 감독 검색
사용자가 원하는 명작을 '나의 명작'에 추가, 삭제하고 조회할 수 있음






영화제별로, 수상부문 별, 수상 작품 중 현재 상영 중인 영화를 조회할 수 있음
사용자 - 이번 달 할인 영화의 목록을 조회할 수 있음
- 적어도 2개의 뷰를 정의해야 한다. (레포트에 view를 사용한 이유를 설명)
create view DB2021_MOVIE_VIEW(
id, title, eng_title, director, released_year, movie_type, genre, nation_id)
as (select id, title, eng_title, director, released_year, movie_type, genre, nation_id from DB2021_MOVIE
where discount_start < now() and discount_end > now());→ 롯데베시네마의 일반 사용자들은 할인 정보를 미리 알면 안되기 때문에,
직원만 전체 할인 정보를 볼 수 있고 일반 사용자는 이 view를 통해 오늘을 기준으로 해당 월의 할인정보만 볼 수 있게 함.
create view DB2021_MOVIE_SEARCH_VIEW(
title, eng_title, director)
as (select title, eng_title, director from DB2021_MOVIE);→ 조회작업이 가장 많이 일어나는 영화 검색에서 필요한 정보인 제목, 영어제목, 감독만 뽑아오는 뷰를 사용함. 우리 영화 db는 새로운 영화가 자주 삽입되지 않으므로 업데이트가 자주 일어나지 않아도 된다.
- 적어도 4개의 인덱스를 정의해야 한다.
create index index_nation on DB2021_NATION(id);
create index index_film_festival on DB2021_FILM_FESTIVAL(name, festival_year);
create index index_result on DB2021_RESULT(movie_id, film_festival_name, film_festival_year, awards);
create index index_movie on DB2021_MOVIE(id);- 인덱스를 사용하는 쿼리들을 포함해야 한다.
String query = "INSERT INTO DB2021_LIKE(user_nickname, movie_id) value (?,(select id from DB2021_MOVIE where title=?))";- 뷰를 사용하는 쿼리를 포함해야 한다.
String str = "select * from db2021_movie_view";→ 해당 월의 할인정보만 포함된 view를 사용자가 select하여 볼 수 있음.
String query = "SELECT * FROM DB2021_MOVIE_SEARCH_VIEW WHERE title = ?";→ 사용자가 명작을 검색할 때 전체 정보가 아닌 명작 제목과 영어제목, 감독만 보이게 하는 쿼리문
- 트랜잭션(transaction)을 포함해야 한다.
public void insert(String value, String movie_name) {
String query = "INSERT INTO DB2021_LIKE(user_nickname, movie_id) value (?,(select id from DB2021_MOVIE where title=?))";
try (
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
PreparedStatement pStmt = conn.prepareStatement(query);
PreparedStatement pStmt2 = conn.prepareStatement("update DB2021_MOVIE set like_count = like_count+1
where title = ?");
) {
try {
stmt.executeQuery("use DB2021Team04");
conn.setAutoCommit(false);
pStmt.setString(1, value);
pStmt.setString(2, movie_name);
pStmt.executeUpdate();
pStmt2.setString(1, movie_name);
pStmt2.executeUpdate();
System.out.println("나의 명작 추가가 완료되었습니다.\n");
System.out.println("---------------------------------------------------------------\n");
conn.commit();
} catch (SQLException se) {
se.printStackTrace();
System.out.println("Rolling back data here...");
try {
if(conn != null)
conn.rollback();
} catch(SQLException se2) {
se2.printStackTrace();;
}
conn.setAutoCommit(true);
}
} catch (SQLException se) {
System.out.println("error");
se.printStackTrace();
}
}- **중첩된 쿼리(nested query)**들을 가지는 쿼리들을 포함해야 한다.
String query = "INSERT INTO db2021_like(user_nickname, movie_id) value (?,(select id from db2021_movie where title=?))";
String query = "DELETE FROM DB2021_like where user_nickname=? and movie_id=(select id from db2021_movie where title=?)";- 조인 쿼리(join query)들을 가지는 쿼리들은 포함해야 한다.
PreparedStatement pStmt = conn.prepareStatement("select title, awards from db2021_movie join db2021_result
on (db2021_result.movie_id=db2021_movie.id and db2021_result.film_festival_name=?)");
ResultSet rs = stmt.executeQuery("select title, director, genre, lang from db2021_movie join db2021_nation
on (db2021_movie.nation_id=db2021_nation.id) where now_showing=true");
PreparedStatement pStmt = conn.prepareStatement("select title, film_festival_name from db2021_movie join db2021_result
on (db2021_result.movie_id=db2021_movie.id and db2021_result.awards=?)");
String query = "SELECT user_nickname,movie_id,title FROM db2021_like INNER JOIN db2021_movie
on db2021_like.movie_id=db2021_movie.id where user_nickname=?";- 매개 변수를 가지면서 동적으로 만드는 쿼리를 포함해야 한다. 다시 말해, 사용자로부터 입력 값을 받고 사용자가 입력한 값으로 쿼리를 생성한다.
public void searchDirector(String value) { //value로 사용자 입력값을 받아옴
String query = "SELECT * FROM db2021_movie WHERE director = ?";
try (
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
PreparedStatement pStmt = conn.prepareStatement(query);
) {
stmt.executeQuery("use cinema");
pStmt.setString(1, value); //PreparedStatement로 입력값으로 쿼리를 생성함
ResultSet rs = pStmt.executeQuery();
if(!rs.next()){
System.out.print("\""+value+"\"");
System.out.println("로 검색한 결과가 없습니다.\n");
}
else{
do {
System.out.print("\""+value+"\"");
System.out.println("로 검색한 결과입니다.");
String title = rs.getString(2);
String eng_title = rs.getString(3);
String director = rs.getString(4);
System.out.print(title);
System.out.print("\t\t\t" + eng_title);
System.out.println("\t\t\t" + director);
System.out.println();
} while (rs.next());
}
} catch (SQLException se) {
System.out.println("error");
se.printStackTrace();
}
}- 그래픽 또는 문자 기반의 사용자 인터페이스를 사용해야 한다. 사용하기 쉽고 사용하기에 도움이 되는 정보를 가지고 있는 메뉴를 제공해야 한다.
- 데이터베이스에 삽입(insert)을 하기 위한 인터페이스와 쿼리를 가지고 있어야 한다.
String query = "INSERT INTO db2021_like(user_nickname, movie_id) value (?,(select id from db2021_movie where title=?))";public void insert(String user_nickname, String movie_name) {
/* user_nickname 이라는 유저가 movie_name을 title로 가지는 영화를 나의 명작에서 삭제*/
}- 데이터베이스에 갱신(update)을 하기 위한 인터페이스와 쿼리를 가지고 있어야 한다.
PreparedStatement pStmt2 = conn.prepareStatement("update DB2021_MOVIE set like_count = like_count+1 where title = ?");
PreparedStatement pStmt2 = conn.prepareStatement("update DB2021_MOVIE set like_count = like_count-1 where title = ?");- 데이터베이스에 삭제(delete)를 하기 위한 인터페이스와 쿼리를 가지고 있어야 한다.
public void delete(String user_nickname, String movie_title) { // search.Model
// user_nickname 이라는 가진 유저가 movie_title을 나의 명작에서 삭제하는 메서드
}String query = "DELETE FROM DB2021_like where user_nickname=? and movie_id=(select id from db2021_movie where title=?)";- 데이터베이스에 검색(select)을 하기 위한 인터페이스와 쿼리를 가지고 있어야 한다.
String query = "SELECT * FROM db2021_movie WHERE title = ?";
String query = "SELECT * FROM db2021_movie WHERE director = ?";
String str = "select title, discount_start, discount_end from db2021_movie";



































