본문 바로가기
Programming Languages/Java

Chapter 29. WindowBuilder

by 더 이프 2023. 1. 17.
728x90

목차

    1. WindowBuilder

    ■ WindowBuilder란?

    • Swing, SWT와 같은 자바 라이브러리를 기반으로 코드를 직접 작성하지 않고도 GUI를 시각적으로 간단하게 만들 수 있는 도구
    • WindowBuilder를 통해 디자인 구현 가능

    ■ WindowBuilder 설치

    1. Help에서 Eclipse Marketplace 클릭
    2. Windows 검색 후 WindowBuilder Current 설치
    3. 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("");
    		}
    	}
    }