Java에서 제공하는 ORM(Object-Relational Mapping) 표준 스펙.ORM은 객체와 관계형 데이터베이스의 테이블 간에 매핑을 제공하여 (불일치 문제를 해결하여) 개발자가 SQL 쿼리를 작성하지 않고도 데이터베이스 작업을 수행할 수 있게 합니다.
JPA의 주요 이점은 다음과 같습니다:
- 객체지향적인 코드 : 개발자는 데이터베이스 테이블과 직접적인 상호 작용을 거치지 않고, 대신 자바 객체를 다루는 방식으로 데이터베이스 작업을 수행할 수 있습니다. 이로 인해 코드가 더욱 간결하고 명확해지며, 객체지향 프로그래밍의 이점을 최대한 활용할 수 있습니다.
- 데이터베이스 독립성 : JPA는 다양한 데이터베이스 시스템과 호환됩니다. 따라서 SQL 쿼리를 직접 작성할 필요 없이 동일한 자바 코드로 다른 데이터베이스 시스템에 연결할 수 있습니다.
- 생산성 향상 : CRUD(Create, Read, Update, Delete) 작업과 같은 일반적인 작업에 대해 JPA는 자동화된 메서드를 제공합니다. 이를 통해 개발 시간을 단축하고 코드의 재사용성을 향상시킬 수 있습니다.
JPA가 필요한 경우 :
- 객체-관계 매핑 (ORM)이 필요한 경우: ORM은 객체지향 프로그래밍 언어와 데이터베이스 간의 '불일치' 문제를 해결하는 기술입니다. JPA는 이러한 ORM 기능을 제공합니다. 따라서 객체 지향적인 코드를 작성하면서 데이터베이스와의 상호작용을 원활하게 할 필요가 있다면 JPA를 사용해야 합니다.
- 데이터베이스 독립성이 필요한 경우: JPA는 데이터베이스에 독립적입니다. 즉, 특정 데이터베이스에 종속되지 않고, 다양한 데이터베이스 시스템과 호환됩니다. 이런 이유로 여러 다른 데이터베이스를 사용하거나, 향후 데이터베이스 변경 가능성이 있는 경우에도 JPA를 사용하는 것이 좋습니다.
- CRUD 작업 간소화: JPA를 사용하면 개발자는 데이터베이스에 대한 CRUD(Create, Read, Update, Delete) 연산을 쉽게 수행할 수 있습니다. 따라서 데이터베이스에 대한 기본적인 작업을 간소화하려면 JPA가 유용할 수 있습니다.
그러나 JPA는 모든 상황에 적합한 것은 아닙니다. 주요 제약사항은 다음과 같습니다:
- 복잡한 쿼리 : 복잡한 쿼리나 최적화된 쿼리를 작성해야 하는 경우에는 SQL을 직접 사용하는 것이 더 효율적일 수 있습니다. JPA는 일반적인 쿼리에 적합하지만, 복잡한 쿼리를 만드는데 있어 제한적입니다.
- 성능 이슈 : JPA는 객체-테이블 매핑을 통해 편리함을 제공하지만, 이 과정에서 생기는 오버헤드가 성능을 저하시킬 수 있습니다. 따라서 대규모 데이터를 다루는 상황에서는 성능 문제가 발생할 수 있습니다.
JPA가 필요하지 않은 경우 :
- 단순한 애플리케이션 또는 프로토타입 개발: 작은 규모의 애플리케이션 또는 프로토타입을 개발하는 경우, JPA는 오버헤드를 초래할 수 있습니다. 이런 경우, 단순 SQL 쿼리 또는 더 가벼운 데이터 접근 기술을 사용하는 것이 더 적합할 수 있습니다.
- 복잡한 SQL 쿼리 필요: JPA는 ORM을 사용하여 복잡한 SQL 쿼리를 처리하는데 제한이 있을 수 있습니다. 만약 복잡한 쿼리와 작업을 수행해야 한다면, JDBC와 같은 다른 기술을 사용하는 것이 더 나을 수 있습니다.
- 고성능이 필요한 경우: JPA는 강력한 기능이지만, 때때로 성능이 중요한 애플리케이션에서는 JPA를 사용하는 것이 성능을 저하시킬 수 있습니다. ORM이 초래하는 오버헤드, 지연 로딩과 같은 특성 때문에 매우 빠른 응답 시간이 요구되는 상황에서는 JPA보다는 저수준의 데이터 접근 기술이 더 적합할 수 있습니다.
- 프로시저가 많은 레거시 데이터베이스를 사용하는 경우: 데이터베이스에 프로시저가 많은 경우 JPA보다는 JDBC를 사용하는 것이 더 효과적일 수 있습니다. JPA는 프로시저를 지원하지만, 복잡한 프로시저를 다루는 데에는 JDBC가 더 유연성을 제공합니다.(즉, JPA와 같은 ORM 기술보다는 직접 SQL을 다루는 JDBC와 같은 기술이 더 효율적일 수 있습니다. 이는 JPA가 복잡한 프로시저를 다루는 데에는 한계가 있기 때문입니다.)
- 비관계형 데이터베이스 사용: JPA는 관계형 데이터베이스에 최적화되어 있습니다. NoSQL 등의 비관계형 데이터베이스를 사용하는 경우, 해당 데이터베이스에 특화된 기술을 사용하는 것이 더 적합할 수 있습니다.
**오버헤드(overhead)란 컴퓨터 과학에서 일반적으로 어떤 처리를 하기 위해 들어가는 직접적이지 않은 비용을 의미합니다. 예를 들어, JPA 같은 ORM 프레임워크를 사용하면 개발자는 SQL 쿼리를 직접 작성하는 것보다 더 높은 수준에서 데이터베이스와 상호 작용할 수 있지만, 이는 추가적인 처리 시간이나 메모리 사용으로 이어질 수 있습니다. 이런 추가적인 비용이 바로 "오버헤드"입니다.
**프로토타입(prototype)이란 어떤 제품이나 소프트웨어의 초기 버전을 의미합니다. 이는 최종 제품이나 시스템의 기능, 디자인, 성능 등을 테스트하고 검증하기 위한 모델입니다. 프로토타입 개발에서는 일반적으로 간결하고 빠른 개발이 중요하며, 때때로 전체 기능이나 최적화는 뒤로 미루어질 수 있습니다. JPA 같은 복잡한 프레임워크를 사용하는 것이 프로토타입 개발에 있어서는 과도한 오버헤드를 초래할 수 있으며, 이럴 때는 보다 간단한 데이터 접근 기술을 사용하는 것이 적합할 수 있습니다.
**프로시저(procedure)란 SQL을 사용하여 작성되며, 데이터베이스 내에 저장되어 재사용이 가능한 일련의 SQL 문을 의미합니다. 프로시저는 로직을 데이터베이스 서버에 저장함으로써 애플리케이션과 데이터베이스 사이의 네트워크 트래픽을 줄이고, 코드의 재사용성을 높이며, 보안을 강화하는 등의 이점이 있습니다.
**ORM은 "Object-Relational Mapping"의 약자로, 객체-관계 매핑을 의미합니다. 이는 객체 지향 프로그래밍 언어와 관계형 데이터베이스 사이의 '불일치' 문제를 해결하는 기술입니다.
객체 지향 프로그래밍 언어에서는 데이터를 객체(object)라는 형태로 다룹니다. 객체는 상태(state)와 행동(behavior)을 가지며, 이들은 각각 필드(field)와 메서드(method)로 표현됩니다. 또한 객체 지향 프로그래밍에서는 객체들 간의 관계를 표현하기 위해 상속, 다형성, 캡슐화 등의 개념을 사용합니다.
반면, 관계형 데이터베이스에서는 데이터를 테이블(table) 형태로 저장하며, 이들 테이블은 행(row)과 열(column)로 구성됩니다. 테이블 간의 관계는 주로 외래키(foreign key)를 사용해 표현됩니다.
이렇게 객체 지향 프로그래밍과 관계형 데이터베이스는 데이터를 다루는 방식이 매우 다르기 때문에, 이 둘 사이의 '불일치' 문제가 발생할 수 있습니다. 이를 해결하기 위해 ORM이라는 기술이 사용됩니다.
ORM은 객체 지향 프로그래밍 언어에서 사용하는 객체를 관계형 데이터베이스의 테이블에 자동으로 매핑해줍니다. 즉, 개발자는 SQL 쿼리를 직접 작성하는 대신 객체 지향적인 코드를 작성하면, ORM이 이를 SQL 쿼리로 변환하여 데이터베이스와의 상호작용을 담당합니다. 이로써 개발자는 데이터베이스 처리를 위한 복잡한 코드 작성을 최소화하고, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다.
Java Persistence API(JPA)는 ORM을 구현한 기술 중 하나로, 자바 어플리케이션에서 관계형 데이터베이스의 데이터를 관리하는 표준 API입니다.
- JDBC(Java Database Connectivity): JDBC는 자바에서 데이터베이스에 접근할 수 있도록 하는 API입니다. 이를 사용하면 자바 어플리케이션에서 SQL 쿼리를 실행하고, 그 결과를 처리할 수 있습니다. JDBC는 SQL을 직접 사용하므로, 데이터베이스의 세부적인 특성을 제어할 수 있지만, 코드가 복잡해지는 단점이 있습니다. 또한 JDBC를 사용하면 데이터베이스 별로 다른 SQL을 사용해야 하는 문제도 있습니다.
- JPQL(Java Persistence Query Language): JPQL은 JPA(Java Persistence API)에서 사용하는 쿼리 언어입니다. 이는 SQL과 유사하지만, 데이터베이스 테이블이 아닌 자바의 엔티티 객체를 대상으로 쿼리를 수행합니다. 즉, 객체 지향적인 쿼리를 작성할 수 있으며, 이는 ORM(Object-Relational Mapping)의 일환입니다. 또한 JPQL은 데이터베이스에 독립적이므로, 다양한 데이터베이스에서 동일한 JPQL 쿼리를 사용할 수 있습니다. 그러나 복잡한 쿼리나 특정 데이터베이스의 고유 기능을 사용하려면 JPQL보다는 SQL이 적합할 수 있습니다.
- 따라서, JDBC와 JPQL은 각각 SQL과 JPQL이라는 서로 다른 쿼리 언어를 사용하며, 데이터베이스에 접근하고 쿼리를 실행하는 방식에 차이가 있습니다. JDBC는 저수준의 데이터베이스 접근을 제공하며, JPQL은 객체 지향적인 쿼리 작성을 가능하게 하는 고수준의 쿼리 언어입니다.
- JPA 는 어플리케이션과 JDBC 사이에서 동작하여 개발자는 JPA 에게 명령하고 JPA 가 JDBC API 를 사용해 SQL 을 실행한다.
데이터베이스가 바뀔 가능성이 있는 경우 JPA를 권장합니다. JPA는 추상화한 데이터 접근 계층을 제공하기 때문에 설정 파일에 사용할 데이터베이스를 등록하기만 하면 얼마든 데이터베이스를 변경할 수 있습니다. 그러나 통계 처리 같은 복잡한 쿼리가 필요한 경우에는 JPA 보다는 SQL문이 오히려 나을 수도 있습니다. JPA에서 Native SQL Query를 사용할 수 있지만 특정 데이터베이스에 종속 된다는 문제가 있습니다. 이를 보완하기 위해 JPA에서는 SQL과 유사한 기술인 JPQL을 지원합니다. 그리고 JPA에 대한 이해가 부족해 잘못된 매핑으로 설계하는 경우 N+1 문제로 성능 저하가 발생할 수 있습니다
JPA는 ORM을 위해 JAVA에서 제공하는 API이며 특정 DB에 종속되지 않습니다. 구현체로는 Hibernate가 있습니다. JPA를 사용하면 메소드 호출만으로 쿼리가 실행되니 생산성이 향상되고 유지 보수에 코스트가 하락합니다. 이로 인해 비즈니스 로직에 집중 가능하고 객체 중심 프로그래밍이 가능하게 되지만, 복잡한 쿼리문 구현이 힘들다는 단점이 있습니다. 결국 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전 시킬 수 있는 JPA 사용은 긍정적이지만, 통계 쿼리처럼 매우 복잡한 SQL을 작성하기에는 적합하지 않습니다.
JPA는 java 진영의 표준 ORM으로 관계형DB와 객체지향 언어인 java 와의 관계에서 쿼리문 작성 없이 편하게 데이터 다룰 수 있게 해주는 도구입니다. 쿼리문을 직접 작성할 필요가 없어 생산성이 향상되고 오류의 여지가 적어지는 장점이 있지만 통계를 내는 등의 복잡한 쿼리의 작성이 필요한 경우 적절하지 않을수 있습니다. 일반적으로 많이 사용하지만 기술의 장단점을 인지하고 장점이 발휘될수 있는 환경에서 적절하게 사용하는게 좋습니다.
'Mockterview' 카테고리의 다른 글
Annotation(@) (0) | 2023.05.19 |
---|---|
더티체킹 (Dirty Checking) (0) | 2023.05.19 |
MVC (Model View Controller)패턴 (0) | 2023.05.19 |
Override(오버라이딩) 와 Overload(오버로딩) (0) | 2023.05.19 |
Call by reference (0) | 2023.05.18 |