1일 1개념정리 24.08.09.금 ~
큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.
무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#11. JDBC 발전 과정
드디어 JPA에 대해 정리한다.... 사실 Spring을 떠올리면 제일 먼저 생각나는 단어가 아닐까 싶다. 요즘엔 약간 Spring = JPA라는 느낌도 있는 것 같고 ..... JDBC의 발전 과정을 따라가며 JPA까지 도달해보자.
일단 어제 JDBC에 대해 배웠다.
1일1개 (10) - JDBC
1일 1개념정리 24.08.09.금 ~ 큰 결정에 큰 동기가 따르지 않을 때도 있다. 하지만 큰 결심이 따라야 이뤄낼 수 있다.무조건 무조건 1일 1개의 개념 정리하기 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!#10. JDBCJDBC가 무
100won-developer.tistory.com
근데 이 과정이 매우 번거롭다 ... DB조회만 하고싶었을 뿐인데 JDBC API부터 시작해서 드라이버 설정하고 커넥트하고 다 끝나면 연결끊고 ... 물론 당연히 추상화 해도 이런 과정 있겠지만 문제는 이 과정을 일일이 하느냐 아니면 자동화된 어떤 라이브러리를 쓰느냐 그 차이다 ...
발전 과정부터 이야기하면 이렇다. 외우고 이런 게 아니라 그냥 흐름을 보자는 것이다.
JDBC → JDBCTemplate → JPA → Spring Data JPA
JDBC 단점
일단 JDBC의 단점이 무엇인가 ??
- 수동 SQL 작성 : JDBC에서는 SQL 쿼리를 수동으로 작성하고 실행한다. 모든 CRUD에 대해 직접 SQL을 작성해야 하므로 코드가 길고 복잡하다.
- 반복적인 코드 : DB연결, SQL 실행, 결과 처리, 자원 해제 등의 작업이 반복적이다. 이는 중복이 너무 많고 유지보수가 어렵다. 여기서부터 사실상 JDBC의 자동화/추상화 운명은 정해진 셈이다.
- SQL Injection 공격 위험 : SQL 쿼리를 문자열로 직접 작성할 경우, SQL 주입 공격의 위험이 있다.
- 물론 이는 일반적인 Statement를 사용하거나 사용자 입력을 직접 문자열로 연결할 때의 이야기다. 아래 예제 코드처럼 PreparedStatement를 쓰면 SQL 인젝션 공격의 위험을 줄여준다.
Connection connection = DriverManager.getConnection(url, user, password);
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, userId);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
// 결과 처리
}
resultSet.close();
statement.close();
connection.close();
JDBC Template
JDBC의 반복적인 과정을 첫번째로 추상화한 것이 바로 JDBC Template이다. 이름에서도 알 수 있듯이 템플릿을 만들어놓은 것이다. 이건 Spring에서 제공하는 클래스고, SQL 쿼리에 대한 작업을 간소화해 JDBC를 더 효율적으로 사용하도록 도와준다.
- 반복 코드 제거 : JDBC에서 연결, 해제 등 반복적인 코드를 자동으로 처리해준다.
- 더 간결한 코드 : SQL 쿼리 실행 및 결과 처리 코드가 간결해지고, 가독성이 향상된다.
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT * FROM users WHERE id = ?";
User user = jdbcTemplate.queryForObject(sql, new Object[]{userId}, new UserRowMapper());
이것만 봐도 확실히 간결해졌다 !!! 그러나 여전히 SQL 쿼리를 직접 작성하고있고 복잡한 쿼리나 매핑은 추가적인 설정이 필요하다. 인간의 욕심을 끝이 없어서 이것도 간소화 하고 싶어졌다.
JPA
그래서 등장한 것이 바로 JPA(Java Persistence API)이다. 결국 목적은 같다. 자바에서 DB연결을 위한 기술이다.
- DB작업을 "객체지향적으로" 처리한다.
- EntityManager : JPA는 매우 추상화되어서 기본 CRUD는 SQL 작성조차 필요없다. 물론 이는 복잡하지 않은 경우에만 해당한다. CRUD는 EntityManager를 통해서 수행할 수 있다.
- 객체-관계 매핑(ORM) : JPA는 객체와 DB 테이블 간의 매핑을 자동으로 처리해준다. 그래서 개발자는 SQL을 작성하지 않고, 자바 객체를 사용하여 DB 작업을 수행할 수 있다.
그러나 복잡한 쿼리, 성능 개선 등에서는 여전히 문제가 생길 수 있었다. 이를 도와주는 라이브러리가 등장하는데, 바로 Spring Data JPA이다.
// 엔티티 매니저 사용 예시
@PersistenceContext
private EntityManager entityManager;
public User findUserById(Long id) {
return entityManager.find(User.class, id);
}
Spring Data JPA
Spring Data JPA는 JPA를 기반으로 하여 데이터 액세스 레이어를 더 쉽게 작성할 수 있도록 도와주는 라이브러리이다. JPA를 기반으로 하되, 여기에 Spring의 데이터 접근 기술을 통합한 버전이다.
- Repository 인터페이스 : 데이터를 접근하는 레이어를 더 쉽게 만들어놓아서 Repository의 인터페이스만 정의하면 CRUD가 자동으로 구현된다. 이는 구현클래스 없이도 DB 작업을 할 수 있다는 혁신을 불러온다.
- 메소드 이름 = 쿼리 : 메소드 이름을 통해 쿼리를 자동으로 생성한다. 예를 들어 findByLastName(String lastName)라고 해두면 lastName을 기준으로 데이터를 조회하는 SQL이 자동으로 생성된다.
그럼 이제는 복잡한 쿼리를 다룰 수 있는가 ? 그렇다 .객체지향 쿼리언어인 JPQL (Java Persistence Query Language)을 사용하거나, @Query 어노테이션으로 직접 커스텀 할 수 있다. 그리고 QueryDSL 같은 도구를 함께 사용하면 더욱 강력한 쿼리 작성이 가능하다.
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByLastName(String lastName);
}
정리 - JDBC에서 JPA로의 발전 과정
- JDBC : SQL을 수동으로 작성하고 실행하며, 모든 DB 작업을 직접 처리함. 반복적이고 복잡한 코드가 많다.
- JDBC Template: 반복적인 코드를 줄여주고, DB 작업을 간소화했지만 여전히 SQL은 수동으로 작성해야 함.
- JPA : 객체-관계 매핑(ORM)을 통해 SQL을 직접 작성하지 않고도 DB작업을 할 수 있다. 그리고 기본 CRUD가 자동으로 처리되고 객체 지향적인 DB접근 방식을 제공한다.
- Spring Data JPA : JPA의 기능을 더 간결하게 만들어서 인터페이스 정의만으로도 CRUD가 가능하다. 복잡한 쿼리는 JPQL이나 @Query 어노테이션으로 커스텀할 수 있다
(참고 : spring data jpa는 JPA를 더 편리하게 쓰는 라이브러리이다.)
'1일 1개념정리 (24년 8월~12월) > Spring' 카테고리의 다른 글
1일1개 (14) - ArgsConstructor (0) | 2024.08.22 |
---|---|
1일1개 (12) - @Transactional (0) | 2024.08.20 |
1일1개 (10) - JDBC (0) | 2024.08.18 |
1일1개 (8) - Spring 왜 쓸까 ? (0) | 2024.08.16 |
1일1개 (1) - 웹앱서버랑 웹서버랑 같은 거 아니예요 ? (0) | 2024.08.09 |