Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

ki-sd 님의 블로그

[2026-04-28] Java JDBC 실전 2: 회원가입, 로그인 및 동적 권한 제어 시스템 구축 본문

OracleStudy

[2026-04-28] Java JDBC 실전 2: 회원가입, 로그인 및 동적 권한 제어 시스템 구축

ki-sd 2026. 4. 28. 20:34

쇼핑몰이나 게시판 등 거의 모든 애플리케이션의 시작점인 회원 관리 로직을 구현했다. 백엔드(DAO)에서 데이터를 검증하고 가공하여 프론트엔드(UI)의 상태를 동적으로 변화시키는, 실제 웹 서비스의 핵심 워크플로우를 데스크톱 환경(Swing)으로 고스란히 옮겨 구현해 보는 유의미한 시간이었다.

 

1. 아이디 중복 체크와 우편번호 검색 (데이터 무결성 및 검색 최적화)

  • 아이디 중복 검증 (memberIdCheck): 사용자가 입력한 ID가 DB에 존재하는지 확인하기 위해 SELECT COUNT(*) FROM member WHERE id=? 쿼리를 날렸다. 결과값이 0이면 사용 가능, 1 이상이면 중복으로 판별하는 직관적이고 확실한 검증 로직을 구현했다.
  • 우편번호 동적 검색 (postFind): 사용자가 '동' 이름을 입력하면 주소 목록을 띄워주는 시스템을 만들었다. JDBC에서 LIKE 연산자를 사용할 때 WHERE dong LIKE '%'||?||'%' 형태로 바인딩 변수(?)를 문자열 결합해야 문법 에러 없이 작동한다는 핵심 개념을 다시 한번 실전에 적용했다.
  • 이벤트 기반 데이터 전달: PostFindFrame의 JTable에서 주소를 더블 클릭(e.getClickCount() == 2)하면, 선택된 행(Row)의 우편번호와 주소 데이터를 메인 JoinPanel의 텍스트 필드로 자동 주입하고 검색 창을 닫는 UX(사용자 경험) 중심의 로직을 완성했다.

2. 데이터 전달 객체(VO)를 활용한 회원가입 (INSERT 트랜잭션)

  • 사용자가 입력한 아이디, 비밀번호, 이름, 성별 등 10여 개의 항목을 낱개의 변수로 넘기지 않고, MemberVO라는 하나의 객체(캡슐)에 담아 MemberDAO로 전달했다.
  • INSERT INTO member VALUES(?, ?, ...) 쿼리를 PreparedStatement에 세팅하고, executeUpdate()를 호출했다. 이 메서드가 반환하는 값이 0보다 크면 DB에 성공적으로 반영된 것(회원가입 완료)으로 판단하여 홈 화면으로 이동시키는 분기 처리를 구현했다.

3. 안전한 로그인 로직과 다중 상태 제어 (Authentication & Authorization) 가장 인상 깊었던 부분은 로그인의 경우의 수를 3단계로 쪼개어 검증하는 로직이었다.

  • 1단계 (ID 존재 여부): 먼저 COUNT(*)를 통해 ID가 있는지 검사한다. 없으면 NOID 메시지를 반환해 데이터베이스 자원 낭비를 막는다.
  • 2단계 (비밀번호 검증): ID가 존재하면 DB에 저장된 실제 비밀번호를 가져와 사용자가 입력한 비밀번호와 자바 단에서 비교(equals())한다. 일치하지 않으면 NOPWD를 반환한다.
  • 3단계 (권한 및 상태 부여): 비밀번호까지 맞으면 OK 상태와 함께, DB에 저장된 isAdmin 값(관리자 'y', 일반 'n')을 긁어와 프로그램의 전역 정적 변수(static)에 저장하여 세션(Session)처럼 활용하는 아키텍처를 구축했다.

4. 상태에 따른 UI 동적 제어 (Dynamic Menu Rendering)

  • 로그인이 성공하여 전역 상태 값(UserMainFrame.bLogin)이 true로 바뀌면, MenuPanel의 init() 메서드를 재호출하여 화면을 다시 그리도록 설계했다.
  • 비로그인 상태: [로그인], [회원가입] 버튼 노출.
  • 로그인 상태: 기존 버튼을 삭제하고 [로그아웃] 버튼 노출.
  • 권한 분리 (Authorization): isAdmin 변수가 'n'이면 [마이페이지]를, 'y'이면 [관리자페이지] 버튼을 조건부로 렌더링하도록 if-else 구조를 짰다. 이는 훗날 Spring Framework 환경에서 인터셉터(Interceptor)나 시큐리티(Spring Security)를 이용해 권한별 페이지 접근을 제어하는 로직의 아주 훌륭한 뼈대가 됨을 확신했다.