Whiteship Spring JPA, 프로젝트 설정, 기초

2020-07-23
  • jpa
  • spring
  • 프로젝트 설정

    maven
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>springJPAMaven</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <name>demospringdata</name>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.3.RELEASE</version>
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency> <!-- org.postgresql:postgresql:42.2.5-->
                <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>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    아직도 plugin 을 왜 넣는지 모르네..

    gradle
    plugins {
        id 'org.springframework.boot' version '2.2.6.RELEASE'
        id 'io.spring.dependency-management' version '1.0.8.RELEASE'
        id 'java'
    }
    
    ext {
        springBootVersion = '2.2.2.RELEASE'
    }
    
    group 'org.example'
    version '1.0-SNAPSHOT'
    
    sourceCompatibility = 1.8
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
        implementation 'org.postgresql:postgresql'
        testCompile 'org.springframework.boot:spring-boot-starter-test'
        testCompile 'junit:junit:4.12'
    }
    

    저렇게 하고, main 에 spring application 으로 기동하고, runner 로 테스트했다.

    logging 설정

    spring:
      datasource:
        url: jdbc:postgresql://MY-POSTGRESQL-URL:PORT/DATABASE-NAME
        username: USER-NAME
        password: USER-PASSWORD
      jpa:
        hibernate:
          ddl-auto: create
        show-sql: true
        properties:
          hibernate:
            format_sql: true #쿼리 포메팅
            temp:
              use_jdbc_metadata_defaults: false
    logging:
      level:
        root: info
        com:
          harm: debug
        org:
          hibernate:
            type:
              descriptor:
                sql: trace
    
    #실행 시, ddl 을 어떻게 할 것인지
    spring.jpa.hibernate.ddl-auto=create
    # sql 을 로깅할 것인지  logging.level.org.hibernate.SQL=debug 와 같음
    spring.jpa.hibernate.show-sql=true
    # 로깅 sql 을 이쁘게 보여줄 것인지
    spring.jpa.hibernate.properties.hibernate.format_sql=true
    # 기동 시 나는 오류 제거 clob 관련?
    spring.jpa.hibernate.properties.temp.use_jdbc_metadata_defaults=false
    # 바인딩 변수를 보여주는 것
    logging.level.org.hibernate.type.descriptor.sql=trace
    
    • 관계에는 방향이 있다. owning side(상대방 객체 레퍼런스를 갖는 쪽) 가 있고 non-owning side(상대방 객체 레퍼런스를 모르는 쪽) 가 있다. foreign key 를 갖고 있는 클래스가 owner 이다.
    • owner 쪽에 관계를 세팅해줘야(관계가 있는 객체의 레퍼런스를 세팅해줘야) 관계가 적용이된다.
    • @ManyToOne 을 갖고 있는 class 가 owner 이고, 이런 경우는 별도 테이블 없이 owner table 에 foreign key 컬럼을 추가하는 방식이 된다.
    • @OneToMany 의 경우, join table 이 생긴다.
    • 양방향 관계는 @ManyToOne 을 갖고 있는 관계가 오너이고(foreign key 를 갖고 있으므로), 오너가 아닌 쪽에서 오너에서 관계를 정의한 field 의 명칭을 알려줘야한다.
    • 양방향 관계를 설정할때는, 양쪽 객체에 모두 관계를 설정해줘야한다. 한쪽 class 에서 양쪽의 관계를 세팅하도록 함수를 만들면 편하다. 그런 함수를 convenient method 라고 한다.
    • @ManyToOne, @OneToMany 에서 cascade 옵션을 주어서 한 객체의 상태 변화(참고 entity 의 상태)를 다른 객체로 전파할 수 있다.
    • EntityManager 나 Session 을 Persistance Context 라고 부른다.