[SpringBoot] IntelliJ로 Spring Boot + JPA 프로젝트 시작하기

DAUN JO·2021년 7월 13일
1

Spring

목록 보기
1/6
post-thumbnail

IDEA : IntelliJ 2021.1.3
DB : MySQL 8.0.23

JPA

  • JPA(Java Persistence API)

  • JPA가 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고, 객체를 자동으로 Mapping 해준다

  • ORM(Object-Relational Mapping)
    객체와 관계형 DB를 매핑

  • Hibernate
    ORM 프레임워크
    Hibernate 기반으로 만들어진 ORM 기술 표준이 바로 JPA다.


Setting

build.gradle

implementation("org.springframework.boot:spring-boot-starter-data-jpa")

applications.properties

spring.jpa.hibernate.ddl-auto=update

  • create : 최초에 한번 컬럼이 생성
  • create-drop: create와 같으나 종료시점에 테이블 DROP
  • update : Entity클래스에 있지만 해당 테이블에 존재하지 않는 컬럼을 추가로 생성
  • validate : 엔티티와 테이블이 정상 매핑 되었는지만 확인
  • none : 사용하지 않음



Annotation

@Entity

이 클래스가 DB의 User라는 테이블에 Mapping이 되는 클래스라는 것을 명시
해당 클래스가 DB의 테이블과 1:1 매핑됨

@Table(name="??")

테이블을 의미
어노테이션을 생략하면 클래스의 이름을 테이블의 이름으로 자동 인식

@Id

Entity 빈의 Primary Key를 의미
하나의 Entity에 반드시 하나가 존재해야 한다.
복수키도 설정 가능

@GeneratedValue

데이터베이스에 의해 자동으로 생성된 값

  • AUTO(default) : 자동으로 생성 전략 결정
  • IDENTITY : DB가 기본 키 생성
  • SEQUENCE : DB SEQUENCE를 사용해서 기본 키 할당
  • TABLE : DB에 키 생성 테이블 생성 후 이를 사용하여 기본키를 생성

@Column

해당 멤버 변수와 테이블의 컬럼 매핑
생략 시 필드의 이름이 테이블의 컬럼으로 자동으로 매핑

  • name : 속성(String)
    맵핑할 테이블의 컬럼 이름을 지정
    없다면 멤버변수의 이름 그대로 적용

    CamelCase 로 작성된 컬럼 변수가 있다면 UnderScore 형식으로 name 을 명시적으로 작성

  • nullable : 속성(boolean)
    NULL을 허용할지, 허용하지 않을지 결정

  • length : 속성(int)
    컬럼의 길이값

  • unique : 속성(boolean)
    컬럼이 유일한 값을 가지는지

  • insertable : 속성(boolean)
    엔티티 저장시 선언된 필드도 같이 저장
    default = true

  • updatable : 속성(boolean)
    엔티티 수정시 이 필드를 함께 수정
    defalut = true

@Temporal

java.util.Date와 java.util.Calendar 값 매핑할 때 사용




=> 이 상태에서 Application을 실행하면, applications.properties의 정보들을 활용하여 dataSource라는 타입의 Bean을 만들고 hibernate 자동설정이 동작한다.

즉, JPA를 사용하는데 필요한 Bean들이 모두 자동으로 동작한다.


Entity 연관관계 매핑


UserConference , User 두 개의 Entity가 다음과 같이 1:N 관계로 매칭되어 있고

UserConferenceUser Entity의 id 컬럼을 Reference 할 때,

JPA Entity 안에서 @Annotation으로 외래키 관계를 구현한다.

@ManyToOne, @JoinColumn()

@Entity
@Getter
@Setter
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String position;
    private String department;

    ......
}
@Entity
@Getter
@Setter
public class UserConference {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @ManyToOne
  @JoinColumn(name="Conference_ID", referencedColumnName = "ID")
  private Conference conferenceId;

  @ManyToOne
  @JoinColumn(name="User_ID", referencedColumnName = "ID")
  private User userId;




Reference

https://cjw-awdsd.tistory.com/47

인프런 - 스프링 부트
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

[스프링부트 (7)] Spring Boot JPA(1) - 시작 및 기본 설정
https://goddaehee.tistory.com/209

https://steemit.com/kr-dev/@igna84/spring-boot-jpa-hibernate-2

Spring 관련 Annotation
https://velog.io/@geunwoobaek/Spring-JPA-%EA%B4%80%EB%A0%A8-%EC%A3%BC%EC%9A%94-Annotation%EC%A0%95%EB%A6%AC

[JPA] JPA란 무엇인가?
https://velog.io/@jwkim/JPA-JPA%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

profile
🍕

0개의 댓글