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 |