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-24] Java JDBC 연동 실전: 음악 목록/검색/상세보기 시스템 구현 본문

OracleStudy

[2026-04-24] Java JDBC 연동 실전: 음악 목록/검색/상세보기 시스템 구현

ki-sd 2026. 4. 24. 20:46

오늘은 자바(Java) 애플리케이션과 DB를 연결하는 JDBC(Java Database Connectivity) 기술을 실전 데이터에 적용했다. 앞서 레퍼런스로 분석한 '영화 검색 시스템'의 구조를 바탕으로, 지니뮤직(genie_music) 데이터를 활용한 '음악 목록 및 검색 시스템'을 직접 구현하며 백엔드와 프론트엔드(Swing)의 연동 흐름을 익혔다.

 

1. 데이터 전송 객체(VO)와 데이터 접근 객체(DAO) 패턴의 확립

  • VO (Value Object) 매핑: 오라클 테이블의 구조를 자바 객체로 1:1 매핑하는 작업부터 시작했다. genie_music 테이블의 NUMBER 타입은 자바의 int로, VARCHAR2나 CHAR 타입은 String으로 매핑하여 MusicVO 클래스를 캡슐화(은닉)했다.
  • DAO (Data Access Object)와 싱글톤: 데이터베이스와 직접 통신하는 로직은 오직 MusicDAO 클래스 한 곳에서만 전담하도록 분리했다. 특히 메모리 누수와 불필요한 객체 생성을 막기 위해, 생성자를 숨기고 newInstance() 메서드를 통해서만 단 하나의 DAO 인스턴스를 공유받는 싱글톤(Singleton) 패턴을 적용했다.

2. JDBC 7단계 워크플로우와 서버 사이드 페이징 자바에서 오라클에 쿼리를 날리고 결과를 받아오는 표준 7단계를 체득했다.

  1. Class.forName()으로 오라클 드라이버 메모리 할당
  2. DriverManager.getConnection()으로 DB 연결 터널 개통
  3. 실행할 SQL 문장 작성 (String sql)
  4. conn.prepareStatement(sql)를 통해 쿼리 전송 객체 생성
  5. ps.executeQuery()로 쿼리 실행 및 ResultSet으로 결과집합 수신
  6. rs.next()로 커서를 이동하며 while문을 돌려 VO 객체에 값을 채우고 List에 적재
  7. finally 블록에서 ps.close(), conn.close()로 자원 완벽 반납
  • 페이징 쿼리의 적용: 음악 목록 출력 시, 오라클 12c의 최신 문법인 OFFSET ? ROWS FETCH NEXT 20 ROWS ONLY를 PreparedStatement에 적용했다. 사용자가 요청한 페이지 번호를 매개변수로 받아 계산식((page*20)-20)을 통해 동적으로 데이터를 잘라오는 완벽한 서버 사이드 페이징 로직을 구현했다.
  • 총 페이지 연산: 하단 페이징 처리를 위해 CEIL(COUNT(*)/20.0) 쿼리를 날려, 전체 데이터 건수에 비례하는 총 페이지 수를 DB 단에서 계산해 가져오는 최적화를 수행했다.

3. 동적 검색(Dynamic Search) 로직과 PreparedStatement의 주의점

  • 사용자가 콤보박스에서 '제목', '가수', '앨범' 중 하나를 선택하고 검색어를 입력하면, 조건에 맞는 음악만 필터링하는 기능을 구현했다.
  • LIKE 연산자와 바인딩 변수(?): SQL 작성 시 WHERE col LIKE '%?%' 형태로 작성하면 문법 에러가 발생한다. 매개변수로 넘어오는 검색어를 바인딩하기 위해 문자열 결합 기법인 WHERE " + col + " LIKE '%'||?||'%' 형태로 쿼리를 구성해야 정상적으로 파라미터가 치환된다는 JDBC 쿼리 작성의 핵심 트러블슈팅을 경험했다.

4. UI/UX 연동: JTable과 이벤트 리스너(Listener)

  • 순수 백엔드 데이터가 화면에 어떻게 그려지는지 자바 Swing의 JTable을 통해 시각화했다.
  • DefaultTableModel을 오버라이딩하여 표의 데이터를 직접 수정할 수 없도록(isCellEditable) 방어 로직을 짰으며, 테이블의 특정 행(ROW)을 더블 클릭(e.getClickCount() == 2)했을 때 MouseListener가 이를 감지하여 printDetail() 메서드를 호출하도록 이벤트를 연결했다.
  • 더블 클릭 시 선택된 행의 0번째 컬럼(음악 고유 번호)을 추출한 뒤, DAO의 musicDetailData(no)를 호출해 단일 MusicVO를 반환받아 JOptionPane 팝업으로 상세 정보를 띄워주는 데스크톱 앱의 흐름을 완성했다.