1. JDBC (Java Database Connectivity)

JDBC는 Java 애플리케이션이 데이터베이스와 연결할 수 있게 해주는 Java의 표준 API입니다. JDBC는 SQL 쿼리를 실행하고, 결과를 처리하며, 데이터베이스 트랜잭션을 관리하는 데 필요한 기본적인 기능들을 제공합니다.

  • 특징:
    • 직접 제어: SQL 쿼리를 직접 작성하고 실행할 수 있습니다.
    • 저수준 API: 데이터베이스와의 연결, 쿼리 실행, 결과 처리 등 모든 작업을 수동으로 처리해야 합니다.
    • 유연성: 복잡한 쿼리와 데이터베이스의 세부적인 설정을 직접 조작할 수 있습니다.

2. JPA (Java Persistence API)

JPA는 Java 애플리케이션에서 객체-관계 매핑(ORM)을 지원하는 표준 API입니다. JPA를 사용하면 데이터베이스 테이블을 Java 객체로 매핑하고, 객체 지향적인 방식으로 데이터베이스 작업을 수행할 수 있습니다.

  • 특징:
    • 고급 추상화: SQL을 직접 작성할 필요 없이 객체 지향적으로 데이터베이스를 조작할 수 있습니다.
    • ORM 프레임워크: Hibernate, EclipseLink 등과 함께 사용됩니다.
    • JPQL (Java Persistence Query Language): 객체 지향 쿼리 언어를 사용하여 데이터를 조회합니다.
    • 자동화된 관리: 엔티티의 생명주기(저장, 수정, 삭제 등)를 자동으로 관리합니다.

3. MyBatis

MyBatis는 SQL 쿼리를 직접 작성하면서도 매핑을 통해 객체와 결과를 쉽게 연결할 수 있도록 도와주는 프레임워크입니다. JPA보다는 더 직접적이고 세밀한 제어를 제공하지만, JDBC보다는 높은 수준의 추상화를 제공합니다.

  • 특징:
    • SQL 직접 작성: 쿼리를 XML 파일이나 애너테이션으로 정의합니다.
    • 매핑: SQL 쿼리 결과를 Java 객체와 매핑할 수 있습니다.
    • 유연성: 복잡한 SQL 쿼리와 매핑 규칙을 세밀하게 조정할 수 있습니다.
    • 쿼리 재사용: SQL 쿼리를 재사용하고, 동적 쿼리 생성 기능을 제공합니다.

4. jOOQ (Java Object Oriented Querying)

jOOQ는 SQL을 Java 코드에서 직접 작성하고 실행할 수 있게 해주는 라이브러리입니다. jOOQ는 SQL 문법을 Java에서 타입 안전하게 사용할 수 있도록 도와줍니다.

  • 특징:
    • 타입 안전: SQL 쿼리를 Java 코드로 작성할 때 타입 안전성을 보장합니다.
    • SQL을 직접 작성: SQL 문을 Java 코드에서 직접 작성하고 실행할 수 있습니다.
    • 쿼리 빌더: SQL 쿼리를 코드에서 체이닝 방식으로 빌드할 수 있습니다.
    • 정적 검증: 컴파일 타임에 SQL 구문을 검증하여 오류를 줄입니다.

이 네 가지 기술은 데이터베이스와 상호작용하는 방식에서 차이를 보이며, 각 기술의 선택은 애플리케이션의 요구사항과 개발자의 선호에 따라 다를 수 있습니다.

 

5. 각 기술에 대한 문법을 간단히 설명

5.1. JDBC (Java Database Connectivity)

JDBC는 Java 코드에서 직접 SQL 쿼리를 작성하고 실행합니다. 기본적인 사용법은 다음과 같습니다

public class JdbcExample {
    public static void main(String[] args) {
        try {
            // 데이터베이스 연결
            Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
            // SQL 쿼리 실행
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
            // 결과 처리
            while (resultSet.next()) {
                System.out.println(resultSet.getString("username"));
            }
            // 연결 종료
            resultSet.close();
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

5.2. JPA (Java Persistence API)

JPA는 객체-관계 매핑을 통해 SQL 쿼리 없이 객체 지향적으로 데이터베이스 작업을 처리합니다. 예를 들어, 엔티티 클래스를 정의하고, 리포지토리 클래스를 사용하여 CRUD 작업을 수행합니다.

//엔티티 클래스:
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    private Long id;
    private String username;

    // Getters and setters
}

//리포지토리 클래스:
public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

//서비스 클래스:
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User getUserByUsername(String username) {
        return userRepository.findByUsername(username);
    }
}

 

5.3. MyBatis

MyBatis는 SQL 쿼리를 XML 파일 또는 애너테이션으로 정의하고, 매퍼 인터페이스를 통해 쿼리를 호출합니다.

## XML 매퍼 파일:
<mapper namespace="com.example.UserMapper">
    <select id="getUserById" parameterType="int" resultType="com.example.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

// 매퍼 인터페이스:

public interface UserMapper {
    User getUserById(int id);
}

// 실행파일
public class MyBatisExample {
    public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        try (SqlSession session = sqlSessionFactory.openSession()) {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.getUserById(1);
            System.out.println(user.getUsername());
        }
    }
}

 

4. jOOQ

jOOQ는 Java 코드에서 SQL 쿼리를 타입 안전하게 작성하고 실행합니다.

import org.jooq.DSLContext;
import org.jooq.impl.DSL;
import org.jooq.impl.DefaultDSLContext;

public class JooqExample {
    public static void main(String[] args) {
        DSLContext create = DSL.using(configuration());

        // SQL 쿼리 작성 및 실행
        Result<Record> result = create.select().from(USERS).fetch();

        // 결과 처리
        for (Record r : result) {
            System.out.println(r.getValue(USERS.USERNAME));
        }
    }
}

 

종합 추천

  • 성능 최적화와 직접 제어가 중요하다면 JDBC를 고려할 수 있습니다.
  • 객체 지향적 접근자동화된 데이터베이스 작업이 필요하다면 JPA가 적합합니다.
  • SQL 쿼리와 매핑의 유연성이 필요하다면 MyBatis를 고려할 수 있습니다.
  • 타입 안전성과 정적 검증이 중요하다면 jOOQ를 추천합니다.

 

 

 

'Java' 카테고리의 다른 글

Java List.of()  (1) 2025.01.26
JAVA 배열 index값 반환 메서드  (2) 2025.01.25
Java 람다  (0) 2024.08.10
JAVA SOLID 개념  (0) 2024.07.17
JAVA 파일 읽기 및 효율적인 I/O 처리 방법  (0) 2024.06.15

+ Recent posts