[Spring] JPA 이해하기

2025. 7. 22. 23:15·backend/Java

📌Java와 데이터베이스를 연동하는 다양한 방법들

우선 Java에서는 데이터베이스와 연동할 수 있는 다양한 방법들이 있는데 간략하게 정리해 보겠다.

: JDBC, MYBatis, Spring JDBC Template, JPA(Hibernate).. 등

  • JDBC
    • Java에서 가장 기본적인 DB 연결 방식. 
    • 드라이버 로드 → DB 연결 → SQL 작성 및 실행 → 결과 처리 → 자원 정리(close) 
    • SQL을 직접 작성하고 Connection, PreparedStatement, ResultSet 등을 이용해서 데이터를 처리.
    • 장점 : 단순하고, SQL을 직접 제어 가능하기 때문에 세세한 조작이 가능.
    • 단점 : 반복 코드 많고, 유지보수 어려움.

  • MyBatis(SQL Mapper Framework)
    • JDBC로 처리하는 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 대신해 준다. 
    • Mapper 인터페이스 작성 → Mapper에 SQL 작성(@Select, XML 등) → MyBatis가 SQL 실행 + DTO 매핑
    • SQL은 직접 작성하지만, Java 객체와 매핑해 주는 프레임워크.
    • 장점 : JDBC보다 편하고, ORM 보다 유연함.
    • 단점: SQL을 직접 작성해야 하므로 코드량이 늘어날 수 있다.

  • Spring JDBC Template
    • Spring이 JDBC코드를 자동화해 준 것.
    • 자원 정리(close), 예외 처리, 반복 제거를 알아서 해줌.
    • JdbcTemplate 객체 생성(스프링이 해줌) → query(), update() 등으로 SQL 실행 → 결과는 RowMapper로 매핑 

📌JPA란?

JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준이다.

여기서 ORM이란 Object-Relational Mapping의 약자로, 객체 지향 프로그래밍 언어에서 사용하는 객체와 관계형 데이터베이스의 테이블을 연결해 주는 기술이다. 

 

✔️ 왜 JPA를 사용하는가?

데이터베이스에 데이터를 저장하거나 가져오는 작업을 할 때, 기존의 방법들은 직접 SQL 쿼리를 작성해야 했다.

이를 보완하기 위해 사용하는 것이 바로 JPA이다.

JPA는 복잡한 SQL 쿼리를 직접 작성하지 않고 자바 객체를 사용해 간단히 처리할 수 있게 해 준다. 

예를 들어. MyBoard라는 클래스가 있다고 가정했을 때, JPA를 사용하면 이 클래스의 객체를 데이터베이스에 바로 저장하거나, 데이터베이스에서 데이터를 가져와 객체로 변환할 수도 있다. 물론, SQL 쿼리를 직접 작성하지 않는다!

 

✔️  Spring에서 JPA 사용하기 전 설정

먼저 Spring에서 JPA를 사용하기 위해서는 application.properties에 설정을 해줘야 한다. 

수업에서 Hibernate를 사용하기 때문에 아래와 같은 설정을 해준다. 

Hibernate는 JPA의 구현체 중 하나이다. JPA는 인터페이스이기 때문에 구현이 필요하다. 

Hibernate는 성능과 기능이 안정적이기 때문에 가장 널리 쓰이는 JPA 구현체이다. 

참고로, JPA Hibernate에서 SQL 쿼리를 쓰지 않는다고 해서 JDBC API를 사용하지 않는 것은 아니다. 

Hibernate 내부에서 JDBC로 DB와 통신한다. 

 

📌Entity 

JPA를 사용하면 Entity 클래스가 필요하다. Entity는 자바 객체와 데이터베이스의 테이블을 연결해 주는 역할을 한다.

엔티티는 간단하게 말하면 DB의 테이블과 1:1로 매핑되는 자바 클래스이다. 좀 더 자세하게 말하면 엔티티는 DB에 저장될 데이터를 담는 자바 객체이다. 엔티티 객체 하나가 DB의 테이블 행(Row) 하나를 의미한다. 

✔DTO와 차이점?

엔티티는 DB 테이블과 직접 연결되고 연동된다. 

DTO는 단순 데이터 전달용으로 DB와 연동되지 않는다. 

Entity 클래스는 위와 같이 생겼는데 이전에 사용했던 dto 클래스와 동일하게 생겼다. 

기본생성자, 매개변수 생성자, Getter/Setter는 생략한 코드이다. 

@Entity

     이 클래스를 JPA 엔티티로 지정한다.

     DB 테이블과 매핑됨.

@Table

     Entity 클래스의 이름을 데이터베이스의 테이블이름과 동일하게 작성할 경우 @Table은 작성하지 않아도 된다.

위의 경우와 같이 동일하게 작성하지 않았을 때는 @Table(name="테이블명")으로 작성하여 어떤 테이블에 연결할지 명시해줘야 한다.

@Id / @GeneratedValue

    @Id: 기본키 필드를 지정하고, @GeneratedValue : 어떻게 그 기본키를 생성할지 전략을 지정(AUTO, IDENTITY, SEQUENCT 등)

@Column

    DB 컬럼과 자바 필드를 매핑한다.

    updatable=false :  update 구문에서는 이 필드는 제외되며, insert는 가능하다.

 

📌JpaRepository

JPA에서는 데이터베이스와 연결되는 Repository(DAO) 인터페이스를 만들 때 JpaRepository를 상속한다.

JpaRepository를 상속하면 CRUD 기능을 갖춘 DAO가 자동으로 만들어진다. 

CRUD를 할 수 있는 메서드들은 대표적으로 findAll(), save(), findById(), delete()가 있고, 이 메서드를 사용함으로써 SQL을 직접 작성하지 않아도 된다.

맨윗줄을 살펴보면 <JpaEntity, Integer>로 두 개의 타입을 지정하는데, 이는 현재 이 DAO가 다룰 Entity 클래스와 @Id(기본키)의 타입을 작성해 준다. 여기서는 JpaDao가 다룰 Entity는 JpaEntity클래스이고, 이 엔티티의 기본키는 Integer타입이라는 의미이다.

이해하기 쉽도록 컨트롤러에서 JpaDao를 호출하여 CRUD 하는 과정을 코드를 통해 살펴보자. 아래는 컨트롤러의 코드 일부를 가져온 것이다. 

1) : findAll()

이때 findAll()은 JpaRepository에서 기본으로 제공하는 메서드로, 모든 엔티티를 조회할 때 사용된다.

명시적으로 작성하지 않아도 되지만 위 1)에서는 명시적으로 작성해 주었다.

2) : findByMyno(int myno)

    findBy필드명 형태로 작성하면, spring data JPA가 자동으로 해당 필드로 조회하는 JPQL을 생성해 준다. 

    JPQL 이란? JPA에서 사용하는 객체 지향 쿼리 언어로, SQL과 비슷하게 생겼지만, 테이블이 아니라 엔티티를 대상으로 작동한      다. 테이블 대신 클래스, 컬럼 대신 필드명을 사용한다.

    단, 주의할 점은 findBy필드명에서 필드명이 JpaEntity 안에 반드시 존재해야 한다. → 필드명이 존재하지 않으면 에러 발생.

    위의 예시에서는 myno라는 필드가 JpaEntity안에 반드시 존재해야 한다는 뜻이다.

3) : save()

save는 엔티티를 저장(insert)하거나 수정(update)할 때 사용하는 기본 메서드이다.

새로운 엔티티를 넘기면 (Id가 존재하지 않을 때)  → insert

이미 존재하는 엔티티(동일한 Id가 DB에 존재)  →  update

결론: 기본키(Id)를 기준으로 있으면 수정하고 없으면 새로 저장!

4) :  @Transactional 

    delete 작업은 변경이기 때문에 트랜잭션 안에서 실행되어한다.

5) : JPQL 직접 작성

    위의 1)~3)까지는 개발자가 JPQL문을 작성하지 않고 CRUD를 진행하는 방법이었고 다음은 개발자가 직접 JPQL문을 작성하여 실행하는 방법이다.

   @Modifiying : 이 메서드가 데이터 변경 작업(insert, update, delete)을 수행한다는 것을 의미

   @Query : 직접 작성한 JPQL 쿼리, :myno는 파라미터 이름을 의미한다.

   @Param("myno") int myno : int myno를 param myno로 넘겨주고 위 JPQL 쿼리의 :myno에 해당 값을 바인딩한다. 

 


Java와 데이터베이스를 연동하는 방법이 여러 개여서 구분하기가 어려웠다.

그래서 이 블로그를 작성하면서 각각의 방식들을 정리하고 비교해 보면서 훨씬 더 명확하게 이해할 수 있었다.

많이 사용해보지 않은 Spring JDBC Template은 앞으로 더 연습해 볼 계획이고, 실무에서 자주 사용하는 MyBatis와 JPA를 헷갈리지 않도록 꾸준히 복습해야겠다.

MyBatis와 JPA 덕분에 많은 작업들이 자동화되어 있지만, 이 모든 기술들의 기반에는 결국 JDBC API가 있다는 점을 항상 기억해야겠다. 자동화된 도구를 배우고 사용할수록 내부 흐름과 작동 방식을 정확히 이해하는 것이 중요하다고 느낀다.

앞으로 어떻게 흐름이 이어지고 동작하는지 생각하면서 코드를 작성해야겠다.

 

'backend > Java' 카테고리의 다른 글

스레드 이해하기 - 자바 (JAVA)  (1) 2025.08.26
[자바] - 컬렉션  (7) 2025.08.19
[Spring] MVC 요청 처리 과정 이해하기  (0) 2025.07.22
[Spring] AOP(관점 지향 프로그래밍) 이해하기  (0) 2025.07.15
[Spring] Annotation (어노테이션) 이해하기  (1) 2025.07.08
'backend/Java' 카테고리의 다른 글
  • 스레드 이해하기 - 자바 (JAVA)
  • [자바] - 컬렉션
  • [Spring] MVC 요청 처리 과정 이해하기
  • [Spring] AOP(관점 지향 프로그래밍) 이해하기
eun_log
eun_log
  • eun_log
    개발은
    eun_log
  • 전체
    오늘
    어제
    • 분류 전체보기 (75)
      • 코테 (17)
      • CS (6)
        • 자료구조, 알고리즘 (3)
        • 네트워크 (0)
        • 데이터베이스 (2)
        • 운영체제 (0)
      • frontend (32)
        • JavaScript (29)
        • html&css (1)
        • project_study (2)
      • backend (15)
        • Java (15)
      • project (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
eun_log
[Spring] JPA 이해하기
상단으로

티스토리툴바