스프링 부트 @Entity 관계설정 생성하기


  1. pom.xml
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
  1. application.properties 파일의 내용을 수정한다.
spring.datasource.url=jdbc:mysql://localhost:3306/connectdb?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=connect
spring.datasource.password=connect
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.initialization-mode: always

spring.jpa.hibernate.ddl-auto= create-drop

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

spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
spring.datasource.initialization-mode: always

위의 설정은 data.sql 을 자동실행 한다.

spring.jpa.hibernate.ddl-auto= create-drop 테이블이 자동생성, 삭제

spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect Hibernate 가 MySQL을 위한 SQL 생성하도록 한다.

  1. data.sql (sample 데이터)
insert into roles (id, name) values (1, 'USER');
insert into roles (id, name) values (2, 'ADMIN');

insert into account (id, create_date, email, name, nick_name, passwd)
 values(1, now(), 'urstory@gmail.com', 'kim', 'toto', '1234');

insert into account (id, create_date, email, name, nick_name, passwd)
 values(2, now(), 'carami@gmail.com', 'kang', 'carami', '1234');

insert into account_roles(account_id, role_id) values( 1, 1);
insert into account_roles(account_id, role_id) values( 2, 1);
insert into account_roles(account_id, role_id) values( 1, 2);
  1. domain 패키지에 Entity 클래스를 만들었다.
    • 관계에 대하여 그림으로 그린다.

    • 클래스를 작성

    • 필드를 선언

    • 관계 필드를 선언

    • 생성자를 작성 (날짜, 컬렉션 프레임워크 관련된 필드를 초기화)

    • @Entity, @Table, @Setter, @Getter 추가

    • 식별자 관련된 필드 선언

       - @Id  
       - @GeneratedValue(strategy = GenerationType.IDENTITY) // 자동증가.  
       - private Long id;  
      
  2. @Column @OneToOne @OneToMany @ManyToOne @ManyToMany 를 알맞게 설정

  3. 애플리케이션을 실행하면, 원하는대로 테이블이 생성되었는지 확인한다.

  4. 엔티티를 이용하여 CRUD작업을 하려면 Repository를 만든다.
    JpaRepository<엔티티클래스명, Id타입명> 을 상속받도록 한다.
    Spring은 위의 Repository를 구현하는 빈을 자동생성한다.
import my.examples.blog.domain.Role;
import org.springframework.data.jpa.repository.JpaRepository;

public interface RoleRepository extends JpaRepository<Role, Long> {
}
  1. Repository를 사용하는 Service객체를 만든다.
import my.examples.blog.domain.Role;
import my.examples.blog.repository.RoleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class RoleService {
    @Autowired
    RoleRepository roleRepository;

    @Transactional
    public void addRole(Role role) {
        Role result = roleRepository.save(role);
        System.out.println(result.getId() + ", " + result.getName());
    }
}
  1. ervice를 사용하는 Controller를 만든다.
import my.examples.blog.domain.Role;
import my.examples.blog.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class RoleController {
    @Autowired
    RoleService roleService;

    @GetMapping("/roleform")
    public String roleform(){
        return "roleform";
    }

    @PostMapping("/rolesave")
    public String rolesave(@RequestParam(name = "name")String name){
        Role role = new Role();
        role.setName(name);
        roleService.addRole(role);
        return "redirect:/roleform";
    }
}

객체와 테이블의 맵핑


  • FK 위치

​ @JoinColumn(name =“~~~”)

  • Fk 설정

*1:1 의 관계는 fk 아무곳에나 둬도 ok

@OneToOne

  • 원하는곳에 @JoinColumn

*보통 1: 는 *쪽에 위치

@OneToMany(mappedBy = “”)

@ManyToOne

  • 여기에 @JoinColumn.

**테이블과 테이블은 다대다 관계(:*) 가 없다.

그래서 다대다 관계를 해주려면 관계테이블이 그 사이에 존재해야한다.

EX) a,b가 다대다라면?

a. ————* c *————— b

c

            a_id

            b_id 

@ManyToMany

@JoinTable(name = “~~”)


  • mappedBy

테이블은 외래키 하나로 두 테이블의 연관관계를 관리하는데 엔티티를 단방향으로 매핑하면 참조를 하나만 사용하고, 양방향 관계로 설정하면 객체의 참조는 양쪽에서 하나씩 둘인데, 외래 키는 하나이므로 두 엔티티 중 하나(OWNER)를 정해서 테이블의 외래키를 관리해야 하고 MANY쪽이 OWNER 이며 mappedBy는 @OneToMany쪽의 컬렉션 칼럼에 기술하여 OWNER가 아님을 정의한다.

mappdBy는 @OneToOne, @OneToMany, @ManyToMany 어노테이션에서 사용할 수 있으며 mappedBy가 없으면 JAP에서 양뱡향 관계라는 것을 모르고 두 엔티티의 매핑 테이블을 생성한다.

mappedBy는 OWBER 엔티티의 필드나 속성과 대응된다.

ManyToOne 양방향 관계에서 Many측에는 mappedBy요소를 사용할 수 없다.(MANY 쪽이 OWNER)

OneToOne 양방향 관계에서 OWNER는 반대쪽(INVERSE SIDE)에 대한 FK를 가지는 쪽이다.

ManyToMany 양방향 관계는 양쪽 중 아무나 OWNER가 될 수 있다.