티스토리 뷰

Spring/Spring boot

[Springboot]JPA란?

Xion 2020. 2. 6. 02:06

 

|등장

웹 서비스를 개발하고 운영하다 보면 피할 수 없는 문제가 데이터베이스를 다루는 일 입니다.

 

MyBatis와 같은 SQL mapper를 이용하여 쿼리를 작성한다면 ,실제로, 개발하는 시간보다 SQL을 다루는 시간이 더 많았습니다.

 

이러한 문제의 해결책으로 JPA라는 자바 표준ORM(Object Relational Mapping)이 등장합니다.

*MyBatis , iBatis는 ORM이 아닙니다 (SQL Mapper입니다.) (SQL Mapper는 쿼리를 매핑합니다.)

*ORM은 객체를 매핑하는 것입니다.

 

|소개

웹 애플리케이션에 관계형 데이터베이스(RDB , RelationalDatabase)는 빠질 수 없는 요소입니다.

중요한것은 객체를 관계형 데이터 베이스에서 관리하는 것이 무엇보다 중요합니다.

현재 프로젝트 대부분이 애플리케이션 코드보다 SQL로 가득하게 된 이유는

1.관계형 데이터베이스가 SQL만 인식이 가능하다.(단순 반복적인 코드들)

2.패러다임의 불일치

 -RDB,즉 관계형 데이터베이스는 어떻게 데이터를 저장할지에 초점이 맞춰진 기술인데, 객체지향 프로그래밍 언어는 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술입니다.

 

자, 그럼 관계형 데이터베이스로 객체 지향을 표현할 수 있을까?

 

-쉽지 않습니다.

 

객체를 DB에 저장하려 하니 여러 문제가 발생하는데 이를 패러다임 불일치라 합니다.

한 예로,

User user = findUser();
Group group = user.getGrop();

User 와 Group은 부모-자식 관계입니다. 

여기에 DB가 추가된다면,

User user = userDao.findUser();
Group group = groupDao.findGrop(user.getGropId());

이런식으로 표현이됩니다.

User와 Grop이 어떤 관계일까요?

상속,1:N등 다양한 객체 모델링을 DB로는 구현이 불가능합니다.

그러다보니 웹 애플리케이션 개발은 점점 DB모델링에만 포커싱이 되기 시작합니다.

JPA는 이런 문제점을 해결하기 위해 등장합니다.

|JPA

-JPA란 중간에서 패러다임을 일치시켜주기 위한 기술입니다.

개발자는 객체지향적으로 프로그래밍을 하고 , JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행합니다

즉,더는 SQL에 종속적이지 않다는 말입니다.

JPA를 구현하기위해선 구현체가 필요한데, 구현체들을 좀 더 쉽게 사용하고자 추상화시킨 Spring Data JPA라는 모듈을 이용하여 다룹니다.

관계로 표현하자면 다음과 같습니다. 

JPA ← Hibernate ← Spring Data JPA

 

스프링에서는 Spring Data JPA를 권장하고 있는데 이유는 구현체 교체의 용이성저장소 교체의 용이성 때문입니다.

즉,관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함입니다.

ex) MongoDB로 교체가 필요하다면, SpringDataJPA를 SpringDataMongDB로 의존성만 교체하면 됩니다.

|사용하는이유 ?

-객체중심으로 개발해서 유지보수가 쉽다.

-규모가 크고 365일 대규모 트래픽과 데이터를 가진 서비스에 알맞다.

|그럼에도 사용하지 않는 이유는?

-높은 러닝커브를 이야기합니다.

객체지향 프로그래밍과 관계형 DB를 둘 다 이해해야 합니다.

 

|JPA에서 제공하는 어노테이션

@Entity

-테이블과 링크될 클래스임을 나타냅니다.

-기본값으로 클래스의 카멜케이스 이름을 언더스코어 네이밍(_)으로 테이블 이름을 매칭합니다.

ex)SalesMan.java->sales_man table

 

@Id

-해당 테이블의 PK 필드를 나타냅니다.

 

@GeneratedValue

-PK의 생성 규칙을 나타냅니다.

-스프링 부트2.0에서는 GenerationType.IDENTITY옵션을 추가해야만 auto_increment가 됩니다.

 

@Column

-테이블의 칼럼을 나타내며 굳이 선언하지 않더라도 해당 클래스의 필드는 모두 칼럼이 됩니다.

-그럼에도 사용하는 이유는 기본값 외에 추가로 변경이 필요한 옵션이 있으면 사용합니다.

ex) VARCHAR(255)가 기본값이라면, 사이즈를 400으로 늘리고 싶거나 ex:title타입을 text로 변경하고 싶거나 이럴 경우에 사용됩니다.