# Java Swing 도서 관리 시스템 완전 정복: 사용자 관리 모듈 만들기 가이드

*SEO 키워드: Java Swing, 도서 관리 시스템, 사용자 관리 모듈*

---

# # 📌 서론 – 왜 “사용자 관리 모듈”이 필요할까?

도서 관리 시스템(Library Management System)은 도서 대출·반납, 재고 관리 등 다양한 기능을 제공하지만, **누가** 시스템에 접근하고 **무엇을** 할 수 있는지를 제어하지 않으면 보안과 데이터 무결성이 위협받습니다.

특히 초보 개발자라면 **사용자 인증·권한 부여** 로직을 구현하는 것이 처음엔 막막할 수 있습니다. 이번 포스트에서는 **Java Swing** 기반 GUI와 간단한 파일 기반 저장소를 활용해, 초보자도 따라 할 수 있는 **사용자 관리 모듈**을 단계별로 구현하는 방법을 알려드립니다.

---

# # 🛠️ 본론

## # 1️⃣ 프로젝트 구조와 기본 설정

| 폴더 | 설명 |

|------|------|

| `src/` | Java 소스 코드 |

| `src/model/` | 데이터 모델 (User, Role) |

| `src/view/` | Swing UI (LoginFrame, UserPanel) |

| `src/controller/` | 이벤트 처리 로직 |

| `data/` | 사용자 정보를 저장할 `users.txt` 파일 |

> **Tip**: IDE는 IntelliJ IDEA 혹은 Eclipse를 사용하고, JDK 17 이상을 설치하세요.

```
java

// src/model/User.java

public class User implements Serializable {

    private String username;

    private String password; // 간단히 평문 저장 (실제 서비스에서는 해시 사용)

    private String role;     // ADMIN, USER

    // getter / setter 생략

}

```

## # 2️⃣ 사용자 데이터 저장·로드 로직

파일 기반 저장소는 `ObjectOutputStream` / `ObjectInputStream` 로 직렬화합니다.

```
java

// src/controller/UserDAO.java

public class UserDAO {

    private static final String FILE = 'data/users.txt';

    public static List<User> loadUsers() {

        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE))) {

            return (List<User>) ois.readObject();

        } catch (Exception e) {

            return new ArrayList<>(); // 파일이 없으면 빈 리스트 반환

        }

    }

    public static void saveUsers(List<User> users) {

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE))) {

            oos.writeObject(users);

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

```

> **핵심 포인트**

> * 파일이 없을 경우 자동 생성 → 첫 실행 시 관리자 계정을 직접 추가합니다.

> * `Serializable` 인터페이스를 구현해 객체를 파일에 바로 저장할 수 있습니다.

## # 3️⃣ 로그인 화면 구현 (Swing UI)

```
java

// src/view/LoginFrame.java

public class LoginFrame extends JFrame {

    private JTextField tfId = new JTextField(15);

    private JPasswordField pfPwd = new JPasswordField(15);

    private JButton btnLogin = new JButton('로그인');

    public LoginFrame() {

        setTitle('도서 관리 시스템 - 로그인');

        setLayout(new GridBagLayout());

        GridBagConstraints c = new GridBagConstraints();

        c.insets = new Insets(5,5,5,5);

        c.gridx = 0; c.gridy = 0; add(new JLabel('아이디'), c);

        c.gridx = 1; add(tfId, c);

        c.gridx = 0; c.gridy = 1; add(new JLabel('비밀번호'), c);

        c.gridx = 1; add(pfPwd, c);

        c.gridx = 1; c.gridy = 2; add(btnLogin, c);

        btnLogin.addActionListener(e -> authenticate());

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        pack();

        setLocationRelativeTo(null);

        setVisible(true);

    }

    private void authenticate() {

        String id = tfId.getText();

        String pwd = new String(pfPwd.getPassword());

        List<User> users = UserDAO.loadUsers();

        for (User u : users) {

            if (u.getUsername().equals(id) && u.getPassword().equals(pwd)) {

                JOptionPane.showMessageDialog(this, '환영합니다, ' + u.getUsername() + '님!');

                new MainFrame(u); // 로그인 성공 시 메인 화면 호출

                dispose();

                return;

            }

        }

        JOptionPane.showMessageDialog(this, '아이디 또는 비밀번호가 틀렸습니다.');

    }

}

```

> **초보자 팁**

> * `GridBagLayout` 은 복잡해 보이지만, `c.insets` 로 간격을 조절하면 깔끔한 배치를 쉽게 만들 수 있습니다.

> * `new String(pfPwd.getPassword())` 로 `char[]` 를 문자열로 변환해 비교합니다. (실제 서비스에서는 보안 강화 필요)

## # 4️⃣ 관리자용 사용자 관리 패널

관리자는 **새 사용자 추가**, **비밀번호 변경**, **삭제** 기능을 사용할 수 있어야 합니다.

```
java

// src/view/UserPanel.java

public class UserPanel extends JPanel {

    private JTable tblUsers;

    private DefaultTableModel model;

    private JButton btnAdd = new JButton('추가');

    private JButton btnEdit = new JButton('수정');

    private JButton btnDelete = new JButton('삭제');

    public UserPanel() {

        setLayout(new BorderLayout());

        model = new DefaultTableModel(new String[]{'아이디', '역할'}, 0);

        tblUsers = new JTable(model);

        add(new JScrollPane(tblUsers), BorderLayout.CENTER);

        JPanel pBtn = new JPanel();

        pBtn.add(btnAdd); pBtn.add(btnEdit); pBtn.add(btnDelete);

        add(pBtn, BorderLayout.SOUTH);

        loadTable();

        btnAdd.addActionListener(e -> addUser());

        btnEdit.addActionListener(e -> editUser());

        btnDelete.addActionListener(e -> deleteUser());

    }

    private void loadTable() {

        model.setRowCount(0);

        for (User u : UserDAO.loadUsers()) {

            model.addRow(new Object[]{u.getUsername(), u.getRole()});

        }

    }

    private void addUser() {

        UserForm f = new UserForm(null);

        f.setVisible(true);

        if (f.isSaved()) {

            loadTable();

        }

    }

    // editUser, deleteUser 구현은 유사하게 진행

}

```

`UserForm` 은 **모달 다이얼로그** 형태로, 아이디·비밀번호·역할을 입력받아 `UserDAO.saveUsers` 로 저장합니다.

## # 5️⃣ 전체 흐름 연결 – 메인 프레임

```
java

// src/view/MainFrame.java

public class MainFrame extends JFrame {

    public MainFrame(User loggedIn) {

        setTitle('도서 관리 시스템 - 메인');

        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setSize(800,600);

        setLocationRelativeTo(null);

        if ('ADMIN'.equals(loggedIn.getRole())) {

            add(new UserPanel()); // 관리자라면 사용자 관리 화면 보여줌

        } else {

            add(new JLabel('일반 사용자는 여기서 도서 검색·대출 기능을 구현합니다.'));

        }

        setVisible(true);

    }

}

```

---

# # ✅ 결론 – 지금 바로 구현해 보세요!

- **Java Swing** 윈도우 기반 UI와 **파일 직렬화** 로 간단하지만 실전 감각을 잡을 수 있는 사용자 관리 모듈을 완성했습니다.

- 구현된 코드를 바탕으로 **데이터베이스 연동**, **비밀번호 해시**, **역할 기반 UI 차별화** 등으로 확장해 보세요.

> **행동 유도**

> 1. 위 코드를 복사해 `src/` 디렉터리에 붙여넣고 실행해 보세요.

> 2. 첫 실행 시 `users.txt` 가 자동 생성됩니다. 관리자 계정(`admin / admin`)을 직접 추가해 로그인해 보세요.

> 3. GitHub에 프로젝트를 올리고, **README**에 “Java Swing 도서 관리 시스템 – 사용자 관리 모듈” 키워드를 삽입하면 SEO 효과도 챙길 수 있습니다.

**당신의 첫 Swing 프로젝트, 지금 바로 시작해 보세요!** 🚀
