실습하기
이 과제의 목적은 인스타그램과 유사한 간단한 소셜 미디어 데이터베이스를 설계하고, JDBC를 사용하여 데이터베이스 관리 작업을 수행하는 것입니다.
과제 요구 사항
- 데이터베이스 생성
- 데이터베이스 이름은 instagram으로 설정합니다.
- JDBC를 사용하여 데이터베이스를 생성하는 코드를 작성합니다.
- 테이블 설계 및 생성
- 각 테이블의 스키마를 설계하고, 생성 쿼리를 작성합니다.
- 데이터 삽입
- JDBC를 사용하여 데이터 삽입 쿼리를 실행하는 코드를 작성합니다.
- 삽입 데이터는 아래 내용을 참고합니다.
String sqlInsertUsers = "INSERT INTO users (username, password) VALUES " +
"('user1', 'password1'), ('user2', 'password2'), ('user3', 'password3'), " +
"('user4', 'password4'), ('user5', 'password5'), ('user6', 'password6'), " +
"('user7', 'password7'), ('user8', 'password8'), ('user9', 'password9'), " +
"('user10', 'password10')";
String sqlInsertPosts = "INSERT INTO posts (image, message, user_id) VALUES " +
"(NULL, 'Hello World', 1), (NULL, 'Learning Java', 2), " +
"(NULL, 'At the beach', 3), (NULL, 'Eating pizza', 4), " +
"(NULL, 'Watching a movie', 5), (NULL, 'At a concert', 6), " +
"(NULL, 'Playing games', 7), (NULL, 'Reading a book', 8), " +
"(NULL, 'Visiting museums', 9), (NULL, 'Going hiking', 10)";
String sqlInsertComments = "INSERT INTO post_comments (comment, user_id, post_id) VALUES " +
"('Nice post!', 1, 1), ('Love this!', 2, 1), ('So cool!', 3, 2), " +
"('Wow!', 4, 3), ('Great pic!', 5, 3), ('Cant agree more!', 6, 4), " +
"('LOL', 7, 5), ('Thats awesome!', 8, 6), ('Yummy!', 9, 7), ('Interesting!', 10, 8)";
String sqlInsertLikes = "INSERT INTO post_likes (user_id, post_id) VALUES " +
"(1, 1), (2, 1), (3, 1), (4, 2), (5, 2), " +
"(6, 3), (7, 3), (8, 4), (9, 5), (10, 5)";
String sqlInsertFollows = "INSERT INTO follow_follower (follower_id, user_id) VALUES " +
"(1, 2), (1, 3), (2, 3), (2, 4), (3, 4), " +
"(3, 5), (4, 5), (4, 6), (5, 6), (5, 7)";
String sqlInsertHashtags = "INSERT INTO hashtags (name) VALUES " +
"('summer'), ('java'), ('beach'), ('pizza'), ('movie'), " +
"('concert'), ('games'), ('book'), ('museum'), ('hiking')";
String sqlInsertPostsHashtags = "INSERT INTO posts_hashtags (hashtag_id, post_id) VALUES " +
"(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), " +
"(6, 6), (7, 7), (8, 8), (9, 9), (10, 10)";
- 데이터베이스 생성
package instagramref;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class CreatDatabase {
public static void main(String[] args) {
try {
String URL = "jdbc:mysql://127.0.0.1:3306";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String createDatabaseSQL = "" +
"CREATE DATABASE IF NOT EXISTS instagram";
statement.execute(createDatabaseSQL);
System.out.println("instagram 데이터베이스가 생성되었습니다.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 테이블 생성
package instagramref;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class CreatTables {
public static void main(String[] args) {
try {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String usersSQL = "CREATE TABLE Users ( " +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"username VARCHAR(255) NOT NULL, " +
"password VARCHAR(255) NOT NULL)";
statement.execute(usersSQL);
String follow_followerSQL = "CREATE TABLE follow_follower ( " +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"follower_id INT, " +
"user_id INT, " +
"FOREIGN KEY (follower_id) REFERENCES Users(id) ON DELETE CASCADE, " +
"FOREIGN KEY (user_id) REFERENCES Users(id) ON DELETE CASCADE)";
statement.execute(follow_followerSQL);
String postsSQL = "CREATE TABLE Posts ( " +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"image BLOB, " +
"message TEXT, " +
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
"total_likes INT, " +
"total_comments INT, " +
"user_id INT, " +
"FOREIGN KEY (user_id) REFERENCES Users(id) ON DELETE CASCADE)";
statement.execute(postsSQL);
String hashtagSQL = "CREATE TABLE hashtags ( " +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"name VARCHAR(255))";
statement.execute(hashtagSQL);
String posthashtagSQL = "CREATE TABLE posts_hashtags ( " +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"hashtag_id INT, " +
"post_id INT, " +
"FOREIGN KEY (hashtag_id) REFERENCES hashtags(id) ON DELETE CASCADE, " +
"FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE)";
statement.execute(posthashtagSQL);
String postlikeSQL = "CREATE TABLE post_likes ( " +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
"user_id INT, " +
"post_id INT, " +
"FOREIGN KEY (user_id) REFERENCES Users(id) ON DELETE CASCADE, " +
"FOREIGN KEY (post_id) REFERENCES Posts(id) ON DELETE CASCADE)";
statement.execute(postlikeSQL);
String postcommentSQL = "CREATE TABLE post_comments ( " +
"id INT AUTO_INCREMENT PRIMARY KEY, " +
"comment VARCHAR(255), " +
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
"user_id INT, " +
"post_id INT, " +
"FOREIGN KEY (user_id) REFERENCES Users(id) ON DELETE CASCADE, " +
"FOREIGN KEY (post_id) REFERENCES Posts(id) ON DELETE CASCADE)";
statement.execute(postcommentSQL);
// System.out.println("instagram 데이터베이스가 생성되었습니다.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 더미 데이터 추가
package instagramref;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class InsetIntoDummyData {
public static void main(String[] args) {
try {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String user = "root";
String password = "11";
Connection conn = DriverManager.getConnection(URL, user, password);
Statement stmt = conn.createStatement();
String sqlInsertUsers = "INSERT INTO users (username, password) VALUES " +
"('user1', 'password1'), ('user2', 'password2'), ('user3', 'password3'), " +
"('user4', 'password4'), ('user5', 'password5'), ('user6', 'password6'), " +
"('user7', 'password7'), ('user8', 'password8'), ('user9', 'password9'), " +
"('user10', 'password10')";
int userRows = stmt.executeUpdate(sqlInsertUsers);
System.out.println(userRows + "개의 글이 Users 테이블에 생성되었습니다.");
String sqlInsertPosts = "INSERT INTO posts (image, message, user_id) VALUES " +
"(NULL, 'Hello World', 1), (NULL, 'Learning Java', 2), " +
"(NULL, 'At the beach', 3), (NULL, 'Eating pizza', 4), " +
"(NULL, 'Watching a movie', 5), (NULL, 'At a concert', 6), " +
"(NULL, 'Playing games', 7), (NULL, 'Reading a book', 8), " +
"(NULL, 'Visiting museums', 9), (NULL, 'Going hiking', 10)";
int postRows = stmt.executeUpdate(sqlInsertPosts);
System.out.println(postRows + "개의 글이 posts 테이블에 생성되었습니다.");
String sqlInsertComments = "INSERT INTO post_comments (comment, user_id, post_id) VALUES " +
"('Nice post!', 1, 1), ('Love this!', 2, 1), ('So cool!', 3, 2), " +
"('Wow!', 4, 3), ('Great pic!', 5, 3), ('Can\\'t agree more!', 6, 4), " +
"('LOL', 7, 5), ('That\\'s awesome!', 8, 6), ('Yummy!', 9, 7), ('Interesting!', 10, 8)";
int commentRows = stmt.executeUpdate(sqlInsertComments);
System.out.println(commentRows + "개의 글이 posts_comment 테이블에 생성되었습니다.");
String sqlInsertLikes = "INSERT INTO post_likes (user_id, post_id) VALUES " +
"(1, 1), (2, 1), (3, 1), (4, 2), (5, 2), " +
"(6, 3), (7, 3), (8, 4), (9, 5), (10, 5)";
int likeRows = stmt.executeUpdate(sqlInsertLikes);
System.out.println(likeRows + "개의 글이 post_likes 테이블에 생성되었습니다.");
String sqlInsertFollows = "INSERT INTO follow_follower (follower_id, user_id) VALUES " +
"(1, 2), (1, 3), (2, 3), (2, 4), (3, 4), " +
"(3, 5), (4, 5), (4, 6), (5, 6), (5, 7)";
int followRows = stmt.executeUpdate(sqlInsertFollows);
System.out.println(followRows + "개의 글이 follow_follower 테이블에 생성되었습니다.");
String sqlInsertHashtags = "INSERT INTO hashtags (name) VALUES " +
"('summer'), ('java'), ('beach'), ('pizza'), ('movie'), " +
"('concert'), ('games'), ('book'), ('museum'), ('hiking')";
int hashtagRows = stmt.executeUpdate(sqlInsertHashtags);
System.out.println(hashtagRows + "개의 글이 hashtags 테이블에 생성되었습니다.");
String sqlInsertPostsHashtags = "INSERT INTO posts_hashtags (hashtag_id, post_id) VALUES " +
"(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), " +
"(6, 6), (7, 7), (8, 8), (9, 9), (10, 10)";
int postHashtagRows = stmt.executeUpdate(sqlInsertPostsHashtags);
System.out.println(postHashtagRows + "개의 글이 posts_hashtags 테이블에 생성되었습니다.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 문제
1. 모든 사용자의 이름과 패스워드를 조회하시오.
package instagramref;
import java.sql.*;
public class Example01 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "SELECT username, password FROM Users";
ResultSet rs = statement.executeQuery(SQL);
while(rs.next()) {
System.out.println(rs.getString("username") + " " +
rs.getString("password"));
}
}
}
2. 모든 게시글의 메시지와 생성 시간을 조회하시오.
package instagramref;
import java.sql.*;
public class Example02 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "SELECT message, created_at FROM Posts";
ResultSet rs = statement.executeQuery(SQL);
while(rs.next()) {
System.out.println(rs.getString("message") + " " +
rs.getString("created_at"));
}
}
}
3. 게시글이 1개 이상 있는 모든 사용자의 이름을 조회하시오.
package instagramref;
import java.sql.*;
public class Example03 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "SELECT distinct u.username FROM users u " +
"JOIN posts p " +
"ON u.id = p.user_id ";
ResultSet rs = statement.executeQuery(SQL);
while(rs.next()) {
System.out.println(rs.getString("username"));
}
}
}
4. 최근 24시간 내에 생성된 게시글의 메시지를 조회하시오.
package instagramref;
import java.sql.*;
public class Example04 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "SELECT message FROM Posts " +
"WHERE created_at >= CURRENT_TIMESTAMP - INTERVAL 1 DAY";
ResultSet rs = statement.executeQuery(SQL);
// rs.last();
// int length = rs.getRow();
// rs.beforeFirst();
// System.out.println(length);
int count = 0;
while(rs.next()) {
System.out.println(rs.getString("message"));
count++;
}
System.out.println(count);
}
}
5. 모든 사용자의 이름과 그들의 게시글 수를 조회하시오.
package instagramref;
import java.sql.*;
public class Example05 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "SELECT u.username as username , COUNT(p.id) AS post_count " +
"FROM Users as u " +
"LEFT JOIN Posts as p ON u.id = p.user_id " +
"GROUP BY u.username";
ResultSet rs = statement.executeQuery(SQL);
while(rs.next()) {
System.out.println(rs.getString("username") + " " +
rs.getString("post_count"));
}
}
}
6. 'like'가 포함된 게시글 메시지를 조회하시오.
package instagramref;
import java.sql.*;
public class Example06 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "SELECT message FROM Posts " +
"WHERE message LIKE '%like%'";
ResultSet rs = statement.executeQuery(SQL);
while(rs.next()) {
System.out.println(rs.getString("message"));
}
}
}
7. 게시글 중 좋아요가 5개 이상인 게시글의 메시지를 조회하시오.
package instagramref;
import java.sql.*;
public class Example07 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "SELECT p.id as id, COUNT(pl.id) as count FROM Posts as p " +
"JOIN post_likes as pl " +
"ON pl.post_id = p.id " +
"GROUP BY p.id " +
"HAVING count >= 5";
ResultSet rs = statement.executeQuery(SQL);
while(rs.next()) {
System.out.println(rs.getString("id") + " " + rs.getInt("count"));
}
}
}
8. 각 게시글에 대한 총 댓글 수를 조회하시오.
package instagramref;
import java.sql.*;
public class Example08 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "SELECT ff.follower_id , count(*) " +
"FROM follow_follower ff " +
"GROUP BY ff.follower_id " +
"HAVING COUNT(*) = (SELECT MAX(cnt) from ( " +
"SELECT count(*) as cnt " +
"FROM follow_follower ff " +
"GROUP by ff.follower_id " +
") as sq)";
ResultSet rs = statement.executeQuery(SQL);
while(rs.next()) {
System.out.println(rs.getString("ff.follower_id") + " " + rs.getInt("count(*)"));
}
}
}
9. 가장 많은 팔로워를 가진 사용자의 이름을 조회하시오.
package instagramref;
import java.sql.*;
public class Example09 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "SELECT ff.follower_id , count(*) " +
"FROM follow_follower ff " +
"GROUP BY ff.follower_id " +
"HAVING count(*) = (SELECT MAX(cnt) from ( " +
"SELECT count(*) as cnt " +
"FROM follow_follower ff " +
"GROUP BY ff.follower_id " +
") as sq)";
ResultSet rs = statement.executeQuery(SQL);
while(rs.next()) {
System.out.println(rs.getString("ff.follower_id") + " " + rs.getInt("count(*)"));
}
}
}
10. 특정 사용자의 이름을 변경하시오. 예를 들어, 사용자 'user1'의 이름을 'newUser1'로 변경하시오.
package instagramref;
import java.sql.*;
public class Example10 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "UPDATE Users SET username = 'newUSer1' WHERE username = 'user1'";
statement.executeUpdate(SQL);
// while(rs.next()) {
// System.out.println(rs.getString("ff.follower_id") + " " + rs.getInt("count(*)"));
// }
}
}
11. 게시글의 좋아요 수를 증가시키는 쿼리를 작성하시오. 예를 들어, 게시글 ID가 3인 게시글의 좋아요 수를 5 증가시키시오.
package instagramref;
import java.sql.*;
public class Example11 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "INSERT INTO post_likes (user_id, post_id) VALUES " +
"(6, 3), (7, 3), (8, 3), (9, 3), (2, 3);";
int count = statement.executeUpdate(SQL);
System.out.println(count);
// while(rs.next()) {
// System.out.println(rs.getString("ff.follower_id") + " " + rs.getInt("count(*)"));
// }
}
}
12. 특정 사용자의 모든 게시글의 메시지에 추가 텍스트를 삽입하시오. 예를 들어, 사용자 ID가 2인 사용자의 모든 게시글에 " - updated"를 메시지 끝에 추가하시오.
package instagramref;
import java.sql.*;
public class Example12 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "UPDATE Posts SET message = " +
"CONCAT(message, ' - updated') " +
"WHERE user_id = 2";
int count = statement.executeUpdate(SQL);
System.out.println(count);
// while(rs.next()) {
// System.out.println(rs.getString("ff.follower_id") + " " + rs.getInt("count(*)"));
// }
}
}
13. 사용자가 작성한 모든 글의 message를 업데이트하시오. 예를 들어, 사용자 ID가 4인 사용자가 작성한 message를 'hello world'로 변경하시오.
package instagramref;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Example13 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement statement = conn.createStatement();
String SQL = "UPDATE Posts SET message = " +
"'hello world' " +
"WHERE user_id = 4";
int count = statement.executeUpdate(SQL);
System.out.println(count);
// while(rs.next()) {
// System.out.println(rs.getString("ff.follower_id") + " " + rs.getInt("count(*)"));
// }
}
}
14. 특정 게시글의 생성 날짜를 현재 날짜와 시간으로 업데이트하시오. 예를 들어, 게시글 ID가 1인 게시글의 생성 날짜를 현재 날짜와 시간으로 업데이트하시오.
package instagramref;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Example14 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String user = "root";
String password = "11";
Connection conn = DriverManager.getConnection(URL, user, password);
Statement stmt = conn.createStatement();
String SQL = "UPDATE Posts SET message = " +
"CURRENT_TIMESTAMP " +
"WHERE id = 1";
int count = stmt.executeUpdate(SQL);
System.out.println(count);
// while (rs.next()) {
// System.out.println(rs.getString("p.id") + " " + rs.getInt("COUNT(pc.id)"));
// }
}
}
15. 특정 사용자의 모든 게시글을 삭제하시오. 예를 들어, 사용자 ID가 5인 사용자의 모든 게시글을 삭제하시오.
package instagramref;
import java.sql.*;
public class Example15 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String user = "root";
String password = "11";
Connection conn = DriverManager.getConnection(URL, user, password);
Statement stmt = conn.createStatement();
String SQL = "DELETE FROM Posts WHERE user_id = 5";
}
}
16. 특정 사용자를 삭제하시오. 이 때, 관련된 모든 게시글, 댓글, 좋아요, 팔로우 정보도 함께 삭제하시오. 예를 들어, 사용자 ID가 10인 사용자와 그의 관련 데이터를 모두 삭제하시오.
package instagramref;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Example16 {
public static void main(String[] args) throws SQLException {
String URL = "jdbc:mysql://127.0.0.1:3306/instagram";
String USER = "root";
String PASSWORD = "11";
Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
String SQL = "DELETE FROM Users WHERE id = 10";
int count = stmt.executeUpdate(SQL);
System.out.println(count);
}
}