728x90
반응형
Persistence
- 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성(영속성)
- 객체의 상태를 데이터 베이스에 저장 즉, 객체에게 영속성을 부여
Persistence Layer를 구현하는 방법
- JDBC만을 이용하는 방법
- Persistence Framework를 이용하는 방법
JDBC만을 이용해 영속 계층을 구현
JDBC
- 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API
- 자바 애플리케이션에서 DBMS에 종속적이지 않고, 하나의 JDBC API를 이용해 DB 작업을 처리
- 각각의 DBMS는 이를 구현한 JDBC 드라이버를 제공
JDBC 단점
- 간단한 SQL을 실행하는 데도 중복된 코드를 반복적으로 사용
- DB에 따라 일관성 없는 정보를 가진 채로 SQLException를 처리해야 한다.
- Connection과 같은 공유 자원을 제대로 반환해주지 않으면 시스템의 자원이 바닥나는 버그가 발생하는데, 이를 수동으로 닫아줘야한다.
Persistence Framework
- JDBC의 단점을 손쉽게 처리해주는 framework
- JDBC처럼 번거로움 없이 간단한 작업만으로 DB와 연동되는 시스템을 빠르게 개발 가능
- 모든 Persistence Framework는 내부적으로 JDBC API를 이용하는데 이를 SQL Mapper와 ORM으로 나눌 수 있다.
SQL Mapper(SQL <-> Object)
- Java Persistence Framework 중 하나인 SQL Mapper는 객체(Object)와 SQL문을 맵핑하여 데이터를 객체화 하는 것
- 객체와 관계를 매핑하는 것이 아닌, 직접 작성한 SQL문의 질의 결과와 객체의 필드를 매핑하여 데이터를 객체화
- Spring JDBC, MyBatis
Spring JDBC
- Spring JDBC 또한 SQL문과 객체를 매핑하는 점에서 SQL Mapper의 기능을 제공
- JdbcTemplate을 사용해서 쿼리 수행 결과와 객체의 필드를 매핑하여 반환 받을 수 있고, 이때 사용되는 Rowmapper를 재활용 할수도 있다.
- JDBC에서 반복적으로 해야하는 많은 작업들을 대신 해줘서 우리는 실행한 SQL과 바인딩 할 파라미터를 넘겨주거나 쿼리실행 결과를 어떤 객체에 넘겨 받을지를 지정만 하면 된다.
MyBatis
- 반복적인 JDBC 프로그래밍을 단순화하고 SQL쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리하여 관리
- JDBC만 사용하면 결과를 가져와서 객체의 인스턴스에 매핑하기 위한 많은 코드가 필요하지만, MyBatis는 그 코드들을 작성하지 않아도 되게 해준다.
- 스프링부트에서 이용할 경우 DB에 접근하기 위한 별다른 작업 없이 mapper 인터페이스와 mapping file만 구현하면 자연스럽게 객체의 필드와 SQL문이 맵핑이 된다.
- 동적인 쿼리를 제공
mapper 인터페이스를 정의하고, 인터페이스 메서드와 1대1로 매칭이 되는 Xml 파일을 작성하고 적절한 쿼리를 정의하면 된다.
Mybatis 결론
- 자동으로 Conntection 관리를 해주면서 JDBC를 사용할 때의 중복 작업 대부분을 없애준다.
- 복잡한 쿼리나 다이나믹하게 변경되는 쿼리 작성이 쉽다.
- DAO로부터 SQL문을 분리하여 코드의 간결성 및 유지보수성 향상
JDBC와 SQL Mapper와 같이 SQL을 개발자가 직접 작성하는 문제점
- DB마다 쿼리문법이나 데이터 타입이 달라서 특정 DB에 종속적으로 사용하기 쉽다.
- 테이블마다 비슷한 CRUD 작업이 계속 일어나는데, 이를 개발자가 일일히 쿼리를 작성하며 반복적인 DAO 개발을 피할 수 없게 된다.
- 만약 테이블의 필드가 변경되었다면 이와 관련된 모든 DAO의 SQL문, 객체의 필드 등을 수정해야한다.
SQL 의존적인 개발
- SQL문을 직접 작성하면 결국 SQL 의존적인 설계를 할 수 밖에 없다.
- 객체간의 관계는 사라지고 데이터베이스에 대한 처리에 집중하게 되어버린다.
- 비즈니스 로직 구현보다 데이터베이스 접근 로직 구현에 집중하며, 데이터베이스에 항상 의존 관계를 가질 수 밖에 없게된다.
관계형DB와 객체간의 패러다임 불일치 문제
- 객체지향은 추상화, 상속, 다형성을 지향
- RDB는 데이터 중심의 구조 지향
- 각각 지향하는 목적이 달라서 사용 방법과 표현방식에 차이가 있을 수 밖에 없다.
ORM(Object Relational Mapping)
- 객체와 관계형 데이터 베이스를 맵핑하는 것
- 객체간의 관계를 바탕으로 SQL문을 자동으로 생성하고 직관적인 코드로 데이터를 조작해서 개발자의 불편함 해결
- SELECT * FROM user; -> user.findAll()
JPA(ORM의 대표적인 예)
- 자바 ORM 기술에 대한 API 표준 명세로 인터페이스들을 모아둔것이다.
- JPA의 기술을 사용하려면 JPA 인터페이스를 구현한 ORM 프레임워크를 사용해야한다.
- ORM프레임워크에는 Hibernate(하이버네이트), 이클립스 링크가 있다.
ORM 장점
- 객체지향 언어가 가진 장점을 활용할 수 있다.
- 생산성 - 반복적인 CRUD 용 SQL을 개발자가 작성하지 않아도 된다.
- 데이터 접근 추상화, 벤더 독립성 - 데이터베이스 벤더마다 미묘하게 다른 데이터 타입, SQL을 손쉽게 해결
- 유지보수 - 필드 추가, 삭제 시 관련된 CRUD 쿼리를 직접 수정하지 않고 에티티를 수정하면 됨.
728x90
반응형
'영상 후기 > Spring Boot' 카테고리의 다른 글
영상 후기 - [10분 테코톡] 오찌, 야호의 DI와 IoC (0) | 2023.04.27 |
---|---|
영상 후기 - [10분 테코톡] 🌕제이의 Spring AOP (0) | 2023.04.06 |
영상 후기 - [10분 테코톡] 수달의 JPA N+1 문제 (0) | 2023.03.31 |
영상 후기 - [10분 테코톡] 루나의 Gradle (0) | 2023.03.17 |
영상 후기 - [10분 테코톡] 🐝범블비의 MVC Pattern (0) | 2023.03.17 |