사이먼's 코딩노트

[Java] 게시판 제작(16) 본문

프로젝트/[Java] 게시판 제작

[Java] 게시판 제작(16)

simonpark817 2024. 4. 1. 21:43

[게시판 제작 ~ing]

 

GitHub - psm817/full_stack_proj_2024_03

Contribute to psm817/full_stack_proj_2024_03 development by creating an account on GitHub.

github.com

 

[로그인 정보 Session으로 이전]

  • 이번에는 기존에 Controller에서 구현된 로그인 정보 상태와 관련된 loginedMember와  isLogined()를 Session이라는 클래스를 따로 만들어 이전해봅시다.
  • loginedMember는 현재 로그인 된 Member의 정보로서 isLogined()로 로그인 여부를 판단한다.
  • Session.java 클래스에는 기존에 사용했던 static이 아닌 loginedMember와 로그인 여부를 판단하는 isLogined(), 로그인 된 회원을 가져오는 getLoginedMember(), 로그인 된 회원을 저장하는 setLoginedMember()를 추가한다.
  • MemberController에서는 doLogin() 동작과 함께 Session으로 연결되는 변수 session을 통해 setLoginedMember를 호출하여 로그인 된 회원 정보를 저장하고 getLoginedMember를 호출하여 해당 회원을 불러온다.
  • doLogout() 동작에선 로그아웃의 상태이기 때문에 setLoginedMember를 호출하여 null값을 채워준다.
private void doLogin() {
    System.out.printf("ID : ");
    String loginId = sc.nextLine();
    System.out.printf("Password : ");
    String loginPw = sc.nextLine();

    Member member = memberService.getMemberByLoginId(loginId);

    if(member == null) {
        System.out.println("입력하신 ID는 등록되지 않은 ID입니다. 다시 시도해주세요.");
        return;
    }

    if(member.loginPw.equals(loginPw) == false) {
        System.out.println("비밀번호가 일치하지 않습니다. 다시 시도해주세요.");
        return;
    }

    session.setLoginedMember(member);
    Member loginedMember = session.getLoginedMember();

    System.out.printf("로그인 성공!! %s 님 환영합니다.\n", loginedMember.name);
}

private void doLogout() {
    session.setLoginedMember(null);
    System.out.println("로그아웃 되었습니다.");
}
public class Session {
    public Member loginedMember;

    public boolean isLogined() {
        return loginedMember != null;
    }

    public Member getLoginedMember() {
        return loginedMember;
    }

    public void setLoginedMember(Member loginedMember) {
        this.loginedMember = loginedMember;
    }
}

 

[DB 커넥션 추가]

  • 이번엔 현재까지 구현된 Java 프로그램에 리스트를 통한 로컬 데이터가 아닌 DB를 통한 데이터를 넣기 위해 DB 커넥션을 추가해봅시다.
package org.example.db;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DBConnection {
    private Connection connection;
    public static String DB_NAME;
    public static String DB_USER;
    public static String DB_PASSWORD;
    public static int DB_PORT;

    public void connect() {
        String url = "jdbc:mysql://localhost:" + DB_PORT + "/" + DB_NAME
                + "?serverTimezone=Asia/Seoul&useOldAliasMetadataBehavior=true";
        String user = DB_USER;
        String password = DB_PASSWORD;
        String driverName = "com.mysql.cj.jdbc.Driver";

        try {
            connection = DriverManager.getConnection(url, user, password);
            Class.forName(driverName);
        } catch (SQLException e) {
            System.err.printf("[SQL 예외] : %s\n", e.getMessage());
        } catch (ClassNotFoundException e) {
            System.err.printf("[드라이버 클래스 로딩 예외] : %s\n", e.getMessage());
        }
    }

    public int selectRowIntValue(String sql) {
        Map<String, Object> row = selectRow(sql);

        for (String key : row.keySet()) {
            return (int) row.get(key);
        }

        return -1;
    }

    public String selectRowStringValue(String sql) {
        Map<String, Object> row = selectRow(sql);

        for (String key : row.keySet()) {
            return (String) row.get(key);
        }

        return "";
    }

    public Boolean selectRowBooleanValue(String sql) {
        Map<String, Object> row = selectRow(sql);

        for (String key : row.keySet()) {
            if (row.get(key) instanceof String) {
                return ((String) row.get(key)).equals("1");
            } else if (row.get(key) instanceof Integer) {
                return ((int) row.get(key)) == 1;
            } else if (row.get(key) instanceof Boolean) {
                return ((boolean) row.get(key));
            }
        }

        return false;
    }

    public Map<String, Object> selectRow(String sql) {
        List<Map<String, Object>> rows = selectRows(sql);

        if (rows.size() == 0) {
            return new HashMap<String, Object>();
        }

        return rows.get(0);
    }

    public List<Map<String, Object>> selectRows(String sql) {
        List<Map<String, Object>> rows = new ArrayList<>();

        try {
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            ResultSetMetaData metaData = rs.getMetaData();
            int columnSize = metaData.getColumnCount();

            while (rs.next()) {
                Map<String, Object> row = new HashMap<>();

                for (int columnIndex = 0; columnIndex < columnSize; columnIndex++) {
                    String columnName = metaData.getColumnName(columnIndex + 1);
                    Object value = rs.getObject(columnName);

                    if (value instanceof Long) {
                        int numValue = (int) (long) value;
                        row.put(columnName, numValue);
                    } else if (value instanceof Timestamp) {
                        String dateValue = value.toString();
                        dateValue = dateValue.substring(0, dateValue.length() - 2);
                        row.put(columnName, dateValue);
                    } else {
                        row.put(columnName, value);
                    }
                }

                rows.add(row);
            }
        } catch (SQLException e) {
            System.err.printf("[SQL 예외, SQL : %s] : %s\n", sql, e.getMessage());
            e.printStackTrace();
        }

        return rows;
    }

    public int delete(String sql) {
        int affectedRows = 0;

        Statement stmt;
        try {
            stmt = connection.createStatement();
            affectedRows = stmt.executeUpdate(sql);
        } catch (SQLException e) {
            System.err.printf("[SQL 예외, SQL : %s] : %s\n", sql, e.getMessage());
        }

        return affectedRows;
    }

    public int update(String sql) {
        int affectedRows = 0;

        Statement stmt;
        try {
            stmt = connection.createStatement();
            affectedRows = stmt.executeUpdate(sql);
        } catch (SQLException e) {
            System.err.printf("[SQL 예외, SQL : %s] : %s\n", sql, e.getMessage());
        }

        return affectedRows;
    }

    public int insert(String sql) {
        int id = -1;

        try {
            Statement stmt = connection.createStatement();
            stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
            ResultSet rs = stmt.getGeneratedKeys();

            if (rs.next()) {
                id = rs.getInt(1);
            }

        } catch (SQLException e) {
            System.err.printf("[SQL 예외, SQL : %s] : %s\n", sql, e.getMessage());
        }

        return id;
    }

    public void close() {
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e) {
                System.err.printf("[SQL 예외] : %s\n", e.getMessage());
            }
        }
    }
}
  • DBConnection.java 클래스에 있는 코드들은 select, insert, update 등을 위한 하나의 유틸로 생각해두면 좋다.
public App() {
    DBConnection.DB_NAME = "sbs_proj";
    DBConnection.DB_USER = "sbsst";
    DBConnection.DB_PASSWORD = "sbs123414";
    DBConnection.DB_PORT = 3306;

    Container.getDBConnection().connect();
}
  • App.java에서 생성자를 하나 만들어 DBConnection을 통해 데이터베이스의 이름, 계정 정보, 포트번호를 작성한다.
  • 기본 DB에 대한 접속 정보를 모두 입력하면 Container를 통해 DBConnection 객체를 생성하여 connect() 메서드를 통해 실제 DB와 연결된다.

 

[Article 구조 변경, DB에서 가져오기]

  • 이번에는 기존에 makeTestData() 메서드를 통해 최초 프로그램 실행 시 3개의 게시물 데이터를 만들었던 구조를 없애고, DB에서 직접 INSERT를 통해 3개의 게시물 데이터를 넣은 다음, 프로그램에서 SELECT 문을 이용하여 데이터를 가져오도록 해봅시다.
public List<Article> getArticles() {
    StringBuilder sb = new StringBuilder();

    sb.append(String.format("SELECT * FROM article"));

    List<Article> articles = new ArrayList<>();
    List<Map<String, Object>> rows = dbConnection.selectRows(sb.toString());

    for(Map<String, Object> row : rows) {
        articles.add(new Article(row));
    }

    return articles;
}
  • ArticleDao.java 에서 StringBuiler 객체를 하나 생성하고 append를 이용하여 SELECT 문 형식을 맞춰 작성한다.
  • 작성된 SELECT문은 문자열화 하여 DBConnetion과연결하여 rows에 조회 결과를 저장한다.
  • articles에 해당 조회 결과를 add하기 위해서는 row을 매개변수로 받는 새로운 Article 생성자가 필요하다.

 

public Article(Map<String, Object> row) {
    this.title = (String) row.get("title");
    this.body = (String) row.get("body");
    this.memberId = (int) row.get("memberId");
    this.boardId = (int) row.get("boardId");
}
  • Article.java에서 row를 매개변수로 받는 생성자를 오버로딩하고, get() 메서드를 사용하여 DB를 통해 조회된 title, body, memberId, boardId를 전역변수에 저장한다.

 

반응형

'프로젝트 > [Java] 게시판 제작' 카테고리의 다른 글

[Java] 게시판 제작(18)  (2) 2024.04.02
[Java] 게시판 제작(17)  (0) 2024.04.02
[Java] 게시판 제작(15)  (0) 2024.03.27
[Java] 게시판 제작(14)  (0) 2024.03.25
[Java] 게시판 제작(13)  (0) 2024.03.25