[Spring JPA #3] Entity 매핑 및 Value 타입 매핑

2021. 3. 25. 02:55 Spring Data/Spring Data JPA

Entity 매핑 및 Value 타입 매핑

 

프로젝트 구조

├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── tutorial
│   │   │           └── springbootjpa
│   │   │               ├── Account.java
│   │   │               ├── Address.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

spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

 

  • spring.jpa.show-sql=true 는 JPA가 생성하는 SQL문을 콘솔창에 출력하는 옵션입니다.
  • spring.jpa.properties.hibernate.format-sql=true 는 콘솔 창에 출력되는 SQL문을 포맷팅된 형태로 출력할 수 있게 하는 옵션입니다.

 

소스 코드

package com.tutorial.springbootjpa;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootjpaApplication {

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

}}
package com.tutorial.springbootjpa;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;


@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);
    }
}
package com.tutorial.springbootjpa;

import javax.persistence.*;
import java.util.Date;

@Entity(name = "myAccount")
@Table(name = "Account")
public class Account {

    @Id
    @GeneratedValue
    private Long id;

    @Column(nullable=false, unique=true)
    private String username;

    private String password;

    @Temporal(TemporalType.TIMESTAMP)
    private Date created = new Date();

    private String yes;

    @Transient
    private String no;

    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name="street", column = @Column(name="home_street"))
    })
    private Address address;


    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    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(name="myAccount") 어노테이션은 이 클래스가 엔티티 역할을 할 것이라는 부가적인 정보를 제공하는 어노테이션이며 이 엔티티의 이름은 기본적으로 클래스명이며 name=[엔티티명] 으로 다른 이름으로 바꿀 수 있습니다.
  • @Table 어노테이션은 이 엔티티가 어떤 테이블과 매핑될 것인지를 나타내는 어노테이션이며 기본적으로 클래스명과 같은 DBMS 테이블과 매핑됩니다. 다른 테이블과 매핑할 시에는 name=[테이블명] 으로 바꿀 수 있습니다.
  • @Id 는 테이블에서 식별자 역할을 하는 컬럼명과 매핑합니다. 또한 id값을 자동 생성할 시 어떻게 생성할 것인지에 대한 정보를 제공하는 @GeneratedValue를 같이 쓸 수 있습니다.
  • @Column은 멤버 변수가 테이블 컬럼과 매핑됨을 나타내며 기본적으로 @Entity의 모든 멤버 변수는 @Column 어노테이션이 부착된 형태로 제공됩니다.
  • @Temporal은 시간, 날짜 타입을 지정하는 어노테이션입니다. 
  • @Transient는 멤버 변수가 테이블의 어떤 컬럼과 매핑하지 않을 것을 나타내는 어노테이션입니다.
  • @Embedded는 Composite Value 타입을 지정할 때 쓰이는 어노테이션이며 이 Composite Value값은 자바의 클래스 형식으로 작성할 수 있습니다. @AttributeOverride 어노테이션을 통해서 Composite Value 타입의 멤버 변수를 테이블의 어떤 컬럼과 매칭할 지 커스터마이징할 수 있습니다.

 

package com.tutorial.springbootjpa;

import javax.persistence.Embeddable;

@Embeddable
class Address {

    private String street;

    private String city;

    private String state;

    private String zipCode;
}
  • @Embeddable 어노테이션을 통하여 이 클래스가 Composite Value를 나타내는 클래스이며 여기서 정의된 클래스는 위 엔티티의 Composite Value로서 사용될 수 있습니다.

 

결과 화면

springboot=# select * from account;
id | city | state | home_street | zip_code |         created         | password | username | yes
----+------+-------+-------------+----------+-------------------------+----------+----------+-----
1 |      |       |             |          | 2019-01-27 01:06:58.514 | jpa      | saelobi  | 

 

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



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