애플리케이션에서 아래 형태의 객체 데이터를 DB에 저장해서 관리해야 한다면 어떻게 해야할까요?
public class Memo {
private Long id;
private String username;
private String contents;
}
1. DB테이블 만들기
create table memo (
id bigint not null auto_increment,
contents varchar(500) not null,
username varchar(255) not null,
primary key (id)
);
2. 애플리케이션에서 SQL 작성
String sql = "INSERT INTO memo (username, contents) VALUES (?, ?)";
String sql = "SELECT * FROM memo";
3. SQL을 JDBC를 사용해서 직접 실행
jdbcTemplate.update(sql, "Robbie", "오늘 하루도 화이팅!");
jdbcTemplate.query(sql, ...);
4. SQL 결과를 객체로 직접 만들기
@Override
public MemoResponseDto mapRow(ResultSet rs, int rowNum) throws SQLException {
// SQL 의 결과로 받아온 Memo 데이터들을 MemoResponseDto 타입으로 변환해줄 메서드
Long id = rs.getLong("id");
String username = rs.getString("username");
String contents = rs.getString("contents");
return new MemoResponseDto(id, username, contents);
}
만약 이 상태에서 '패스워드'라고 하는 컬럼을 하나 추가한다면 어떻게 될까요? 바로 전체 코드를 수정해줘야 합니다. 즉, SQL에 의존적인 상태가 됩니다.
ORM 이란?
ORM이란 Object Relational Mapping의 줄임말로 객체-관계 매핑을 의미합니다. 객체 즉, 자바의 클래스와 DB의 테이블을 직접 매핑하려면 앞서 살펴본 것처럼 매우 번거롭고 많은 작업들이 필요했지만 ORM을 사용하면 이를 자동으로 처리해 줍니다.
JPA란?
JPA는 Java Persistence API의 약자로 Java ORM 기술의 대표적인 표준 명세 입니다. 즉, JPA는 실제로 동작하는 것이 아니고 어떻게 동작해야 하는지 메커니즘을 정리한 표준 명세 입니다.
JPA는 내부적으로 JDBC를 사용합니다. 개발자가 직접 JDBC를 구현하면 SQL에 의존하게 되는 문제 등이 있어 개발의 효율성이 떨어지는데, JPA는 이 같은 문제점을 보완해서 개발자 대신 적절한 SQL을 생성하고 데이터베이스를 조작해서 객체를 자동 매핑하는 역할을 수행합니다.
JPA 기반의 구현체는 대표적으로 세가지가 있습니다. 하이버네이트(Hibernate), 이클립스 링크(EclipseLink), 데이터 뉴클리어스(DataNucleus) 이며, 이 중 가장 많이 사용되는 구현체가 하이버네이트 입니다.
Hibernate 란?
JPA는 표준 명세이고, 이를 실제 구현한 프레임워크 중 사실상 표준이 하이버네이트 입니다. SpringBoot에서는 기본적으로 하이버네이트 구현체를 사용 중입니다.
Spring Data JPA
Spring Data JPA는 JPA를 편리하게 사용할 수 있도록 지원하는 스프링 하위 프로젝트 중 하나 입니다. Spring Data JPA는 CRUD 처리에 필요한 인터페이스를 제공하며, 하이버네이트의 엔티티 매니저(EntityManager)를 직접 다루지 않고 리포지토리를 정의해 사용함으로써 스프링이 적합한 쿼리를 동적으로 생성하는 방식으로 데이터베이스를 조작합니다. 하이버네이트에서 자주 사용되는 기능을 더 쉽게 사용할 수 있게 구현한 라이브러리 입니다.
'Spring' 카테고리의 다른 글
[Spring] Spring Security Session 인증 시 401 에러 해결 (0) | 2024.11.24 |
---|---|
[Spring] SpringSecurity 403에러 해결 (0) | 2024.11.20 |
[Spring] IoC(제어의 역전), DI(의존성 주입) 이해하기 (0) | 2024.11.17 |
[Spring] 생성(Creational) 패턴 - 추상 팩토리 (0) | 2024.11.13 |
[Spring] SpringSecurity - JWT (0) | 2024.11.11 |