JPA(Java Persistence API)
- Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
- 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함
ORM(Object-Relational Mapping)
우리가 일반 적으로 알고 있는 애플리케이션 Class와 RDB(Relational DataBase)의 테이블을 매핑(연결)한다는 뜻이며, 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 해주는 것이라고 보면된다.
장점
- SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있음.
(내부적으로는 쿼리를 생성하여 DB를 조작함. 하지만 개발자가 이를 신경 쓰지 않아도됨) - Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높임
- 객체지향적인 코드 작성이 가능하다. 오직 객체지향적 접근만 고려하면 되기때문에 생산성 증가
- 매핑하는 정보가 Class로 명시 되었기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리
- 예를들어 기존 방식에서 MySQL 데이터베이스를 사용하다가 PostgreSQL로 변환한다고 가정해보면, 새로 쿼리를 짜야하는 경우가 생김. 이런 경우에 ORM을 사용한다면 쿼리를 수정할 필요가 없음
단점
- 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있음
- 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있음
- 학습비용이 비쌈
간단한 예제
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true
application.properties에 추가
spring.jpa.hibernate.ddl-auto=create -> 실행시 해당 테이블 DROP 후 새롭게 CREATE
spring.jpa.show-sql=true -> 콘솔에 sql문 띄우기
@Entity
@Getter
@NoArgsConstructor
public class Board {
@Id
@GeneratedValue
private Long bid;
@Column(name="WRITER",length=15)
private String writer;
@Column(name="TITLE",length=15)
private String title;
@Column(name="CONTENT",length=20)
private String content;
@Builder
public Board(String writer, String title, String content) {
super();
this.writer = writer;
this.title = title;
this.content = content;
}
}
entity 클래스 생성
Lombok을 이용하여 getter 추가
entity 클래스는 setter를 가지지 않는다고 함
테이블에서 PK와 매핑되는 변수에 @Id를 추가하여 pk임을 설정
@Repository
public interface BoardRepository extends JpaRepository<Board, Long>{
}
Repository 클래스 생성
JpaRepository를 상속받아서 생성하며 제네릭 안의 값은
앞에는 entity 클래스명, 뒤에는 pk의 자료형이 들어간다.
@Controller
public class TestCtrl {
@Autowired
BoardRepository br;
@ResponseBody
@RequestMapping("/")
public String root() {
return "JPA 테스트";
}
@RequestMapping("a")
public String saveTest(Model model) {
br.save(new Board("홍길동","제목1","내용1"));
br.save(new Board("이순신","제목2","내용2"));
br.save(new Board("임꺽정","제목3","내용3"));
model.addAttribute("datas",br.findAll());
return "a";
}
}
Repository 클래스에 따로 메소드를 명시하지 않았기에 기본 제공되는 save 와 findAll 메소드 사용
실행결과
'SpringBoot' 카테고리의 다른 글
[SpringBoot]JdbcTemplate (0) | 2022.10.27 |
---|---|
[SpringBoot]gradle JSP 연동 (0) | 2022.10.25 |
[SpringBoot]설치 및 설정 (0) | 2022.10.24 |
댓글