본문 바로가기
SpringBoot

[SpringBoot]JPA

by 근근커 2022. 11. 5.
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

댓글