사이먼's 코딩노트
[Java] 게시판 제작(16) 본문
[게시판 제작 ~ing]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 리포지터리 주소 URL : https://github.com/psm817/full_stack_proj_2024_03
[로그인 정보 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 |