개발자의 서재

Chaptor.02 - JPA Entity생성 + h2 console 에서 확인 본문

SpringBootProject/SringBoot_JWT_RestApi

Chaptor.02 - JPA Entity생성 + h2 console 에서 확인

ironmask431 2022. 4. 1. 22:49

<진행할 것>

- datasource, JPA 설정 
- entity 생성,
- h2 console 결과확인

 

 

1. application.properties > yaml 파일로수정 > 내용입력

spring:
  h2:
    console:
      enabled: true

  datasources:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password:

  jpa:
    database-platform: org.hibernate.dialect.H2Dialect
    hibernate:
      ddl-auto: create-drop
    properties:
      hibernate:
        #콘솔창에서 sql 보기위한 설정
        format_sql: true
        show_sql: true
        
logging:
  level:
    com.leesh: debug

 

2. entity 패키지 생성 

Authority.java

import lombok.*;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * 권한 entity
 */
@Entity
@Table(name="authority")
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Authority {
    @Id
    @Column(name="authority_name", length = 50)
    private String authorityName;
}

User.java  

package com.leesh.springbootjwttutorial.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.*;

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

/**
 * 유저 entity
 */
@Entity
@Table(name="user")
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {
    @Id
    @Column(name="user_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY) // auto increment
    private Long userId;

    @Column(name="email", length = 50, unique = true)
    private String email;

    @JsonIgnore //JSON 리턴 시 생략됨.
    @Column(name="password", length = 100)
    private String password;

    @JsonIgnore
    @Column(name="activated")
    private boolean activated;

    @ManyToMany //테이블간 다대다 관계
    @JoinTable(
            name="user_authority",
            joinColumns = {@JoinColumn(name="user_id", referencedColumnName = "user_id")},
            inverseJoinColumns = {@JoinColumn(name="authority_name", referencedColumnName = "authority_name")}
    )
    private Set<Authority> authorities;


}

 

3. resources/data.sql 생성 > 서버가 실행될때마다 data.sql의 쿼리문들이 실행됨.

 

INSERT INTO USER (USER_ID, EMAIL, PASSWORD, ACTIVATED)
VALUES (1, 'admin@gmail.com', '$2a$08$lDnHPz7eUkSi6ao14Twuau08mzhWrL4kyZGGU5xfiGALO/Vxd5DOi', 1);

INSERT INTO AUTHORITY (AUTHORITY_NAME) VALUES ('ROLE_USER');
INSERT INTO AUTHORITY (AUTHORITY_NAME) VALUES ('ROLE_ADMIN');

INSERT INTO USER_AUTHORITY (USER_ID, AUTHORITY_NAME) VALUES (1, 'ROLE_USER');
INSERT INTO USER_AUTHORITY (USER_ID, AUTHORITY_NAME) VALUES (1, 'ROLE_ADMIN');

 

4. h2-console (브라우저에서 h2 db확인)을 사용하기 위해서 SecurityConfig.java 파일에 코드추가

 

//h2-console, favicon 시큐리티에 필터에 걸리지않도록 설정
@Override
public void configure(WebSecurity web) throws Exception {
   web.ignoring()
           .antMatchers(
                   "/h2-console/**", //h2 console
                   "/favicon.ico"
           );
}

 

5. 서버 구동 > 에러발생

 

https://zzang9ha.tistory.com/371 참고

 

USER 테이블에 insert 시 USER not found 에러.  h2 테이블이 생성되기 전에 data.sql 이 실행되는 듯하다.

application.yaml 에 코드 추가하여 해결

 

#data.sql을 h2 테이블이 생성된 후 실행되도록 함.
jpa.defer-datasource-initialization: true

 

6. 구동 후 /h2-console  접속 + 로그인시 오류 

 

https://www.youtube.com/watch?v=dlNu7rB7emQ  참고하여 수정 

구동시 콘솔 창에서 jdbc:h2 로 검색

 

해당 url을 전체복사 한다음 h2 로그인창의 JDBC URL에 입력 한 후 로그인> 정상로그인 됨.

 

7. h2-console에서 확인 결과 테이블 생성, 데이터 입력 정상 확인함. 

Comments