ki-sd 님의 블로그
[2026-04-24] Java JDBC 연동 실전: 음악 목록/검색/상세보기 시스템 구현 본문
오늘은 자바(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단계를 체득했다.
- Class.forName()으로 오라클 드라이버 메모리 할당
- DriverManager.getConnection()으로 DB 연결 터널 개통
- 실행할 SQL 문장 작성 (String sql)
- conn.prepareStatement(sql)를 통해 쿼리 전송 객체 생성
- ps.executeQuery()로 쿼리 실행 및 ResultSet으로 결과집합 수신
- rs.next()로 커서를 이동하며 while문을 돌려 VO 객체에 값을 채우고 List에 적재
- 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 팝업으로 상세 정보를 띄워주는 데스크톱 앱의 흐름을 완성했다.
'OracleStudy' 카테고리의 다른 글
| [2026-04-28] Java JDBC 실전 2: 회원가입, 로그인 및 동적 권한 제어 시스템 구축 (0) | 2026.04.28 |
|---|---|
| [2026-04-27] 웹 아키텍처 총정리와 데이터베이스 ER 모델링 설계 로직 (0) | 2026.04.27 |
| [2026-04-23] PL/SQL 심화: 함수, 프로시저, 트리거의 완벽한 분리와 SQL 실전 총정리 (0) | 2026.04.23 |
| [2026-04-22] 오라클 PL/SQL 입문: 절차적 프로그래밍과 커서(Cursor) 제어 (0) | 2026.04.23 |
| [2026-04-21] 오라클 성능 최적화의 핵심, 인덱스(Index)와 DDL/객체 총정리 (1) | 2026.04.21 |
