반응형
package com.lsj.blog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import com.lsj.blog.model.RoleType;
import com.lsj.blog.repository.UserRepository;
@RestController
public class DummyController {
@Autowired // DI
private UserRepository userRepository;
@PostMapping("/dummy/join")
public String join(BlogUser user) {
//user.setRole("user"); // @DynamicInsert처럼 계속 어노테이션을 붙히다보면 어노테이션 지옥에 빠지기 때문에 직접 Setter에 주입해 어노테이션을 줄일 수 있지만 실수할 수 있다.
user.setRole(RoleType.USER); // Enum을 이용한 방식을 통해 Setter 주입 실수를 방지할 수 있다.
userRepository.save(user); // UserRepostiory에 save하면 DB 테이블에 insert가 된다.
return "회원가입이 완료되었습니다.";
}
}
DummyController.java
package com.lsj.blog.model;
//데이터 강제할 수 있다. (데이터의 도메인화 → 강제)
public enum RoleType {
USER,
ADMIN
}
RoleType.java
package com.lsj.blog.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.lsj.blog.BlogUser;
// extends JapRepository가 있는 경우 @Repository 생략가능
// JpaRepostiory는 다양한 기능을 가지고 있다. findAll (모든 레코드 select) 페이징해서 보내줄 수 있는 기능도 존재
public interface UserRepository extends JpaRepository<BlogUser, Integer>{ // BlogUser의 Repository이고 PK는 Integer이다.
}
UserRepository.java
package com.lsj.blog;
import java.sql.Timestamp;
import java.util.List;
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 com.lsj.blog.model.RoleType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/** 하기 어노테이션 사용하려면 Javax Persistence API Gradle 추가 필요 **/
@DynamicInsert // null 인 값일 때는 무시하고 Default값으로 넣어준다
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity // 하기 필드 기준으로 DB에 User 테이블을 생성하라는 의미
public class BlogUser {
@Id // Primary key
@GeneratedValue(strategy = GenerationType.IDENTITY) // 프로젝트에서 연결된 DB의 넘버링 전략을 따라간다.
// → 즉, DB에 따라 AutoIncrement 또는 Sequence가 결정 되어서 알아서 만들어준다. (자동 증가 PK 필요함으로 이와 같은 행동 함)
// (MySql에서는 AutoIncrement, Oracle에서는 Sequence 사용)
private int id;
@Column(nullable = false, length = 30, unique=true) // null 방지 및 길이 30 + 중복값 방지
private String username;
@ColumnDefault(" 'no password' ") //→ @DynamicInsert 와 같이 사용한다. null일시에는 ColumnDefault에 선언된 값(no password)으로 넣어준다.
@Column(nullable = true, length = 100)
private String password;
@Column(nullable = false, length = 50)
private String email;
//@ColumnDefault("'user'") // → Column Default 값 String이기 때문에 ' ' 안에 넣어야한다.
//private String role; // Enum을
@Enumerated(EnumType.STRING) // DB에는 RoleType이라는 타입이 없기 때문에 String 이라고 선언
private RoleType role;
@CreationTimestamp // 현재 시각 바로 자동 입력
private Timestamp createDate;
}
/**
위와 같은 엔터티일 때 세이브할 데이터 형식 예제
{
"username" : "lee6",
"email" : "abc@naver.com"
}
결과 → 2 22/12/03 12:31:26.986000000 tjdwo37@naver.com no password USER lee6
**/
BlogUser.java
반응형