1. User.java 에 @DynamicInsert 추가
package com.pure.blog.model;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.DynamicInsert;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@DynamicInsert //null인 필드는 제외하고 insert 해줌.
@Entity //User 클래스가 MySQL에 자동으로 테이블로 생성됨.
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
@Id //PK
@GeneratedValue(strategy = GenerationType.IDENTITY) //프로젝트에서 연결된 DB의 넘버링 전략을 따라간다.
private int id; //시퀀스, auto_increment
@Column(nullable = false, length = 30)
private String username; //아이디
@Column(nullable = false, length = 100) //추후 해쉬(비밀번호 암호화)를 위함.
private String password;
@Column(nullable = false, length = 50)
private String email;
@ColumnDefault("'user'") //user는 작은 따옴표로 묶어야 문자임을 알려줄 수 있음.
private String role; //admin, user, manager 등을 설정. //Enum을 쓰는 게 좋다. 도메인을 설정해서 이상한 값이 들어가는 것을 방지하기 위함.
@CreationTimestamp //시간이 자동으로 입력됨
private Timestamp createDate;
}
2. UserRepository.java 생성
package com.pure.blog.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.pure.blog.model.User;
//DAO와 같음
//자동으로 Bean 등록이 되기 때문에 @Repository 생략이 가능.
public interface UserRepository extends JpaRepository<User, Integer> { //User 테이블이 관리하는 repo, PK는 Integer
}
3. DummyControllerTest.java
package com.pure.blog.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import com.pure.blog.model.User;
import com.pure.blog.repository.UserRepository;
@RestController
public class DummyControllerTest {
@Autowired
private UserRepository userRepository;
@PostMapping("/dummy/join")
public String join(User user) { // key = value 규칙
System.out.println("username: " + user.getUsername());
System.out.println("password: " + user.getPassword());
System.out.println("email: " + user.getEmail());
userRepository.save(user); //DB에 insert 됨.
return "회원가입이 완료되었습니다.";
}
}
DynamicInsert를 넣기 전에는 이렇게 role에 null이 들어가도록 실행되어 default 값이 user로 설정되어 있음에도 db에 null이 들어가버림.
@DynamicInsert를 넣은 후에는 null값을 받았을 때는 아예 insert시 값을 넣질 않아서 정상적으로 default 값이 DB에 등록됨.
**But, 이보다 좋은 방식은 Enum을 설정하는 것이다.
model 패키지에 RoleType.java인 Enum을 생성한다.
package com.pure.blog.model;
public enum RoleType {
USER, ADMIN
}
User.java 수정
package com.pure.blog.model;
import java.sql.Timestamp;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.DynamicInsert;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
//@DynamicInsert //null인 필드는 제외하고 insert 해줌.
@Entity //User 클래스가 MySQL에 자동으로 테이블로 생성됨.
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
@Id //PK
@GeneratedValue(strategy = GenerationType.IDENTITY) //프로젝트에서 연결된 DB의 넘버링 전략을 따라간다.
private int id; //시퀀스, auto_increment
@Column(nullable = false, length = 30)
private String username; //아이디
@Column(nullable = false, length = 100) //추후 해쉬(비밀번호 암호화)를 위함.
private String password;
@Column(nullable = false, length = 50)
private String email;
//DB는 RoleType이라는 타입이 없음.
@Enumerated(EnumType.STRING)
private RoleType role; // USER, ADMIN 두개만 들어갈 수 있도록 설정.
@CreationTimestamp //시간이 자동으로 입력됨
private Timestamp createDate;
}
DummyControllerTest.java 수정
package com.pure.blog.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import com.pure.blog.model.RoleType;
import com.pure.blog.model.User;
import com.pure.blog.repository.UserRepository;
@RestController
public class DummyControllerTest {
@Autowired
private UserRepository userRepository;
@PostMapping("/dummy/join")
public String join(User user) { // key = value 규칙
System.out.println("username: " + user.getUsername());
System.out.println("password: " + user.getPassword());
System.out.println("email: " + user.getEmail());
user.setRole(RoleType.USER);
userRepository.save(user); //DB에 insert 됨.
return "회원가입이 완료되었습니다.";
}
}
'취업 준비 > Spring boot' 카테고리의 다른 글
15. 전체 User select 및 paging 처리 (0) | 2022.01.24 |
---|---|
14. id로 select 테스트 (0) | 2022.01.24 |
12. JSON ? (0) | 2022.01.24 |
11. 연관관계의 주인 (0) | 2022.01.24 |
10. Reply 테이블 생성하기 (0) | 2022.01.22 |