반응형

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

반응형

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


반응형

'Spring > Spring JPA' 카테고리의 다른 글

[Spring JPA #6] JPA Cascade  (0) 2019.01.27
[Spring JPA #5] JPA 엔티티 상태  (0) 2019.01.27
[Spring JPA #4] JPA 관계 매핑  (0) 2019.01.27
[Spring JPA #2] JPA 엔티티 매핑  (0) 2019.01.27
[Spring JPA #1] JPA 시작 및 세팅하기  (0) 2019.01.26

이 글을 공유하기

댓글

Designed by JB FACTORY