JAVA

Board project 만들어보기

승현0604 2023. 3. 29. 15:17

게시판을 임의로 만들어보는 시간을 가졌다 보드를 만들면서 배운내용들을 목록으로 요약을 해보자

일단 보드에 필요한 기능들을 완성시켜놓은상태에서 기능을 만들었다 .

BOARD.txt
0.00MB

 

1. user, Article 클래스의 기본설정

2. DB 연결

3. 회원가입 기능 만들기(join user)

4. 회원조회 기능 만들기(id 값으로 조회) (userInfo)

5. Article만들기 

6. article 조회, user 조회

 

1. user, Article 클래스의 기본설정

클래스 user와 Article의 기본생성자 및 getter setter을 생성시켜주고 활용시켜준다.

user and article

user로 회원가입을 해서 사용자의 정보를 조회해보고 가입한 회원을 가지고 (외래키로 연결)  게시글(article)을 작성하는 로직을 사용할 것이다. 

 

2. DB 연결

이제 테이블을 생성시키고 정보를 담기위해 DB를 연결하는 메서드를 만들어볼것이다 코드는 다음과 같다.

public static Connection dbConnect() {
		Connection conn = null;
		try {
			Properties db = new Properties();
			db.load(new FileInputStream("db.properties")); // 파일 inputStream
			Class.forName(db.getProperty("driver"));
			conn = DriverManager.getConnection(db.getProperty("url"), db.getProperty("username"),
					db.getProperty("password"));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}

	public static void close(Connection conn) {
		try {
			if (conn != null)
				conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 2-1. DB는 기본적으로 열고 닫아줘야한다. DB에 연결을 시켜놓고 안에 데이터베이스의 테이블에 들어있는 정보를 CRUD를 해주고 DB는 다시 닫아줘야하기에 close메서드고 같이 만들어놓았다. 

db.propertise라는 파일을 읽어봐주어서 url, username, password의 정보를 가지고 Mariadb와 연결을 시켜준다. 

 

이해가 안되었던 부분 

-  class의 static 메소드는 forname은 클래스의 이름을 매개변수로 받아서 class 객체를 리턴해준다. 그런데 JDBC에서 Driver 클래스를 JVM에 로드시키기 위해서 Class.forName을 사용하였다.

 

3. 회원가입 기능 생성

회원가입은 사용자의 정보를 새로이 테이블에 넣어준다는 의미이기도 하다. 테이블은 User테이블이 이미 생성이 된상태이고 위에서 봤듯이 기본 인스턴스변수와 생성자를 생성해주어서 테이블안에 칼럼들도 미리설정을 해두었기에 

DB언어중인 Insert를 사용하여 데이터를 하나씩 넣어주면 된다. 코드는 다음과 같다 .

	void joinUser() {
		System.out.println("[회원 가입]");
		System.out.print("아이디:");
		String id = sc.nextLine();
		System.out.print("이름:");
		String name = sc.nextLine();
		
		User user = new User(id, name);
		Connection conn = BoardDAO.dbConnect();
		BoardDAO.insertUser(conn, user);
		
		BoardDAO.close(conn);
		
	}

Joinuser 메서드이다 아 참고로 BoardDao라는 클래스를 만들어서 DB연결작용을 해주고 여러기능들을 넣어주는 클래스라서 종종 나올것이다. 

그리고 Connection클래스를 사용해서 conn라는 변수를 선언해주고 BoardDAO 클래스안에 insertUser메서드를 생성해주었다.  

 

다음은 insert 메서드이다. 

public static int insertUser(Connection conn, User user) {
		PreparedStatement pstmt = null;
		int cnt = 0;
		try {
			String sql = "insert into user (id, name) value(?,?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, user.getId());
			pstmt.setString(2, user.getName());
			cnt = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cnt;
	}

 

sql문으로  삽입을 시켜준다는의미인 insert를 사용하였고 id, name에 각각  value값에 ??을 넣어준다. 그리고 prepareStatement를 생성해주고 sql을 넣어준다 그리고 ?부분을 키값순서대로 setString을 해주고 executeUpdate로 실행을 시켜주면 완성이 된다. 

Article 게시물작성은 똑같이 작성이 되므로 생략한다. 

 

4. 테이블에 들어간 값들을 조회해보자 (User 테이블 조회) 

회원정보를 전부 조회하기위해서는 배열의 개념을 필요로하는데 그중에서도 우리는 ArrayList를 사용할예정이다.

이유는 java에서는 일반 배열을 선언할때는 배열의 크기를 정하고 들어가야해서 배열의 크기를 변경할수가 없는데 그러한 단점을 Arraylist에서 없애주기 때문이다(크기가 정해져있지 않을떄 사용하기 좋다는뜻)

일단 Sql작성부분을 먼저 보겠다

public static List<User> selectUserList(Connection conn){
		List<User> acc = new ArrayList<User>();
		Statement stmt = null;
		ResultSet rs = null;
		try {
			String sql = "select * from user";
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			if(rs != null) {
				while(rs.next()) {
					String id = rs.getString("id");
					String name = rs.getString("name");
					acc.add(new User(id,name));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(rs != null) rs.close();
				if(stmt != null) stmt.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
    }

 sql 문은 select from user을 써주면서 user table의 정보를 전부 가져오겠따는 의미를 가진다. 다른점이 있다면 ArrayList를 조회한다는 점인데 rs.next()를 써주면서 안에있는 밸류값들이 사라질때까지 id와 name을 계속해서 세팅해줘서 출력시켜주겠다는 의미를 가지고있다 그리고 그 id와 name을 acc배열에 넣어준다 이제 하나씩 조회를 해야하니 다시 board로가서 출력을 시켜보면

void userList() {
		System.out.println("[전체 회원 정보]");
		Connection conn = BoardDAO.dbConnect();
		List<User> acc = BoardDAO.selectUserList(conn);
		for (User user : acc) {
			System.out.println(user);
		}
		BoardDAO.close(conn);
	}

 반복문을 통해서 Usertable에 있는값들을 하나씩 가져와서 출력을시켜주면끝나게 된다.

Article도 똑같은방식으로해주었다. 

 

5. 게시글 수정

게시물을 수정을 하는 코드의 로직은 다음과 같다

1. 기존의 게시물을 조회해준다

2. 그 조회한 게시물안에 새로운값을 넣어준다

이 로직만 잘 이해하면 된다. 일단 게시물을 조회하는코드는 만들어 놓았으니 활용을 하면되고 update를 해주는 sql로직을 새로이 만들어보자

public static int updateArticle(Connection conn, Article modArticle) {
		PreparedStatement pstmt = null;
		int cnt = 0;
		try {
			String sql = "update article set title = ?,content = ? where num = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, modArticle.getTitle());
			pstmt.setString(2, modArticle.getContent());
			pstmt.setInt(3, modArticle.getNum());
			cnt = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(pstmt != null) pstmt.close();
			} catch (SQLException e2) {
				e2.printStackTrace();
			}
		}
		return cnt;
	}

사실상 새로인 회원가입을 하는거나 게시물을 작성해주는 코드와 차이는 크게없다. 차이점은 실행이 되는 sql문이 달라진것뿐

Update set을 사용해서 글의 제목과 내용을 변경하게해주는 로직을작성하였고, where num을 사용해서 글번호에 따라 나오는 글을 수정해주는 s ql문을 짰다. 

 

이제 DB에 다시 연결시켜보자.

void articleModify() {
		System.out.println("[게시글 수정]");
		System.out.print("글번호:");
		int num = Integer.parseInt(sc.nextLine());
		System.out.print("제목:");
		String title = sc.nextLine();
		System.out.print("내용:");
		String content = sc.nextLine();
		
		Connection conn = BoardDAO.dbConnect();
		Article article = BoardDAO.selectArticle(conn, num);
		BoardDAO.updateArticle(conn, article);
		if(article == null) {
			System.out.println("글이 존재하지 않습니다");
		} else {
			article.setTitle(title);
			article.setContent(content);
			BoardDAO.updateArticle(conn, article);
		}
		
		BoardDAO.close(conn);
		
	}

중간에 selectArticle을 해주는 부분이 있는데 기존에 작성되어있던 글들을 조회하여 article에 넣어주고 article에 존재하는 getter setter 메서들를 사용해서 새로이 작성된 글을 넣어준다고 생각하면 된다. 그리고 그상태로 위에 새롭게 만들었던 updateArticle에 넣어주고 update sql을 사용하여 글을 수정해주는방식을 사용하였다.  

 

오늘 배운점

DB커넥트를 사용해서 DB연동을 해보았는데 아직 헷갈리는점이 많지만 계속해서 써보지 잘 이해가 되는것같았다.  

내일 새로운 문제푼다고하니 java개념을 잘 이해하면서 다시해봐야겠다.