728x90
목차
1. WindowBuilder
■ WindowBuilder란?
- Swing, SWT와 같은 자바 라이브러리를 기반으로 코드를 직접 작성하지 않고도 GUI를 시각적으로 간단하게 만들 수 있는 도구
- WindowBuilder를 통해 디자인 구현 가능
■ WindowBuilder 설치
- Help에서 Eclipse Marketplace 클릭
- Windows 검색 후 WindowBuilder Current 설치
- Confirm 후 동의하여 종료
2. 예시
■ User
package usermanagement.entity;
import lombok.Builder;
import lombok.Data;
@Builder
@Data
public class User {
private String username;
private String password;
private String name;
private String email;
}
■ UserRepository
package usermanagement.repository;
import java.util.ArrayList;
import java.util.List;
import org.mindrot.jbcrypt.BCrypt;
import usermanagement.entity.User;
public class UserRepository {
private List<User> userDataList;
private static UserRepository instance;
public static UserRepository getInstance() {
if (instance == null) {
instance = new UserRepository();
}
return instance;
}
public UserRepository() {
userDataList = new ArrayList<>();
userDataList.add(User.builder()
.username("aaa")
.password(BCrypt.hashpw("1234", BCrypt.gensalt())).name("김준일")
.email("aaa@gmial")
.build());
}
public void saveUser(User user) {
userDataList.add(user);
}
public User findUserByUsername(String username) {
User user = null;
for (User u : userDataList) {
if (u.getUsername().equals(username)) {
user = u;
break;
}
}
return user;
}
public User findUserByEmail(String email) {
User user = null;
for (User u : userDataList) {
if (u.getEmail().equals(email)) {
user = u;
break;
}
}
return user;
}
}
■ UserService
package usermanagement.service;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.mindrot.jbcrypt.BCrypt;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import usermanagement.entity.User;
import usermanagement.repository.UserRepository;
public class UserService {
private UserRepository userRepository;
private Gson gson;
private static UserService instance;
public static UserService getInstance() {
if (instance == null) {
instance = new UserService();
}
return instance;
}
private UserService() {
userRepository = UserRepository.getInstance();
gson = new GsonBuilder().setPrettyPrinting().create();
}
public Map<String, String> register(String userJson) {
// reponse : 응답
Map<String, String> response = new HashMap<>();
// 반복 작업을 하기 위해서 Map형태로 변환
Map<String, String> userMap = gson.fromJson(userJson, Map.class);
for (Entry<String, String> userEntry : userMap.entrySet()) {
// isBlank는 스페이스를 공백으로 봄
if (userEntry.getValue().isBlank()) {
response.put("error", userEntry.getKey() + "은(는) 공백일 수 없습니다.");
return response;
}
}
User user = gson.fromJson(userJson, User.class);
System.out.println("서비스에 넘어옴! User 객체로 변환");
System.out.println(user);
if (duplicatedUsername(user.getUsername())) {
response.put("error", "이미 사용중인 사용자 이름입니다.");
return response;
}
if (duplicatedEmail(user.getEmail())) {
response.put("error", "이미 사용중인 이메일입니다.");
return response;
}
// password를 암호화한 것을 pw에 대입
// String pw = BCrypt.hashpw("1234", BCrypt.gensalt());
// System.out.println(pw);
// System.out.println(BCrypt.checkpw("1234", pw));
user.setPassword(BCrypt.hashpw(user.getPassword(), BCrypt.gensalt()));
System.out.println("암호화 후");
System.out.println(user);
userRepository.saveUser(user);
response.put("ok", "회원가입 성공.");
return response;
}
private boolean duplicatedUsername(String username) {
return userRepository.findUserByUsername(username) != null;
}
private boolean duplicatedEmail(String email) {
return userRepository.findUserByEmail(email) != null;
}
public Map<String, String> authorize(String loginUserJson) {
Map<String, String> loginUser = gson.fromJson(loginUserJson, Map.class);
Map<String, String> response = new HashMap<>();
for (Entry<String, String> entry : loginUser.entrySet()) {
if (entry.getValue().isBlank()) {
response.put("error", entry.getKey() + "은(는) 공백일 수 없습니다.");
return response;
}
}
String usernameAndEmail = loginUser.get("usernameAndEmail");
User user = userRepository.findUserByUsername(usernameAndEmail);
if (user == null) {
user = userRepository.findUserByEmail(usernameAndEmail);
if (user == null) {
response.put("error", "사용자 정보를 확인해주세요");
}
}
if (!BCrypt.checkpw(loginUser.get("password"), user.getPassword())) {
response.put("error", "사용자 정보를 확인해주세요");
}
response.put("ok", user.getName() + "님 환영합니다.");
return response;
}
}
■ UserManagementFrame
package usermanagement.frame;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import com.google.gson.JsonObject;
import usermanagement.service.UserService;
public class UserManagementFrame extends JFrame {
private List<JTextField> loginFields;
private List<JTextField> registerFields;
private CardLayout mainCard;
private JPanel mainPanel;
private JTextField usernameField;
private JPasswordField passwordField;
private JTextField registerUsernameField;
private JPasswordField registerPasswordField;
private JTextField registerNameField;
private JTextField registerEmailField;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UserManagementFrame frame = new UserManagementFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public UserManagementFrame() {
loginFields = new ArrayList<>();
registerFields = new ArrayList<>();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 400, 500);
mainPanel = new JPanel();
mainPanel.setLocation(0, 0);
mainPanel.setBackground(new Color(255, 255, 255));
mainPanel.setBorder(null);
setContentPane(mainPanel);
mainCard = new CardLayout();
mainPanel.setLayout(mainCard);
JPanel loginPanel = new JPanel();
loginPanel.setBackground(new Color(255, 255, 255));
mainPanel.add(loginPanel, "loginPanel");
loginPanel.setLayout(null);
JLabel LogoText = new JLabel("UserManagement");
LogoText.setFont(new Font("Arial", Font.BOLD, 20));
LogoText.setHorizontalAlignment(SwingConstants.CENTER);
LogoText.setBounds(75, 50, 250, 50);
loginPanel.add(LogoText);
JLabel LoginText = new JLabel("Login");
LoginText.setFont(new Font("Arial", Font.PLAIN, 30));
LoginText.setHorizontalAlignment(SwingConstants.CENTER);
LoginText.setBounds(115, 100, 170, 50);
loginPanel.add(LoginText);
usernameField = new JTextField();
usernameField.setFont(new Font("Arial", Font.PLAIN, 12));
usernameField.setBounds(75, 220, 250, 30);
loginPanel.add(usernameField);
usernameField.setColumns(10);
passwordField = new JPasswordField();
passwordField.setFont(new Font("Arial", Font.PLAIN, 12));
passwordField.setBounds(75, 280, 250, 30);
loginPanel.add(passwordField);
JLabel usernameLable = new JLabel("Username or email");
usernameLable.setFont(new Font("Arial", Font.PLAIN, 12));
usernameLable.setBounds(75, 200, 120, 15);
loginPanel.add(usernameLable);
JLabel passwordLable = new JLabel("Password");
passwordLable.setFont(new Font("Arial", Font.PLAIN, 12));
passwordLable.setBounds(75, 260, 60, 15);
loginPanel.add(passwordLable);
JButton loginButton = new JButton("Login");
loginButton.addMouseListener(new MouseAdapter() {
// 인터페이스는 모두 구현해야함
// MouseAdapter내에 인터페이스를 모두 구현해놓음
// 사용하고 싶은 메소드만 오버라이드하여 사용가능
@Override
public void mouseClicked(MouseEvent e) {
JsonObject loginUser = new JsonObject();
loginUser.addProperty("usernameAndEmail", usernameField.getText());
loginUser.addProperty("password", passwordField.getText());
UserService userService = UserService.getInstance();
Map<String, String> response = userService.authorize(loginUser.toString());
if (response.containsKey("error")) {
JOptionPane.showMessageDialog(null, response.get("error"), "error", JOptionPane.ERROR_MESSAGE);
return;
}
JOptionPane.showMessageDialog(null, response.get("ok"), "ok", JOptionPane.INFORMATION_MESSAGE);
}
});
loginButton.setBackground(new Color(192, 192, 192));
loginButton.setFont(new Font("Arial", Font.PLAIN, 18));
loginButton.setBounds(75, 320, 250, 30);
loginPanel.add(loginButton);
JLabel signupDescription = new JLabel("Don't have an account?");
signupDescription.setFont(new Font("Arial", Font.PLAIN, 12));
signupDescription.setBounds(75, 360, 130, 15);
loginPanel.add(signupDescription);
JLabel signupLink = new JLabel("Sign up");
signupLink.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// mainPanel에서 registerPanel 키 값을 가진 화면을 보여줌
mainCard.show(mainPanel, "registerPanel");
// loginFields를 공백으로 만듬
clearFields(loginFields);
}
});
signupLink.setForeground(new Color(0, 128, 255));
signupLink.setFont(new Font("Arial", Font.PLAIN, 12));
signupLink.setBounds(210, 360, 50, 15);
loginPanel.add(signupLink);
JLabel forgotPasswordLink = new JLabel("Forgot your password?");
forgotPasswordLink.setFont(new Font("Arial", Font.PLAIN, 12));
forgotPasswordLink.setForeground(new Color(0, 128, 255));
forgotPasswordLink.setBounds(75, 380, 130, 15);
loginPanel.add(forgotPasswordLink);
JPanel registerPanel = new JPanel();
registerPanel.setBackground(new Color(255, 255, 255));
mainPanel.add(registerPanel, "registerPanel");
registerPanel.setLayout(null);
JLabel signinLink = new JLabel("Sign in");
signinLink.setForeground(new Color(0, 128, 255));
signinLink.setFont(new Font("Arial", Font.PLAIN, 12));
signinLink.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// mainPanel에서 loginPanel 키 값을 가진 화면을 보여줌
mainCard.show(mainPanel, "loginPanel");
// registerFields를 공백으로 만듬
clearFields(registerFields);
}
});
signinLink.setHorizontalAlignment(SwingConstants.CENTER);
signinLink.setBounds(175, 440, 50, 15);
registerPanel.add(signinLink);
JLabel registerLogoText = new JLabel("UserManagement");
registerLogoText.setHorizontalAlignment(SwingConstants.CENTER);
registerLogoText.setFont(new Font("Arial", Font.BOLD, 20));
registerLogoText.setBounds(75, 50, 250, 50);
registerPanel.add(registerLogoText);
JLabel RegisterText = new JLabel("Register");
RegisterText.setHorizontalAlignment(SwingConstants.CENTER);
RegisterText.setFont(new Font("Arial", Font.PLAIN, 30));
RegisterText.setBounds(115, 100, 170, 50);
registerPanel.add(RegisterText);
registerUsernameField = new JTextField();
registerUsernameField.setFont(new Font("Arial", Font.PLAIN, 12));
registerUsernameField.setColumns(10);
registerUsernameField.setBounds(75, 170, 250, 30);
registerPanel.add(registerUsernameField);
registerPasswordField = new JPasswordField();
registerPasswordField.setFont(new Font("Arial", Font.PLAIN, 12));
registerPasswordField.setBounds(75, 230, 250, 30);
registerPanel.add(registerPasswordField);
JLabel registerusernameLable = new JLabel("Username");
registerusernameLable.setFont(new Font("Arial", Font.PLAIN, 12));
registerusernameLable.setBounds(75, 150, 120, 15);
registerPanel.add(registerusernameLable);
JLabel registerpasswordLable = new JLabel("Password");
registerpasswordLable.setFont(new Font("Arial", Font.PLAIN, 12));
registerpasswordLable.setBounds(75, 210, 60, 15);
registerPanel.add(registerpasswordLable);
registerNameField = new JTextField();
registerNameField.setFont(new Font("HY견고딕", Font.PLAIN, 12));
registerNameField.setColumns(10);
registerNameField.setBounds(75, 290, 250, 30);
registerPanel.add(registerNameField);
JLabel registernameLable = new JLabel("name");
registernameLable.setFont(new Font("Arial", Font.PLAIN, 12));
registernameLable.setBounds(75, 270, 120, 15);
registerPanel.add(registernameLable);
registerEmailField = new JTextField();
registerEmailField.setFont(new Font("Arial", Font.PLAIN, 12));
registerEmailField.setColumns(10);
registerEmailField.setBounds(75, 350, 250, 30);
registerPanel.add(registerEmailField);
JLabel registeremailLable = new JLabel("email");
registeremailLable.setFont(new Font("Arial", Font.PLAIN, 12));
registeremailLable.setBounds(75, 330, 120, 15);
registerPanel.add(registeremailLable);
JButton registerButton = new JButton("Register");
registerButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
JsonObject userJson = new JsonObject();
userJson.addProperty("username", registerUsernameField.getText());
userJson.addProperty("password", registerPasswordField.getText());
userJson.addProperty("name", registerNameField.getText());
userJson.addProperty("email", registerEmailField.getText());
System.out.println(userJson.toString());
UserService userService = UserService.getInstance();
Map<String, String> response = userService.register(userJson.toString());
if (response.containsKey("error")) {
JOptionPane.showMessageDialog(null, response.get("error"), "error", JOptionPane.ERROR_MESSAGE);
return;
}
JOptionPane.showMessageDialog(null, response.get("ok"), "ok", JOptionPane.INFORMATION_MESSAGE);
mainCard.show(mainPanel, "loginPanel");
// registerFields를 공백으로 만듬
clearFields(registerFields);
}
});
registerButton.setFont(new Font("Arial", Font.PLAIN, 18));
registerButton.setBackground(Color.LIGHT_GRAY);
registerButton.setBounds(75, 400, 250, 30);
registerPanel.add(registerButton);
loginFields.add(usernameField);
loginFields.add(passwordField);
registerFields.add(registerUsernameField);
registerFields.add(registerPasswordField);
registerFields.add(registerNameField);
registerFields.add(registerEmailField);
}
private void clearFields(List<JTextField> textFields) {
for (JTextField field : textFields) {
// 공백이라도 있으면 setText("") 실행
if (field.getText().isEmpty()) {
continue;
}
field.setText("");
}
}
}