User 테이블
@Entity // 테이블화 시켜주기
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder // 빌더 패턴
public class User {
// 모든 테이블에는 private key가 있어야 한다.
@Id // Primary key
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id; // 시퀀스, auto_increment
// null이 될 수 없고 길이 제한
// username은 중복되지 않도록
@Column(nullable = false, length = 30, unique=true)
private String username;
// null이 될 수 없고 길이 제한
// 해쉬를 통해 암호화된 비밀번호를 넣어줄 것이므로 넉넉하게 100!
@Column(nullable = false, length = 100)
private String password;
@Column(nullable = false, length = 50)
private String email;
@ColumnDefault("'user'") // 문자라는 것을 알려주기 위해 " 'user' "로 설정
private String role;
// 회원 가입 시간
@CreationTimestamp // 시간 자동입력
private Timestamp createDate;
}
@Entity
스프링 부트가 실행될 때 User 클래스를 읽어서 자동으로 MySQL에 테이블을 생성해준다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
넘버링 전략으로 해당 프로젝트에서 연결된 DB의 넘버링 전략을 따라간다는 뜻.
우리가 오라클을 사용한다면 시퀀스를 따라가는 것이고, MySQL을 사용하면 auto_increment를 따라간다.
application.yml의 use-new-id-generator-mappings는 MySQL의 경우 auto_increment, 오라클의 경우 시퀀스를 어떤 식으로 사용할 지 방식을 결정하는 것이다.
false로 하면 JPA가 사용하는 기본 넘버링 전략을 사용하지 않는다는 뜻이다. true는 그 반대.
false로 설정해서 JPA의 기본 넘버링 전략을 사용하지 않고, @GeneratedValue(strategy = GenerationType.IDENTITY) 어노테이션을 통해 DB의 넘버링 전략을 그대로 따라가도록 설정해준 것이다.
변수 role
role은 사실 Enum을 사용하여 만들어주는 것이 좋다. 왜냐하면 Enum을 사용하면 어떤 데이터의 도메인을 만들어줄 수 있다. role이라는 것은 어떤 회원이 회원가입을 했을 때 admin인지 일반 user인지 manager인지 등의 권한을 뜻하는데 이 권한을 주는 role의 타입이 String이면 실수로 철자가 틀렸을 경우가 생긴다.
이를 대비해서 Enum을 사용해서 도메인 설정을 해주면 훨씬 좋다.
ID와 createDate는 우리가 설정해주지 않아도 자동으로 채워질 예정
User 테이블 Test
먼저 application.yml에서 ddl-auto의 설정을 확인해야 한다.
ddl-auto는 create, update, none 등으로 설정이 가능하다. create로 설정되어 있으면 기존에 User라는 테이블이 있어도 프로젝트를 재실행할 때마다 새로 만들어지도록 설정된다.
만약 프로젝트를 만들어서 테이블에 데이터를 저장 후 프로젝트를 재실행하면 데이터가 다 날아가고 새로 만들어지는 것이다. 따라서 최초에만 create로 하고 나중에 update로 설정을 변경해주어야 한다. 그래야 기존 데이터를 지킬 수 있다.
실행해보면 다음과 같은 문구가 뜬다.
create로 설정해두었기 때문에 drop table if exists User가 되는 것이다. 이 문구가 콘솔창에 친절히 뜨는 이유는 application.yml에 show-sql을 true로 설정해줬기 때문이다. 또한 원래는 한줄로 쭉 떠야하는데 예쁘게 정렬되어 출력되는 이유는 hibernate.format_sql 설정을 true로 해줘서이다.
yml의 naming 설정
hibernate naming PhysicalNamingStrategyStandard 전략으로 Entity 즉, 테이블을 만들때 변수명 그대로 DB에 필드를 넣어준다는 설정이다. 지금 변수명이 username, password, email이니까 이 이름 그대로 DB에 넣어주는 것이다.
다른 전략으로 SpringPhysicalNaming 전략이 있는데 만약 변수명이 myEmail이라면 my_email로 저장해준다.
User 테이블이 잘 생성되었는 지 확인하기 위해 MySQL Workbench를 실행해준다.
잘 생성된 것을 확인할 수 있다.
만약 User 테이블에서 email을 em으로 바꿔쓰고 저장만 해줘도 DB에 em으로 다시 재생성되는 것을 볼 수 있다. 이것은 JPA가 ORM이라서 가능한 일인데 ORM은 Java Object를 테이블로 매핑해주는 기술로 우리는 Object만 만들면 jpa가 테이블로 만들어주는 것이다.
출처 : https://www.youtube.com/watch?v=6bhF5o4gAOs&list=PL93mKxaRDidECgjOBjPgI3Dyo8ka6Ilqm
'Spring > Blog 만들기 with SpringBoot' 카테고리의 다른 글
연관관계의 주인 (0) | 2022.05.08 |
---|---|
Blog 테이블 생성 - Board (0) | 2022.05.03 |
yaml 설정 (0) | 2022.04.28 |
Lombok 세팅 (0) | 2022.04.28 |
Maven (0) | 2022.04.27 |