Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 83 additions & 9 deletions DB2025Team07.sql
Original file line number Diff line number Diff line change
Expand Up @@ -54,27 +54,49 @@ INSERT INTO DB2025_Recruitment (user_id, work_place, start_day, work_period, sal

SELECT * FROM DB2025_Recruitment;

# 지원 상태 테이블 (지원 상태의 id, 지원 상태) 생성
# 상태 id는 자동 설정
CREATE TABLE DB2025_SupportStatus (
id INT AUTO_INCREMENT PRIMARY KEY ,
status_name VARCHAR(20) UNIQUE NOT NULL
);

INSERT INTO DB2025_SupportStatus (status_name) VALUES
('대기'),
('채택됨'),
('탈락');

SELECT * FROM DB2025_SupportStatus;

# 지원 테이블 생성
CREATE TABLE DB2025_SUPPORT (
RECRUIT_ID INT NOT NULL,
USER_ID VARCHAR(20) NOT NULL,
RECRUITMENT_STATE ENUM('채택됨', '채택 안됨') DEFAULT '채택 안됨',
RECRUITMENT_STATE INT NOT NULL DEFAULT 1,
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
FOREIGN KEY (USER_ID) REFERENCES DB2025_USERS(id) ON DELETE CASCADE,
FOREIGN KEY (RECRUITMENT_STATE) REFERENCES DB2025_SupportStatus(id) ON DELETE CASCADE
);

DESCRIBE DB2025_SUPPORT;

INSERT INTO DB2025_SUPPORT (
RECRUIT_ID, USER_ID, SUPPORT_TEXT, SUPPORT_CREATED_AT
) VALUES
(1, '1955034', '바로 도와드릴 수 있어요!', NOW()),
(2, '2276123', '오늘 오후에 가능해요!', NOW()),
(3, '1955034', '제가 해본 적 있어요. 잘할 수 있습니다.', NOW()),
(4, '2003076', '시간 맞춰 드릴 수 있어요!', NOW()),
(5, '2276123', '경험 많아요. 믿고 맡겨주세요!', NOW());

INSERT INTO DB2025_SUPPORT (
RECRUIT_ID, USER_ID, RECRUITMENT_STATE, SUPPORT_TEXT, SUPPORT_CREATED_AT
) VALUES
(1, '1955034', '채택됨', '바로 도와드릴 수 있어요!', NOW()),
(2, '2276123', '채택 안됨', '오늘 오후에 가능해요!', NOW()),
(3, '1955034', '채택 안됨', '제가 해본 적 있어요. 잘할 수 있습니다.', NOW()),
(4, '2003076', '채택 안됨', '시간 맞춰 드릴 수 있어요!', NOW()),
(5, '2276123', '채택됨', '경험 많아요. 믿고 맡겨주세요!', NOW());
(6, '1955034', 1, '바로 도와드릴 수 있어요!', NOW()),
(6, '2276123', 1, '오늘 오후에 가능해요!', NOW());

SELECT * FROM DB2025_SUPPORT;

Expand All @@ -96,12 +118,64 @@ SELECT
R.work_place,
R.start_day,
R.salary,
S.RECRUITMENT_STATE,
ASL.status_name, # 정수값인 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 DB2025_USERS U ON S.USER_ID = U.id
LEFT JOIN DB2025_SupportStatus ASL ON S.RECRUITMENT_STATE = ASL.id; # 정수값인 RECRUITMENT_STATE를 지원상태 테이블과 조인하여 문자형태로 나타냄
# LEFT JOIN 사용하여 지원글 기준으로 전체 기록 보존

SELECT * FROM DB2025_MySupportApplications WHERE USER_ID = '2276123';

# 특정 모집글의 지원글 모아보기 뷰 생성
CREATE VIEW DB2025_SupportDetailView AS
SELECT
S.RECRUIT_ID,
U.id AS USER_ID,
U.nickname,
U.email,
U.phone,
U.rating,
SS.status_name AS RECRUITMENT_STATE,
S.SUPPORT_TEXT,
S.SUPPORT_CREATED_AT
FROM DB2025_SUPPORT S
JOIN DB2025_Users U
ON S.USER_ID = U.id
JOIN DB2025_SupportStatus SS
ON S.RECRUITMENT_STATE = SS.id;

SELECT * FROM DB2025_SupportDetailView WHERE RECRUIT_ID = 6;


# DROP VIEW DB2025_SupportDetailView;

# 평가 테이블 (평가글 아이디, 평가자 학번, 평가대상 학번, 점수, 평가 내용, 생성시각) 생성
CREATE TABLE DB2025_Evaluation (
recruitment_id INT NOT NULL,
evaluator_id VARCHAR(7) NOT NULL,
target_id VARCHAR(7) NOT NULL,
score INT CHECK (score BETWEEN 1 AND 5) NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, #추가하는 게 맞을 것 같아서 넣었습니다
PRIMARY KEY (recruitment_id, evaluator_id),
FOREIGN KEY (recruitment_id) REFERENCES DB2025_Recruitment(id) ON DELETE CASCADE,
FOREIGN KEY (evaluator_id) REFERENCES DB2025_Recruitment(user_id) ON DELETE CASCADE,
FOREIGN KEY (target_id) REFERENCES DB2025_Recruitment(user_id) ON DELETE CASCADE
);

Describe DB2025_Evaluation;

INSERT INTO DB2025_Evaluation (recruitment_id, evaluator_id, target_id, score, description) VALUES
(1, 2276123, 2103123, 5, '정확한 시간 개념과 탁월한 업무 태도를 보여줬습니다.'),
(2, 2103123, 1955034, 4, '전반적으로 만족스러웠지만 약간의 세부 개선이 필요합니다.'),
(3, 1955034, 2003076, 3, '일은 어느 정도 했지만 결과물의 퀄리티가 부족했습니다.'),
(4, 2003076, 2271055, 5, '적극적이고 책임감 있는 태도가 매우 인상 깊었습니다.'),
(5, 2276123, 1955034, 3, '업무 처리 속도가 약간 느리고 소극적이었습니다.');

INSERT INTO DB2025_Recruitment (user_id, work_place, start_day, work_period, salary, recruitment_status, created_at) VALUES
('2344009', '이화여대 학관', '2025-06-01 09:00:00', '1시간', 5000, '모집중', NOW());

SELECT * FROM DB2025_Evaluation;
11 changes: 11 additions & 0 deletions DB2025Team07/.project
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,15 @@
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.jsdt.core.jsNature</nature>
</natures>
<filteredResources>
<filter>
<id>1748260249488</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package DB2025Team07;

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/AcceptSupportServlet") // URL 매핑
public class DB2025Team07_AcceptSupportServlet 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 = "DB2025Team07";
static final String PASS = "DB2025Team07";

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter(); // 알림창 및 오류 메시지용

String recruitIdParam = request.getParameter("recruit_id"); // 모집글의 ID
String targetId = request.getParameter("user_id"); // 채택할 사용자의 ID

// 파라미터 null값 체크
if (recruitIdParam == null || targetId == null ||
recruitIdParam.trim().isEmpty() || targetId.trim().isEmpty()) {
out.println("<script>alert('필수 파라미터(recruit_id 또는 user_id)가 누락되었습니다.'); history.back();</script>");
out.flush();
return;
}

int recruitId;
try {
recruitId = Integer.parseInt(recruitIdParam);
} catch (NumberFormatException e) {
out.println("<script>alert('잘못된 recruit_id 형식입니다.'); history.back();</script>");
out.flush();
return;
}

Connection conn = null;
PreparedStatement pstmtUpdateAccepted = null;
PreparedStatement pstmtUpdateRejected = null;
PreparedStatement pstmtUpdateRecruitStatus = null;

try {
Class.forName(JDBC_DRIVER);
conn = DriverManager.getConnection(DB_URL, USER, PASS);
conn.setAutoCommit(false); // 트랜잭션 시작

// 1. 선택된 지원자 → 채택 상태(2)
// RECRUITMENT_STATE 컬럼의 의미: 1=대기, 2=채택, 3=탈락
String sqlAccept = "UPDATE DB2025_SUPPORT SET RECRUITMENT_STATE = 2 WHERE RECRUIT_ID = ? AND USER_ID = ?";
pstmtUpdateAccepted = conn.prepareStatement(sqlAccept);
pstmtUpdateAccepted.setInt(1, recruitId);
pstmtUpdateAccepted.setString(2, targetId);
pstmtUpdateAccepted.executeUpdate();

// 2. 나머지 지원자들 → 탈락 상태(3)
String sqlReject = "UPDATE DB2025_SUPPORT SET RECRUITMENT_STATE = 3 WHERE RECRUIT_ID = ? AND USER_ID != ?";
pstmtUpdateRejected = conn.prepareStatement(sqlReject);
pstmtUpdateRejected.setInt(1, recruitId);
pstmtUpdateRejected.setString(2, targetId);
pstmtUpdateRejected.executeUpdate();

// 3. 모집글의 모집 상태를 '모집중' -> '모집마감'으로 변경
String sqlRecruitStatus = "UPDATE DB2025_RECRUITMENT SET recruitment_status = '모집마감' WHERE id = ?";
pstmtUpdateRecruitStatus = conn.prepareStatement(sqlRecruitStatus);
pstmtUpdateRecruitStatus.setInt(1, recruitId);
pstmtUpdateRecruitStatus.executeUpdate();

conn.commit(); // 모든 작업 성공 시 트랜잭션 커밋

// 리디렉션하여 SupportListServlet이 새로고침된 데이터를 가져오도록 함
response.sendRedirect("SupportsServlet?recruit_id=" + recruitId);


} catch (ClassNotFoundException e) {
out.println("[AcceptSupportServlet] JDBC 드라이버 로딩 실패: " + e.getMessage());
e.printStackTrace();
out.flush();
} catch (SQLException e) {
out.println("[AcceptSupportServlet] 데이터베이스 오류: " + e.getMessage());
e.printStackTrace();
if (conn != null) {
try {
conn.rollback(); // 오류 발생 시 트랜잭션 롤백
out.println("[AcceptSupportServlet] Transaction rolled back.");
} catch (SQLException ex) {
out.println("[AcceptSupportServlet] Rollback failed: " + ex.getMessage());
ex.printStackTrace();
}
}
out.println("오류 발생: " + e.getMessage());
out.flush();
} finally {
try { if (pstmtUpdateAccepted != null) pstmtUpdateAccepted.close(); } catch (SQLException e) { e.printStackTrace(); }
try { if (pstmtUpdateRejected != null) pstmtUpdateRejected.close(); } catch (SQLException e) { e.printStackTrace(); }
try { if (pstmtUpdateRecruitStatus != null) pstmtUpdateRecruitStatus.close(); } catch (SQLException e) { e.printStackTrace(); }
if (conn != null) {
try {
conn.setAutoCommit(true); // 원래 상태로 복구
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
Loading