diff --git a/.project b/.project new file mode 100644 index 0000000..f5623ba --- /dev/null +++ b/.project @@ -0,0 +1,11 @@ + + + database2025 + + + + + + + + diff --git a/DB2025Team07/.project b/DB2025Team07/.project new file mode 100644 index 0000000..9bebd7f --- /dev/null +++ b/DB2025Team07/.project @@ -0,0 +1,31 @@ + + + DB2025Team07 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/DB2025Team07/bin/.gitignore b/DB2025Team07/bin/.gitignore new file mode 100644 index 0000000..d8fe4fa --- /dev/null +++ b/DB2025Team07/bin/.gitignore @@ -0,0 +1 @@ +/.project diff --git a/DB2025_EJobDam.sql b/DB2025_EJobDam.sql new file mode 100644 index 0000000..a541a89 --- /dev/null +++ b/DB2025_EJobDam.sql @@ -0,0 +1,125 @@ +Create Database EJobDam; +Show databases; +Use EJobDam; + +# 학번, 비밀번호, 닉네임, 이메일, 전화번호, 평점(0.00~5.00의 값을 가지고, 초기값은 0.00) +CREATE TABLE DB2025Team07_Users( + id VARCHAR(7) PRIMARY KEY, + pwd VARCHAR(20) NOT NULL, + nickname VARCHAR(20) NOT NULL, + email VARCHAR(40) UNIQUE NOT NULL, + phone VARCHAR(13) UNIQUE NOT NULL, + rating DECIMAL(3,2) DEFAULT 0.00 CHECK ( + rating >= 0.00 AND rating <= 5.00) +); + +Describe DB2025Team07_Users; + +# 초기 생성시에는 평점이 0.00으로 부여되므로 rating을 생략하고 값을 넣어줌 +INSERT INTO DB2025Team07_Users (id, pwd, nickname, email, phone) +VALUES('2276012', 'hellokim', '화요니._.', 'hellokim@ewhain.net', '010-1234-2276'); + +SELECT * FROM DB2025Team07_Users; + +INSERT INTO DB2025Team07_Users (id, pwd, nickname, email, phone) VALUES + ('2276123', 'pwd123', '빵애예요', 'bbangae@ewha.ac.kr', '010-1234-5678'), + ('2103123', 'test21ggam', '깜지공듀', 'ggamji@ewhain.net', '010-2103-0123'), + ('1955034', '1004@@!!', '소금빵천사', 'saltbreadangel@ewha.ac.kr', '010-3456-7890'), + ('2003076','password2003','주니어00', 'junior00@ewha.ac.kr', '010-4567-8901'), + ('2271055','abcd1111', '자구요정','dsking@ewhain.net', '010-1111-2222'); + +SELECT * FROM DB2025Team07_Users; + +# 학번, 비밀번호, 닉네임, 이메일, 전화번호, 평점(0.00~5.00의 값을 가지고, 초기값은 0.00) +CREATE TABLE DB2025Team07_Recruitment( + id INT PRIMARY KEY, + user_id VARCHAR(7), + work_place VARCHAR(20) NOT NULL, + start_day DATETIME NOT NULL, + work_period VARCHAR(20) NOT NULL, + salary INT NOT NULL, + # rating은 고유값이 아니라, 동적 값이라 외래키로 받아올 수 없음 + # user_id로 user 테이블 조인해서 받아오는 형식으로 참조 가능 + # rating을 자주 보여줘야 하는 경우 여기서 view 사용 가능 + recruitment_status VARCHAR(10) DEFAULT '모집중' + CHECK (recruitment_status IN ('모집중', '모집마감', '근무완료')), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES DB2025Team07_Users(id) ON DELETE CASCADE +); + +Describe DB2025Team07_Recruitment; + +INSERT INTO DB2025Team07_Recruitment (id, user_id, work_place, start_day, work_period, salary, recruitment_status, created_at) VALUES +(1, '2276123', '이화여대 학관', '2025-06-01 09:00:00', '1시간', 5000, '모집중', NOW()), +(2, '2103123', '서울 마포구', '2025-06-15 10:00:00', '3일', 100000, '모집마감', NOW()), +(3, '1955034', '이화여대 이하우스', '2025-07-01 09:30:00', '1일', 50000, '근무완료', NOW()), +(4, '2003076', '이화여대 한우리집', '2025-06-20 08:00:00', '1시간', 10000, '모집중', NOW()), +(5, '2271055', '서울 종로구', '2025-07-10 09:00:00', '2일', 80000, '모집중', NOW()); + +SELECT * FROM DB2025Team07_Recruitment; +#Drop table DB2025Team07_Recruitment; + +CREATE TABLE DB2025Team07_SUPPORT ( + RECRUIT_ID INT NOT NULL, + USER_ID VARCHAR(20) NOT NULL, + RECRUITMENT_STATE ENUM('채택됨', '채택 안됨') DEFAULT '채택 안됨', + SUPPORT_TEXT TEXT, + SUPPORT_CREATED_AT DATETIME DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (RECRUIT_ID, USER_ID), + FOREIGN KEY (RECRUIT_ID) REFERENCES DB2025Team07_RECRUITMENT(id) ON DELETE CASCADE, + FOREIGN KEY (USER_ID) REFERENCES DB2025Team07_USERS(id) ON DELETE CASCADE +); + +-- 3. 데이터 삽입 +INSERT INTO DB2025Team07_SUPPORT ( + RECRUIT_ID, USER_ID, RECRUITMENT_STATE, SUPPORT_TEXT, SUPPORT_CREATED_AT +) VALUES +(1, '2276123', '채택됨', '바로 도와드릴 수 있어요!', NOW()), +(2, '1955034', '채택 안됨', '오늘 오후에 가능해요!', NOW()), +(3, '1955034', '채택 안됨', '제가 해본 적 있어요. 잘할 수 있습니다.', NOW()), +(4, '2003076', '채택 안됨', '시간 맞춰 드릴 수 있어요!', NOW()), +(5, '2276123', '채택됨', '경험 많아요. 믿고 맡겨주세요!', NOW()); +SELECT * FROM DB2025Team07_SUPPORT; + +#DROP table DB2025Team07_support; + +# 내가 작성한 모집글 보기 (뷰) 생성 +CREATE VIEW MyRecruits AS +SELECT R.*, U.nickname +FROM DB2025Team07_Recruitment R +JOIN DB2025Team07_Users U ON R.user_id = U.id; + +DESC MyRecruits; +SELECT * FROM MyRecruits WHERE user_id = '2276123'; + +# 내가 작성한 지원글 보기 (뷰) 생성 +CREATE OR REPLACE VIEW MySupportApplications AS +SELECT + S.RECRUIT_ID, + S.USER_ID, + U.nickname AS supporter_nickname, + R.work_place, + R.start_day, + R.salary, + S.RECRUITMENT_STATE, + S.SUPPORT_TEXT, + S.SUPPORT_CREATED_AT +FROM DB2025Team07_SUPPORT S +LEFT JOIN DB2025Team07_RECRUITMENT R ON S.RECRUIT_ID = R.id +LEFT JOIN DB2025Team07_USERS U ON S.USER_ID = U.id; +# LEFT JOIN 사용하여 지원글 기준으로 전체 기록 보존 + +-- 내가 지원한 모집글 전체 보기 +SELECT * FROM MySupportApplications WHERE USER_ID = '2276123'; + +INSERT INTO DB2025Team07_Recruitment (id, user_id, work_place, start_day, work_period, salary, recruitment_status, created_at) +VALUES (6, "1919019", "이화여대 학관", '2025-06-02 09:00:00', '1시간', 5000, '모집중', NOW()); + +/*** RENAME TABLE + DB2025_USERS TO DB2025Team07_USERS, + DB2025_RECRUITMENT TO DB2025Team07_RECRUITMENT, + DB2025_SUPPORT TO DB2025Team07_SUPPORT; + ***/ + +#DROP VIEW IF EXISTS MyRecruits; +#DROP VIEW IF EXISTS MySupportApplications; diff --git a/DBconstructTest/sql/EJobDam.sql b/DBconstructTest/sql/EJobDam.sql index 0d9d2a9..434aa63 100644 --- a/DBconstructTest/sql/EJobDam.sql +++ b/DBconstructTest/sql/EJobDam.sql @@ -3,8 +3,8 @@ Show databases; Use EJobDam; # 학번, 비밀번호, 닉네임, 이메일, 전화번호, 평점(0.00~5.00의 값을 가지고, 초기값은 0.00) -CREATE TABLE Users( - user_id VARCHAR(7) PRIMARY KEY, +CREATE TABLE DB2025_Users( + id VARCHAR(7) PRIMARY KEY, pwd VARCHAR(20) NOT NULL, nickname VARCHAR(20) NOT NULL, email VARCHAR(40) UNIQUE NOT NULL, @@ -13,20 +13,105 @@ CREATE TABLE Users( rating >= 0.00 AND rating <= 5.00) ); -Describe Users; +Describe DB2025_Users; # 초기 생성시에는 평점이 0.00으로 부여되므로 rating을 생략하고 값을 넣어줌 -INSERT INTO Users (user_id, pwd, nickname, email, phone) +INSERT INTO DB2025_Users (id, pwd, nickname, email, phone) VALUES('2276012', 'hellokim', '화요니._.', 'hellokim@ewhain.net', '010-1234-2276'); -SELECT * FROM Users; +SELECT * FROM DB2025_Users; -INSERT INTO Users (user_id, pwd, nickname, email, phone) VALUES +INSERT INTO DB2025_Users (id, pwd, nickname, email, phone) VALUES ('2276123', 'pwd123', '빵애예요', 'bbangae@ewha.ac.kr', '010-1234-5678'), ('2103123', 'test21ggam', '깜지공듀', 'ggamji@ewhain.net', '010-2103-0123'), ('1955034', '1004@@!!', '소금빵천사', 'saltbreadangel@ewha.ac.kr', '010-3456-7890'), ('2003076','password2003','주니어00', 'junior00@ewha.ac.kr', '010-4567-8901'), ('2271055','abcd1111', '자구요정','dsking@ewhain.net', '010-1111-2222'); -SELECT * FROM Users; -#Drop Table Users; \ No newline at end of file +SELECT * FROM DB2025_Users; +#Drop Table Users; + +# 학번, 비밀번호, 닉네임, 이메일, 전화번호, 평점(0.00~5.00의 값을 가지고, 초기값은 0.00) +CREATE TABLE DB2025_Recruitment( + id INT PRIMARY KEY, + user_id VARCHAR(7), + work_place VARCHAR(20) NOT NULL, + start_day DATETIME NOT NULL, + work_period VARCHAR(20) NOT NULL, + salary INT NOT NULL, + # rating은 고유값이 아니라, 동적 값이라 외래키로 받아올 수 없음 + # user_id로 user 테이블 조인해서 받아오는 형식으로 참조 가능 + # rating을 자주 보여줘야 하는 경우 여기서 view 사용 가능 + recruitment_status VARCHAR(10) DEFAULT '모집중' + CHECK (recruitment_status IN ('모집중', '모집마감', '근무완료')), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES DB2025_Users(id) ON DELETE CASCADE +); + +Describe DB2025_Recruitment; + +INSERT INTO DB2025_Recruitment (id, user_id, work_place, start_day, work_period, salary, recruitment_status, created_at) VALUES +(1, '2276123', '이화여대 학관', '2025-06-01 09:00:00', '1시간', 5000, '모집중', NOW()), +(2, '2103123', '서울 마포구', '2025-06-15 10:00:00', '3일', 100000, '모집마감', NOW()), +(3, '1955034', '이화여대 이하우스', '2025-07-01 09:30:00', '1일', 50000, '근무완료', NOW()), +(4, '2003076', '이화여대 한우리집', '2025-06-20 08:00:00', '1시간', 10000, '모집중', NOW()), +(5, '2271055', '서울 종로구', '2025-07-10 09:00:00', '2일', 80000, '모집중', NOW()); + +SELECT * FROM DB2025_Recruitment; +#Drop table DB2025_Recruitment; + +CREATE TABLE DB2025_SUPPORT ( + RECRUIT_ID INT NOT NULL, + USER_ID VARCHAR(20) NOT NULL, + RECRUITMENT_STATE ENUM('채택됨', '채택 안됨') DEFAULT '채택 안됨', + SUPPORT_TEXT TEXT, + SUPPORT_CREATED_AT DATETIME DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (RECRUIT_ID, USER_ID), + FOREIGN KEY (RECRUIT_ID) REFERENCES DB2025_RECRUITMENT(id) ON DELETE CASCADE, + FOREIGN KEY (USER_ID) REFERENCES DB2025_USERS(id) ON DELETE CASCADE +); + +-- 3. 데이터 삽입 +INSERT INTO DB2025_SUPPORT ( + RECRUIT_ID, USER_ID, RECRUITMENT_STATE, SUPPORT_TEXT, SUPPORT_CREATED_AT +) VALUES +(1, '2276123', '채택됨', '바로 도와드릴 수 있어요!', NOW()), +(2, '1955034', '채택 안됨', '오늘 오후에 가능해요!', NOW()), +(3, '1955034', '채택 안됨', '제가 해본 적 있어요. 잘할 수 있습니다.', NOW()), +(4, '2003076', '채택 안됨', '시간 맞춰 드릴 수 있어요!', NOW()), +(5, '2276123', '채택됨', '경험 많아요. 믿고 맡겨주세요!', NOW()); +SELECT * FROM DB2025_SUPPORT; + +#DROP table DB2025_support; + +# 내가 작성한 모집글 보기 (뷰) 생성 +CREATE VIEW MyRecruits AS +SELECT R.*, U.nickname +FROM DB2025_Recruitment R +JOIN DB2025_Users U ON R.user_id = U.id; + +DESC MyRecruits; +SELECT * FROM MyRecruits WHERE user_id = '2276123'; + +# 내가 작성한 지원글 보기 (뷰) 생성 +CREATE OR REPLACE VIEW MySupportApplications AS +SELECT + S.RECRUIT_ID, + S.USER_ID, + U.nickname AS supporter_nickname, + R.work_place, + R.start_day, + R.salary, + S.RECRUITMENT_STATE, + S.SUPPORT_TEXT, + S.SUPPORT_CREATED_AT +FROM DB2025_SUPPORT S +LEFT JOIN DB2025_RECRUITMENT R ON S.RECRUIT_ID = R.id +LEFT JOIN DB2025_USERS U ON S.USER_ID = U.id; +# LEFT JOIN 사용하여 지원글 기준으로 전체 기록 보존 + +-- 내가 지원한 모집글 전체 보기 +SELECT * FROM MySupportApplications WHERE USER_ID = '2276123'; + +INSERT INTO DB2025_Recruitment (id, user_id, work_place, start_day, work_period, salary, recruitment_status, created_at) +VALUES (6, "1919019", "이화여대 학관", '2025-06-02 09:00:00', '1시간', 5000, '모집중', NOW()); diff --git a/EJobDam/.classpath b/EJobDam/.classpath new file mode 100644 index 0000000..7d5b583 --- /dev/null +++ b/EJobDam/.classpath @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/EJobDam/.gitignore b/EJobDam/.gitignore new file mode 100644 index 0000000..84c048a --- /dev/null +++ b/EJobDam/.gitignore @@ -0,0 +1 @@ +/build/ diff --git a/EJobDam/.project b/EJobDam/.project new file mode 100644 index 0000000..f820be4 --- /dev/null +++ b/EJobDam/.project @@ -0,0 +1,31 @@ + + + EJobDam + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/EJobDam/.settings/.jsdtscope b/EJobDam/.settings/.jsdtscope new file mode 100644 index 0000000..76c2d63 --- /dev/null +++ b/EJobDam/.settings/.jsdtscope @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/EJobDam/.settings/org.eclipse.core.resources.prefs b/EJobDam/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..99f26c0 --- /dev/null +++ b/EJobDam/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/EJobDam/.settings/org.eclipse.jdt.core.prefs b/EJobDam/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..23fa13b --- /dev/null +++ b/EJobDam/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=21 +org.eclipse.jdt.core.compiler.compliance=21 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=21 diff --git a/EJobDam/.settings/org.eclipse.wst.common.component b/EJobDam/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..761741c --- /dev/null +++ b/EJobDam/.settings/org.eclipse.wst.common.component @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/EJobDam/.settings/org.eclipse.wst.common.project.facet.core.xml b/EJobDam/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..88a232b --- /dev/null +++ b/EJobDam/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/EJobDam/.settings/org.eclipse.wst.jsdt.ui.superType.container b/EJobDam/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/EJobDam/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/EJobDam/.settings/org.eclipse.wst.jsdt.ui.superType.name b/EJobDam/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/EJobDam/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/EJobDam/src/main/java/PostRecruitServlet/PostRecruitServlet.java b/EJobDam/src/main/java/PostRecruitServlet/PostRecruitServlet.java new file mode 100644 index 0000000..a3a883f --- /dev/null +++ b/EJobDam/src/main/java/PostRecruitServlet/PostRecruitServlet.java @@ -0,0 +1,88 @@ +package PostRecruitServlet; + +import javax.servlet.*; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; +import java.io.IOException; +import java.sql.*; + +/** + * 모집글 작성 서블릿. + * + * - GET 요청 시: 모집글 작성 폼(post_recruits.jsp) 페이지를 보여줍니다. + * - POST 요청 시: 입력된 모집글 정보를 DB에 저장하고, 저장에 성공하면 메인 페이지로 리디렉션합니다. + * + * 세션에 로그인 정보(user_id)가 없으면 login.html로 리디렉션됩니다. + */ + +@WebServlet("/postRecruit") +public class PostRecruitServlet extends HttpServlet { + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + HttpSession session = request.getSession(); + String userId = (String) session.getAttribute("user_id"); + + if (userId == null) { + response.sendRedirect("login.html"); + return; + } + + request.setCharacterEncoding("UTF-8"); + String workPlace = request.getParameter("work_place"); + String startDay = request.getParameter("start_day"); // yyyy-MM-dd + String startTime = request.getParameter("start_time"); // HH:mm + String workPeriod = request.getParameter("work_period"); + String salaryStr = request.getParameter("salary"); + String description = request.getParameter("description"); + + try { + int salary = Integer.parseInt(salaryStr); + String startDateTime = startDay + " " + startTime + ":00"; + + Class.forName("com.mysql.cj.jdbc.Driver"); + try (Connection conn = DriverManager.getConnection( + "jdbc:mysql://localhost:3306/DB2025Team07?serverTimezone=UTC", "root", "root")) { + + String sql = "INSERT INTO DB2025_Recruitment " + + "(user_id, work_place, start_day, work_period, salary, recruitment_text) " + + "VALUES (?, ?, ?, ?, ?, ?)"; + + try (PreparedStatement pstmt = conn.prepareStatement(sql)) { + pstmt.setString(1, userId); + pstmt.setString(2, workPlace); + pstmt.setString(3, startDateTime); + pstmt.setString(4, workPeriod); + pstmt.setInt(5, salary); + pstmt.setString(6, description); + + int result = pstmt.executeUpdate(); + + if (result > 0) { + response.sendRedirect("main"); + } else { + response.sendRedirect("error.jsp"); + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + request.setAttribute("error", e.getMessage()); + request.getRequestDispatcher("error.jsp").forward(request, response); + } + } + + // GET 요청 시 폼 페이지 보여주기 + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + HttpSession session = request.getSession(); + if (session.getAttribute("user_id") == null) { + response.sendRedirect("login.html"); + return; + } + request.getRequestDispatcher("post_recruits.jsp").forward(request, response); + } +} diff --git a/EJobDam/src/main/java/RecruitListServlet/RecruitListServlet.java b/EJobDam/src/main/java/RecruitListServlet/RecruitListServlet.java new file mode 100644 index 0000000..05a4e57 --- /dev/null +++ b/EJobDam/src/main/java/RecruitListServlet/RecruitListServlet.java @@ -0,0 +1,61 @@ +package RecruitListServlet; + +import java.io.*; +import java.sql.*; +import java.util.*; + +import javax.servlet.*; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; + +/** + * 메인 페이지 출력용 서블릿. + * + * - 경로: /main + * - 역할: DB에서 모집글 목록을 조회하고, main.jsp에 전달합니다. + * - 전달 데이터: recruitList (List>) + * + * DB 연결 실패 등 오류 발생 시 error 메시지를 request에 포함합니다. + */ + +@WebServlet("/main") +public class RecruitListServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + String jdbcUrl = "jdbc:mysql://localhost:3306/DB2025Team07?serverTimezone=UTC"; + String dbUser = "root"; // ← 본인 계정으로 수정 + String dbPass = "root"; // ← 본인 비번으로 수정 + + List> recruitList = new ArrayList<>(); + + try { + Class.forName("com.mysql.cj.jdbc.Driver"); // 드라이버 로딩! + try (Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + PreparedStatement pstmt = conn.prepareStatement( + "SELECT R.id, R.work_place, R.start_day, R.work_period, R.salary, R.recruitment_status, U.nickname, R.recruitment_text " + + "FROM DB2025_Recruitment R JOIN DB2025_Users U ON R.user_id = U.id ORDER BY R.created_at DESC"); + ResultSet rs = pstmt.executeQuery()) { + + while (rs.next()) { + Map map = new HashMap<>(); + map.put("id", rs.getInt("id")); + map.put("place", rs.getString("work_place")); + map.put("date", rs.getString("start_day")); + map.put("period", rs.getString("work_period")); + map.put("salary", rs.getInt("salary")); + map.put("status", rs.getString("recruitment_status")); + map.put("nickname", rs.getString("nickname")); + map.put("description", rs.getString("recruitment_text")); + recruitList.add(map); + } + } + + } catch (Exception e) { + request.setAttribute("error", e.getMessage()); + } + + request.setAttribute("recruitList", recruitList); + request.getRequestDispatcher("/main.jsp").forward(request, response); + } +} diff --git a/EJobDam/src/main/java/joinMember/JoinMemberServlet.java b/EJobDam/src/main/java/joinMember/JoinMemberServlet.java new file mode 100644 index 0000000..7b6a6ad --- /dev/null +++ b/EJobDam/src/main/java/joinMember/JoinMemberServlet.java @@ -0,0 +1,61 @@ +package joinMember; + +import java.io.*; +import java.sql.*; +import javax.servlet.*; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; + +@WebServlet("/JoinMemberServlet") +public class JoinMemberServlet extends HttpServlet { + static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; + static final String DB_URL = "jdbc:mysql://localhost:3306/DB2025Team07?serverTimezone=UTC"; + static final String USER = "root"; + static final String PASS = "root"; + + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html;charset=UTF-8"); + + // HTML form에서 받은 값 + String id = request.getParameter("user_id"); // DB에서는 id로 사용됨 + String pwd = request.getParameter("pwd"); + String nickname = request.getParameter("nickname"); + String email = request.getParameter("email"); + String phone = request.getParameter("phone"); + + try { + Class.forName(JDBC_DRIVER); + try ( + Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); + PreparedStatement pstmt = conn.prepareStatement( + "INSERT INTO DB2025_Users (id, pwd, nickname, email, phone) VALUES (?, ?, ?, ?, ?)") + ) { + pstmt.setString(1, id); + pstmt.setString(2, pwd); + pstmt.setString(3, nickname); + pstmt.setString(4, email); + pstmt.setString(5, phone); + + int result = pstmt.executeUpdate(); + PrintWriter out = response.getWriter(); + + if (result > 0) { + HttpSession session = request.getSession(); + session.setAttribute("user_id", id); + session.setAttribute("nickname", nickname); + response.sendRedirect("joinsuccess.jsp"); // <- 개인페이지 대신 success.jsp로 이동 + } else { + out.println("

회원가입 실패...

"); + } + } + } catch (SQLIntegrityConstraintViolationException dup) { + response.getWriter().println("❗ 중복된 학번/이메일/전화번호입니다."); + } catch (Exception e) { + e.printStackTrace(); + response.getWriter().println("DB 오류: " + e.getMessage()); + } + } +} diff --git a/EJobDam/src/main/java/login/LoginServlet.java b/EJobDam/src/main/java/login/LoginServlet.java new file mode 100644 index 0000000..32c6f65 --- /dev/null +++ b/EJobDam/src/main/java/login/LoginServlet.java @@ -0,0 +1,62 @@ +package login; + +import java.io.*; +import java.sql.*; +import javax.servlet.*; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.*; + +@WebServlet("/LoginServlet") +public class LoginServlet extends HttpServlet { + static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; + static final String DB_URL = "jdbc:mysql://localhost:3306/DB2025Team07?serverTimezone=UTC"; + static final String USER = "root"; + static final String PASS = "root"; + + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + request.setCharacterEncoding("UTF-8"); + response.setContentType("text/html;charset=UTF-8"); + + String userId = request.getParameter("user_id"); + String pwd = request.getParameter("pwd"); + + try { + // JDBC 드라이버 로드 (중요!) + Class.forName(JDBC_DRIVER); + + Connection conn = DriverManager.getConnection(DB_URL, USER, PASS); + PreparedStatement pstmt = conn.prepareStatement( + "SELECT * FROM DB2025_Users WHERE id = ? AND pwd = ?"); + + pstmt.setString(1, userId); + pstmt.setString(2, pwd); + + ResultSet rs = pstmt.executeQuery(); + + if (rs.next()) { + HttpSession session = request.getSession(); + session.setAttribute("user_id", userId); + session.setAttribute("nickname", rs.getString("nickname")); + + response.sendRedirect("mypage.jsp"); // 로그인 성공 → 마이페이지 + } else { + PrintWriter out = response.getWriter(); + out.println(""); + } + + // 자원 해제 + rs.close(); + pstmt.close(); + conn.close(); + + } catch (ClassNotFoundException e) { + e.printStackTrace(); + response.getWriter().println("JDBC 드라이버 로드 실패: " + e.getMessage()); + } catch (SQLException e) { + e.printStackTrace(); + response.getWriter().println("데이터베이스 오류: " + e.getMessage()); + } + } +} diff --git a/EJobDam/src/main/webapp/META-INF/MANIFEST.MF b/EJobDam/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 0000000..254272e --- /dev/null +++ b/EJobDam/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/EJobDam/src/main/webapp/WEB-INF/lib/mysql-connector-java-8.0.19.jar b/EJobDam/src/main/webapp/WEB-INF/lib/mysql-connector-java-8.0.19.jar new file mode 100644 index 0000000..7750517 Binary files /dev/null and b/EJobDam/src/main/webapp/WEB-INF/lib/mysql-connector-java-8.0.19.jar differ diff --git a/EJobDam/src/main/webapp/joinsuccess.jsp b/EJobDam/src/main/webapp/joinsuccess.jsp new file mode 100644 index 0000000..b170726 --- /dev/null +++ b/EJobDam/src/main/webapp/joinsuccess.jsp @@ -0,0 +1,14 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page session="true" %> + + + 회원가입 완료 + + + +

회원가입 성공!

+

잠시 후에 자동으로 개인 페이지로 이동합니다...

+

바로 이동

+ + diff --git a/EJobDam/src/main/webapp/login.html b/EJobDam/src/main/webapp/login.html new file mode 100644 index 0000000..5d05182 --- /dev/null +++ b/EJobDam/src/main/webapp/login.html @@ -0,0 +1,15 @@ + + + + + 로그인 + + +

로그인

+
+ 학번:
+ 비밀번호:
+ +
+ + diff --git a/EJobDam/src/main/webapp/main.jsp b/EJobDam/src/main/webapp/main.jsp new file mode 100644 index 0000000..26c93a2 --- /dev/null +++ b/EJobDam/src/main/webapp/main.jsp @@ -0,0 +1,83 @@ +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ page import="java.util.*" %> +<% + List> recruitList = (List>) request.getAttribute("recruitList"); + String error = (String) request.getAttribute("error"); +%> + + + + + + 메인 페이지 + + + + +

모집글 모아보기

+ + <% if (error != null) { %> +

오류 발생: <%= error %>

+ <% } %> + +
+ +
+ + + + + + + + + + + + + <% + if (recruitList != null) { + for (Map post : recruitList) { + %> + + + + + + + + + + + + <% + } + } else { + %> + + <% + } + %> +
작성자근무 장소시작 일시근무 기간시급/급여근무 내용상태지원하기
<%= post.get("nickname") %><%= post.get("place") %><%= post.get("date") %><%= post.get("period") %><%= post.get("salary") %>원<%= post.get("description") %><%= post.get("status") %> + <% + String status = (String) post.get("status"); + if ("모집중".equals(status)) { + %> +
+ "> + +
+ <% + } else { + %> + 지원 마감 + <% + } + %> +
불러온 모집글이 없습니다.
+ + diff --git a/EJobDam/src/main/webapp/my_recruits.jsp b/EJobDam/src/main/webapp/my_recruits.jsp new file mode 100644 index 0000000..0e795d8 --- /dev/null +++ b/EJobDam/src/main/webapp/my_recruits.jsp @@ -0,0 +1,60 @@ +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ page import="java.sql.*" %> +<%@ page session="true" %> + +<% + String userId = (String) session.getAttribute("user_id"); + if (userId == null) { + response.sendRedirect("signup.html"); + return; + } + + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/DB2025Team07?serverTimezone=UTC", "root", "root"); + + String sql = "SELECT * FROM DB2025_MyRecruits WHERE user_id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, userId); + rs = pstmt.executeQuery(); +%> + + +내 모집글 보기 + +

내가 작성한 모집글

+ + + + +<% + while (rs.next()) { +%> + + + + + + + + + +<% + } + } catch (Exception e) { + out.println("오류 발생: " + e.getMessage()); + } finally { + if (rs != null) rs.close(); + if (pstmt != null) pstmt.close(); + if (conn != null) conn.close(); + } +%> +
모집ID장소시작일근무기간시급상태작성일
<%= rs.getInt("id") %><%= rs.getString("work_place") %><%= rs.getTimestamp("start_day") %><%= rs.getString("work_period") %><%= rs.getInt("salary") %><%= rs.getString("recruitment_status") %><%= rs.getTimestamp("created_at") %>
+
+← 마이페이지로 돌아가기 + + diff --git a/EJobDam/src/main/webapp/my_supports.jsp b/EJobDam/src/main/webapp/my_supports.jsp new file mode 100644 index 0000000..5b50ead --- /dev/null +++ b/EJobDam/src/main/webapp/my_supports.jsp @@ -0,0 +1,60 @@ +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ page import="java.sql.*" %> +<%@ page session="true" %> + +<% + String userId = (String) session.getAttribute("user_id"); + if (userId == null) { + response.sendRedirect("signup.html"); + return; + } + + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/DB2025Team07?serverTimezone=UTC", "root", "root"); + + String sql = "SELECT * FROM DB2025_MySupportApplications WHERE user_id = ?"; + pstmt = conn.prepareStatement(sql); + pstmt.setString(1, userId); + rs = pstmt.executeQuery(); +%> + + +내 지원글 보기 + +

내가 작성한 지원글

+ + + + +<% + while (rs.next()) { +%> + + + + + + + + + +<% + } + } catch (Exception e) { + out.println("오류 발생: " + e.getMessage()); + } finally { + if (rs != null) rs.close(); + if (pstmt != null) pstmt.close(); + if (conn != null) conn.close(); + } +%> +
모집ID장소시작일시급상태내용지원일
<%= rs.getInt("RECRUIT_ID") %><%= rs.getString("work_place") %><%= rs.getTimestamp("start_day") %><%= rs.getInt("salary") %><%= rs.getString("RECRUITMENT_STATE") %><%= rs.getString("SUPPORT_TEXT") %><%= rs.getTimestamp("SUPPORT_CREATED_AT") %>
+
+← 마이페이지로 돌아가기 + + diff --git a/EJobDam/src/main/webapp/mypage.jsp b/EJobDam/src/main/webapp/mypage.jsp new file mode 100644 index 0000000..5f13061 --- /dev/null +++ b/EJobDam/src/main/webapp/mypage.jsp @@ -0,0 +1,76 @@ +<%@ page contentType="text/html; charset=UTF-8" %> +<%@ page import="java.sql.*, javax.naming.*, javax.sql.*" %> +<%@ page session="true" %> + +<% + String userId = (String) session.getAttribute("user_id"); + String nickname = (String) session.getAttribute("nickname"); + + if (userId == null) { + response.sendRedirect("signup.html"); // 세션 없으면 다시 회원가입으로 + return; + } + + // DB 연결 정보 + String jdbcUrl = "jdbc:mysql://localhost:3306/DB2025Team07?serverTimezone=UTC"; + String dbUser = "root"; + String dbPass = "root"; + + Connection conn = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + + String email = ""; + String phone = ""; + double rating = 0.0; + + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + + pstmt = conn.prepareStatement("SELECT * FROM DB2025_Users WHERE id = ?"); + pstmt.setString(1, userId); + rs = pstmt.executeQuery(); + + if (rs.next()) { + email = rs.getString("email"); + phone = rs.getString("phone"); + rating = rs.getDouble("rating"); + } + } catch (Exception e) { + out.println("오류 발생: " + e.getMessage()); + } finally { + if (rs != null) rs.close(); + if (pstmt != null) pstmt.close(); + if (conn != null) conn.close(); + } +%> + + + + <%= nickname %>님의 마이페이지 + + + + +

<%= nickname %>님의 마이페이지

+
    +
  • 학번: <%= userId %>
  • +
  • 이메일: <%= email %>
  • +
  • 전화번호: <%= phone %>
  • +
  • 평점: <%= rating %>
  • +
+ +
+ +
+ +
+ +
+ + diff --git a/EJobDam/src/main/webapp/post_recruits.jsp b/EJobDam/src/main/webapp/post_recruits.jsp new file mode 100644 index 0000000..3cd31e9 --- /dev/null +++ b/EJobDam/src/main/webapp/post_recruits.jsp @@ -0,0 +1,45 @@ +<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> + + + + + 모집글 작성 + + + + +

📝 모집글 작성

+ +
+

+ +

+ +

+ +

+ +

+ +

+ + +
+ + diff --git a/EJobDam/src/main/webapp/signup.html b/EJobDam/src/main/webapp/signup.html new file mode 100644 index 0000000..07ce6b4 --- /dev/null +++ b/EJobDam/src/main/webapp/signup.html @@ -0,0 +1,18 @@ + + + + + 회원가입 + + +

회원가입

+
+ 학번:
+ 비밀번호:
+ 닉네임:
+ 이메일:
+ 전화번호:
+ +
+ +