Skip to content
Merged
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
68 changes: 68 additions & 0 deletions src/main/java/com/example/model/Resume.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package main.java.com.example.model;// Resume.java
import main.java.com.example.model.WorkExperience;

import java.util.ArrayList;
import java.util.Date;
import java.text.SimpleDateFormat;

public class Resume {
String employeeId;
public String title;
public String address;
public String phoneNumber;
public String instagram;
Date updatedAt;
public ArrayList<WorkExperience> workExperience;

public Resume(String employeeId, String title, String address, String phoneNumber, String instagram) {
this.employeeId = employeeId;
this.title = title;
this.address = address;
this.phoneNumber = phoneNumber;
this.instagram = instagram;
this.updatedAt = new Date();
this.workExperience = new ArrayList<>();
}

@Override
public String toString() {
return title + " - " + phoneNumber + " - " + instagram;
}

public String toDetailString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
StringBuilder details = new StringBuilder();
details.append("Employee ID: ").append(employeeId).append("\n");
details.append("Title: ").append(title).append("\n");
details.append("Updated At: ").append(sdf.format(updatedAt)).append("\n");
details.append("Address: ").append(address).append("\n");
details.append("Phone Number: ").append(phoneNumber).append("\n");
details.append("Instagram: ").append(instagram).append("\n\n");

details.append("Work Experience:\n");
for (WorkExperience exp : workExperience) {
details.append("- ").append(exp.workplaceName).append(" (")
.append(sdf.format(exp.startDate)).append(" ~ ")
.append(sdf.format(exp.endDate)).append(")\n");
details.append(" Content: ").append(exp.workContent).append("\n\n");
}
return details.toString();
}

// ResumeService (내부 클래스)
public static class ResumeService {
private ArrayList<Resume> resumes = new ArrayList<>();

public void addResume(Resume resume) {
resumes.add(resume);
}

public void deleteResume(int index) {
resumes.remove(index);
}

public ArrayList<Resume> getResumes() {
return resumes;
}
}
}
19 changes: 19 additions & 0 deletions src/main/java/com/example/model/WorkExperience.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package main.java.com.example.model;

import java.util.Date;

public class WorkExperience {
int workExperienceId;
public String workplaceName;
public Date startDate;
public Date endDate;
public String workContent;

public WorkExperience(int workExperienceId, String workplaceName, Date startDate, Date endDate, String workContent) {
this.workExperienceId = workExperienceId;
this.workplaceName = workplaceName;
this.startDate = startDate;
this.endDate = endDate;
this.workContent = workContent;
}
}
129 changes: 129 additions & 0 deletions src/main/java/com/example/ui/ResumeApp.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
package main.java.com.example.ui;

import main.java.com.example.model.Resume;
import main.java.com.example.model.WorkExperience;
import javax.swing.*;
import java.awt.*;
import java.util.Date;
import java.text.SimpleDateFormat;

public class ResumeApp extends JFrame {
private Resume.ResumeService resumeService = new Resume.ResumeService();
private DefaultListModel<String> listModel = new DefaultListModel<>();
private JList<String> resumeList = new JList<>(listModel);

public ResumeApp() {
setTitle("이력서 리스트");
setSize(600, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());

JButton addButton = new JButton("추가");
JButton editButton = new JButton("수정");
JButton detailButton = new JButton("상세보기");
JButton deleteButton = new JButton("삭제");
JPanel buttonPanel = new JPanel();
buttonPanel.add(addButton);
buttonPanel.add(editButton);
buttonPanel.add(detailButton);
buttonPanel.add(deleteButton);

add(new JScrollPane(resumeList), BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);

addButton.addActionListener(e -> showFormDialog(new Resume("", "", "", "", ""), false));
editButton.addActionListener(e -> {
int selectedIndex = resumeList.getSelectedIndex();
if (selectedIndex != -1) {
Resume resume = resumeService.getResumes().get(selectedIndex);
showFormDialog(resume, true);
} else {
JOptionPane.showMessageDialog(this, "수정할 이력서를 선택하세요.", "오류", JOptionPane.ERROR_MESSAGE);
}
});

detailButton.addActionListener(e -> {
int selectedIndex = resumeList.getSelectedIndex();
if (selectedIndex != -1) {
Resume resume = resumeService.getResumes().get(selectedIndex);
JOptionPane.showMessageDialog(this, resume.toDetailString(), "이력서 상세보기", JOptionPane.INFORMATION_MESSAGE);
}
});

deleteButton.addActionListener(e -> {
int selectedIndex = resumeList.getSelectedIndex();
if (selectedIndex != -1) {
resumeService.getResumes().remove(selectedIndex);
listModel.remove(selectedIndex);
JOptionPane.showMessageDialog(this, "이력서가 성공적으로 삭제되었습니다.");
}
});
}

private void showFormDialog(Resume resume, boolean isEdit) {
JDialog dialog = new JDialog(this, isEdit ? "이력서 수정" : "이력서 추가", true);
dialog.setSize(400, 600);
dialog.setLayout(new GridLayout(12, 2));

JTextField titleField = new JTextField(resume.title);
JTextField addressField = new JTextField(resume.address);
JTextField phoneField = new JTextField(resume.phoneNumber);
JTextField instagramField = new JTextField(resume.instagram);
JTextField workPlaceField = new JTextField();
JTextField workContentField = new JTextField();
JTextField startDateField = new JTextField("yyyy-MM-dd");
JTextField endDateField = new JTextField("yyyy-MM-dd");

dialog.add(new JLabel("제목:"));
dialog.add(titleField);
dialog.add(new JLabel("주소:"));
dialog.add(addressField);
dialog.add(new JLabel("전화번호:"));
dialog.add(phoneField);
dialog.add(new JLabel("인스타그램:"));
dialog.add(instagramField);

dialog.add(new JLabel("직장명:"));
dialog.add(workPlaceField);
dialog.add(new JLabel("업무 내용:"));
dialog.add(workContentField);
dialog.add(new JLabel("시작 날짜:"));
dialog.add(startDateField);
dialog.add(new JLabel("종료 날짜:"));
dialog.add(endDateField);

JButton saveButton = new JButton("저장");
dialog.add(saveButton);

saveButton.addActionListener(e -> {
resume.title = titleField.getText();
resume.address = addressField.getText();
resume.phoneNumber = phoneField.getText();
resume.instagram = instagramField.getText();

try {
Date startDate = new SimpleDateFormat("yyyy-MM-dd").parse(startDateField.getText());
Date endDate = new SimpleDateFormat("yyyy-MM-dd").parse(endDateField.getText());
int newId = resume.workExperience.size() + 1; // 자동 증가 ID
resume.workExperience.add(new WorkExperience(newId, workPlaceField.getText(), startDate, endDate, workContentField.getText()));
} catch (Exception ex) {
JOptionPane.showMessageDialog(dialog, "유효하지 않은 날짜 형식입니다.", "오류", JOptionPane.ERROR_MESSAGE);
return;
}

if (!isEdit) {
resumeService.addResume(resume);
listModel.addElement(resume.toString());
} else {
listModel.setElementAt(resume.toString(), resumeList.getSelectedIndex());
}
dialog.dispose();
});

dialog.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> new ResumeApp().setVisible(true));
}
}