ORM(Object Relation Mapping)이란?
객체(Object)와 DB의 테이블을 Mapping 시켜 RDB 테이블을 객체지향적으로 사용하게 해주는 기술
RDB 테이블은 객체 지향적 특성(상속, 다형성) 등이 없어서 Java와 같은 객체 지향적 언어로 접근하는 것이 쉽지 않다
ORM을 사용하게 되면 객체지향적으로 RDB를 사용할 수 있다
Java에서 대표적인 ORM으로는 JPA와 그 구현체 Hiberante가 있다
JPA와 같은 ORM 기술은 객체가 DB에 연결되기 때문에, SQL을 직접 작성하지 않고 표준 인터페이스 기반으로 처리
Hiberante
하이퍼네이트는 자바 언어를 위한 ORM 프레임 워크
JPA의 구현체로, JPA 인터페이스를 구현하며, 내부적으로 JDBC API를 사용
JPA가 Hibernate 기반으로 만들어진 ORM 기술 표준
JDBC
자바 프로그래밍 언어와 다양한 데이터베이스 SQL 또는
테이블 형태의 데이터 사이의 독립적인 연결을 지원하는 표준
DB 작업을 위한 표준
Mybatis
JPA가 등장하기 이전에는 Mybatis라는 Object Mapping 기술을 이용
Java 클래스 코드와 직접 작성한 SQL 코드를 Mapping 시켜줘야 했다.
관계형 데이터베이스( Relational DataBase ) - RDB
테이블, 행, 열의 정보를 구조화하는 방식
- MySQL, MariaDB, Microsoft SQL Server, Oracle Database
- 방대한 데이터를 빠르고 편리하게 관리할 수 있도록 고안된 프로그램
- SQL (Structured Query Language)을 통해 CRUD(Create, Read, Update, Delete) 조작을 허용
ORM 활용 예제
ORM을 사용하지 않은 코드 -JDBC의 활용
public void insertUser(User user){
String query = " INSERT INTO user (email, name, pw) VALUES (?, ?, ?)";
PreparedStatement preparedStmt = conn.prepareStatement(query);
preparedStmt.setString (1, user.getEmail());
preparedStmt.setString (2, user.getName());
preparedStmt.setString (3, user.getPW());
// execute the preparedstatement
preparedStmt.execute();
}
JPA를 사용한 코드
@Entity
@Table(name = "user")
@Getter
@Builder
@NoArgsConstructor(force = true)
@AllArgsConstructor
public class User extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String email;
private String name;
private String pw;
}
@Entity @Table 어노테이션을 활용해서 테이블 생성 후, DB와 매핑해 준다
그리고, DB에 데이터를 저장하기 위한 Repository를 구현해야 한다
public interface UserRepository extends JpaRepository <User, Long> {
}
JpaRepository를 상속받아서 repository를 구현해 준다
JpaRepository는 기본적인 CRUD를 제공해 준다
JPA 사용 이유
- 엔티티에 맞는 테이블 생성 + DB 생성을 편리
- JPA는 설정에 따라 매핑된 객체를 바탕으로 테이블을 자동으로 만들어준다
- 객체 지향 중심의 개발
- 테스트 작성이 용이
- JPA를 사용하면 얻을 수 있는 큰 장점 중 하나가 바로 테스트를 작성하기 쉬워진다는 것이다.
- Repository 계층은 데이터베이스와 데이터를 주고받는 계층이므로 단위 테스트로 작성하기보다 DB와 연결하여 실제 쿼리를 날리는 통합 테스트로 진행하는 것이 좋다
- Spring은 Repository 테스트를 위한 @DataJpaTest를 제공하는데, @DataJpaTest를 이용하면 기본적으로 인 메모리 데이터베이스(h2)로 연결된다
- 테이블 생성 옵션을 주면 손쉽게 Repository 계층을 테스트할 수 있다
@JpaTestConfig
class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void selectUserByEmail() {
// given
final String email = "test@mangkyu.com"
// when
final User result userRepository.findByEmail(email);
// then
assertThat(result.getEmail()).isEqualTo(email);
}
}
- 기본적인 CRUD 자동화
'CS' 카테고리의 다른 글
[CS] 인터페이스 vs 추상 클래스 (0) | 2024.05.08 |
---|---|
[CS] 영속성 컨텍스트 (Persustence Context) (0) | 2024.05.08 |
[CS] JDK란? (0) | 2024.05.08 |
[CS] MVC 패턴이란? (0) | 2024.05.08 |
[CS] @Controller 와 @RestController (0) | 2024.05.08 |