본문 바로가기

TIL

ORM 과 JPA

ORM 이란?

Object-Relational Mapping, 객체지향 프로그래밍 언어와 관계형 DB간의 데이터 변환 기법

객체와 관계형 데이터베이스의 테이블을 자동으로 매핑하는 기술 

 

특징

  • 데이터베이스 종류에 관계없이 일관된인터페이스 제공
    • ORM은 인터페이스입니다.
      스프링 입장에서 DB가 MySql인지 Postgresql인지 Oracle인지 알지 못해도 상관 없습니다,
      ORM을 사용한다면, 추상화된 인터페이스를 활용하여 DB의 종류와 상관없이 코드 작서을 할 수있습니다. 
  • 개발자가 직접 SQL을 작성하지 않고도 데이터베이스 조작 가능( SQL을 작성하지 않고 자바코드로 데이터베이스를 조작할 수 있다.)

ORM을 사용한 패러다임 불일치 해결

관계형 데이터베이스의 테이블 기반 구조 객체지향 프로그래밍의 객체 기반 구조 간의 패러다임 차이.

 

관계형 데이터베이스의 테이블 기반 구조

Movie 테이블

id title
1 파묘
2 황해

MovieReview 테이블

id content movie_id
1 파묘 엄청 재밌어요! 1
2 파묘 또 보러 갈거임ㅋㅋ 1

데이터 베이스 한칸에 객체 , 리스트 등이 들어갈수 없다.

이런 식의 테이블은 불가능! >>>>

id title
1 파묘, 황해, 범죄도시
2 기생충, 히말라야, 독전, 명량, 괴물

 

객체지향 프로그래밍의 객체 기반 구조

public class Movie {
    private Long id;
    private String title;
    private List<MovieReview> movieReviews;
}
public class MovieReview {
    private Long id;
    private String content;
    private Movie movie;
}

필드값에 리스트, 객체 형식이 들어갈 수 있다!

 

데이터베이스의 데이터(한 칸)에는 String 혹은 Integer 같은 단일 값만 넣을 수 있습니다.

하지만, 자바 코드에서는 데이터(필드 값)에 객체나 리스트까지도 모두 넣을 수 있습니다.

이게 바로 대표적인 패러다임의 불일치입니다

 

이 외에 데이터 타입, 데이터 관계 표현 방식 등 애초에 DB와 Java는 다르기 때문에 모든 것이 어긋나게 되는데 이를 ORM이 중간에 interface로 존재하여 여러 패러다임의 불일치를 해결해줍니다.

 

따라서 ORM을 사용한다면, DB를 마치 자바의 일부인 것처럼 편하게 자바 코드로 다룰 수 있게 됩니다.

 

JPA

JPA란 객체지향 프로그래밍과 관계형 DB간의 패러다임 불일치 문제를 해결 하고, DB작업을 객체 지향적으로 할 수 있도록 지원해주는 ORM이다,SQL을 직접 작성하지 않고도 객체 조작을 통해 DB작업을 수행할 수 있도록 표준화된 인터페이스를 제공한다.

 

만약 JDBC를 이용해서 개발을한다면 아래와 같은 복잡한 로직을 사용해야 할 것입니다 

// JDBC
public class UserDaoJdbc {

    public User findByName(String name) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        User user = null;

        try {
            conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/hello", "user", "password");

            String sql = "SELECT id, name, email, age FROM users WHERE name = ?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, name);
            rs = pstmt.executeQuery();

            if (rs.next()) {
                user = new User();
                user.setId(rs.getLong("id"));
                user.setName(rs.getString("name"));
                user.setEmail(rs.getString("email"));
                user.setAge(rs.getInt("age"));
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) rs.close();
                if (pstmt != null) pstmt.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return user;
    }
}

*JDBC : 자바 프로그램에서 데이터베이스에 접속하고 SQL문을 실행하기 위한 도구.

 

하지만 JPA로 코드를 작성할 경우

public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByName(String name);
}

이렇게 훨씬 간단하고 사용하기 편한 것을 확인 할 수 있습니다.

 

JPA는 인터페이스 입니다, 그럼 그 구현체는 무엇일까요? 보통 Hibernate 라는 것을 사용합니다.

즉 Hibernate는 구현체이므로 Hibernate 설정(=방언, dialect)을 통해 어떤 RDBMS를 사용할지 결정할 수 있습니다.

'TIL' 카테고리의 다른 글

github - 협업준비하기.  (0) 2026.02.15
SOLID 원칙  (1) 2026.02.06
개발자 대화법  (0) 2026.02.03
데이터베이스  (0) 2026.01.30
인덱스가 많아지면 수정 삽입등 성능에 영향이 미치는 이유  (0) 2026.01.30