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

2021. 3. 25. 02:34 Spring Data/Spring Data 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 Framework/Spring boot2] - [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



출처: https://engkimbs.tistory.com/811?category=772527 [새로비]