Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

햄발

Blog 프로젝트 만들기(JPA) - 스프링 부트 DB 접근 기술 ORM 본문

Spring boot

Blog 프로젝트 만들기(JPA) - 스프링 부트 DB 접근 기술 ORM

햄발자 2024. 9. 30. 15:30

 

 

ORM (Object-Relational-Mapping)

자바의 객체와 데이터 베이스를 연결하는 프로그래밍 기법입니다.

예를 들어, RDBMS 에 name 과 grade 라는 컬럼에 각각 '고길동' 과 '3' 이라는 값이 들어있다고 생각해봅시다! 

이 값을 자바코드에서 사용하기 위해선, JDBC API 를 포함한 다양한 설정과 사전지식이 필요합니다.

또한 , SQL 에 대한 공부도 필수적입니다.

 

하지만 ORM 을 사용한다면 데이터 베이스에 존재하는 값들을 마치 자바객체처럼 사용할수 있습니다 !

 

곧, SQL 을 전혀 몰라고  자바 언어로만 데이터베이스에 접근하여 값을 받아와 사용할수 있다는것입니다.
즉, 객체와 데이터 베이스를 자바언어로만 다룰수 있게 하는 기술이 바로 ORM 입니다.

 

물론 이 기술은 자바뿐만 아닌 , 다양한 언어에서도 제공됩니다.

 

 

 

 

 

ORM 기술의 장단점

 

장점

  • SQL 을 직접 작성하지않고 사용하는 언어로 데이터 베이스에 접근 가능하다.
    • ORM 을 사용하면 SQL 쿼리문을 직접 작성할 필요없이 , 자바와 같은 프로그래밍 언어를 통해 데이터베이스 작업을 수행할 수 있습니다. 이는 개발 생산성을 높이고 코드의 가독성을 향상시킵니다.
  • 객체 지향적으로 코드를 작성할 수 있기 때문에 비즈니스 로직에만 집중할 수 있다.
    • ORM 은 데이터베이스 작업을 객체지향 프로그래밍(OOP) 방식으로 처리가능하게 해줘서, 개발자는 비즈니스 로직에만 집중할 수 있습니다. 데이터베이스 작업이 애플리케이션의 다른부분과 자연스럽게 통합됩니다.
  • 데이터 베이스 시스템이 추상화 되어있기에 방언(MySQL , Oracle ..etc) 전환을 한다고 해도 추가 작업이 거의 없다.
    • ORM 은 데이터 베이스의 독립성을 제공하며, MySQL , Oracle 등과 같은 다른 데이터베이스로 변경할때 추가 작업이 최소화 됩니다. 이는 데이터베이스간 이식성을 높여줍니다. 
  • 맵핑하는 정보가 명확하기에 ERD 에대한 의존도를 낮출 수 있고, 유지보수에 유리한 점이 많다.
    • ORM 은 클래스와 테이블간의 맵핑정보를 명확하게 정의 가능하여,  데이터베이스의 ERD(엔티티 관계다이어그램) 에 대한 의존도를 낮추고, 코드 변경에 유연하게 대응 가능합니다.

 

 

단점

  • 프로젝트의 복잡성이 커질수록 사용 난이도가 올라간다.
    • 프로젝트가 복잡해질수록  ORM 설정과 사용이 어려워질수 있습니다.
    • 복잡한 데이터 모델링과 성능 튜닝이 필요할때 ORM 사용이 복잡해집니다.
  • 복잡하고 무거운 쿼리는 ORM 으로 해결이 불가능한 경우가 높다! 
    • ORM 은 단순한 CRUD 작업에는 적합하다. 하지만 복잡한 JOIN이나 성능이 중요한 쿼리문에는 한계가 있을수있습니다. 이러한 경우엔, SQL 을 작성하는것디 더 효율적입니다.

 

 

모델 클래스에서 어노테이션 사용 예시

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;

    // 기본 생성자
    public User() {}

    // 생성자
    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }
    
}