1. 개발자가 작성한 SQL쿼리를 Java객체와 집접 매핑하는 방식입니다.

  2. XML 파일이나 어노테이션을 통해 SQL문을 명시적으로 작성해야 합니다.

  3. 개발자가 SQL을 완전히 제어할 수 있어 복잡한 쿼리나 성능 최적화에 필요한 상황에 유리합니다.

  4. 장점

    1. SQL을 직접 작성하므로 세밀한 튜닝이 가능
    2. 복잡한 조인이나 서브쿼리를 자유롭게 사용
    3. 기존 레거시 DB나 복잡한 스키마에 적응하기 쉬움
      1. 레거시 DB의 특징

        1. 비표준적인 테이블 구조
        Create table TBL_USR_INFO(
        	  USR_ID VARCHAR(20),      -- 표준: user_id
            USR_NM VARCHAR(100),     -- 표준: user_name  
            REG_DT VARCHAR(8),       -- 날짜를 문자열로 저장
            DEL_YN CHAR(1)           -- Y/N으로 삭제 여부 관리
        	
        )
        
      2. 정규화되지 않은 구조

        CREATE TABLE TBL_USR_INFO(
            CUST_ID VARCHAR(10),
            CUST_NAME VARCHAR(50),
            ORDER_ID VARCHAR(10),
            ORDER_DATE VARCHAR(8),
            PRODUCT_INFO VARCHAR(500)  -- 상품 정보가 문자열로 저장
        )
        
  5. 단점

    1. 반복적인 CRUD SQL작성으로 반복적인 작업이 늘어남
    2. DB벤더별 SQL방언 차이를 직접 처리해야 함
      1. DB마다 각자의 SQL언어가 있으므로 이를 방언이라고 표현함
    -- MySQL & PostgreSQL: LIMIT/OFFSET 사용
    SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 20;
    
    -- Oracle: ROWNUM 사용 (복잡함)
    SELECT * FROM (
        SELECT ROWNUM rnum, u.* FROM (
            SELECT * FROM users ORDER BY id
        ) u WHERE ROWNUM <= 30
    ) WHERE rnum > 20;
    
    -- SQL Server: OFFSET/FETCH 사용
    SELECT * FROM users ORDER BY id 
    OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;