반응형

[Spring JPA #1] JPA 시작 및 세팅하기

반응형

| JPA(Java Persistent API)


  • JPA(Java Persistent API)는 자바의 영속성 관리와 ORM을 위한 표준 기술입니다. 기존 EJB ORM이던 Entity Bean을 JPA라 바꿔 체계화한 기술이죠.
  • ORM(Object Relational Mapping)이란 RDB 테이블을 객체지향적으로 사용하기 위한 기술입니다. 객체와 RDB의 테이블을 매핑하여 자바 프로그램 코드상에서 RDB를 객체지향적으로 쓸 수 있게 고려한 기술이라고 생각하면 될 것입니다.
  • 이 JPA를 Spring에서 쉽게 쓸 수 있도록 한 것이 Spring Data JPA입니다.


장점 

  • 객체 지향적으로 데이터를 관리하기 때문에 비즈니스 로직에 집중할 수 있으며, 객체지향 개발이 가능
  • 여러 RDBMS 벤더마다 다른 쿼리문을 일일히 고려하지 않고 하나의 비즈니스 로직을 소스 코드 상에서 제대로 구현하면 어떤 RDB에서도 해당 로직을 따로 수정할 필요 없이 적용할 수 있음


단점

  • 학습 비용이 많이 든다. 즉 어렵다.
  • 제대로 사용하지 않을 시 성능 문제가 발생하며, 데이터 손실이 발생할 수 있다.


| JPA 세팅


postgresql 도커 구동

[Spring/Spring Boot] - [Spring Boot #23] 스프링 부트 PostgreSQL 연동하기


프로젝트 구조

├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │   └── tutorial
│   │   │   └── springbootjpa
│   │   │   ├── Account.java
│   │   │   ├── JpaRunner.java
│   │   │   └── SpringBootJpaApplication.java
│   │   └── resources
│   │   ├── application.properties
│   │   ├── static
│   │   └── templates


의존성 관리

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>


application.properties

spring.datasource.url=jdbc:postgresql://localhost:5432/springboot
spring.datasource.username=saelobi
spring.datasource.password=pass

spring.jpa.hibernate.ddl-auto=create
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
  • postgresql 관련 설정 정보를 입력합니다.
  • spring.jpa.hibernate.ddl-auto는 JPA를 통해 DBMS에 쿼리를 날릴 경우 DBMS 상에서 이 쿼리가 실행되는 테이블이 드랍되었다가 새로 생성되며 쿼리가 실행된다는 것을 의미합니다.
  • spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation 은 createLob()을 구현하지 않았다는 경고메세지를 나오지 않게 설정하는 설정 정보입니다.


소스 코드

@SpringBootApplication
public class SpringBootJpaApplication {

public static void main(String[] args) {
SpringApplication.run(SpringBootJpaApplication.class, args);
}

}
@Entity
public class Account {

@Id
@GeneratedValue
private Long id;

private String username;

private String password;

private String email;

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}
}
  • @Entity는 특정 DB Table과 매핑되는 클래스를 의미합니다. 
  • @Id는 DB Table에서 ID column에 해당되는 필드입니다. @GeneratedValue를 통해서 auto_increment에 대응하는 정보를 나타냅니다.


@Component
@Transactional
public class JpaRunner implements ApplicationRunner {

@PersistenceContext
EntityManager entityManager;

@Override
public void run(ApplicationArguments args) throws Exception {
Account account = new Account();
account.setUsername("saelobi");
account.setPassword("jpa");

entityManager.persist(account);
}
}
  • @Transational은 트랜잭션 속성을 클래스 내의 모든 메서드에게 부여하는 어노테이션입니다.
  • EntityManager 인터페이스는 JPA의 핵심이며 이 인터페이스의 구현체를 통해서 DB와 자바 객체 사이의 데이터 교환이 이루어집니다.


결과화면

springboot=# select * from account;
id | password | username
----+----------+----------
1 | jpa | saelobi


https://www.inflearn.com/course/스프링-데이터-jpa


반응형

이 글을 공유하기

댓글

Designed by JB FACTORY