Paper.Yellow
시큐리티 2 본문
정해진 Domain이 있을 경우 Enum으로 >> role을 생성할때 String 사용하지 않기
설계가 나오면 글자수도 필요하다.
하드디스크에서 일부를 DBS로 사용하게 된다.
Table의 스키마에 따라 용량이 정해진다. = Table Space
?? 컬럼의 제약조건 ??
테이블에 Enum 타입은 없기 때문에, 실제로 적용되는 타입은 String 이란것을 알려주기 위한 @Enumerated(EnumType.STRING).
@NoArgsConstructor
내가 따로 User.java를 new할 이유가 있을까? 없음
하이버네이트가 getter를 통해 테이블을 생성함. 필드값을 보고 어노테이션을 분석.
이 생성자가 public일 이유 또한 없음.
하이버네이트는 private, public 상관없이 다 접근이 가능하다. 클래스 내부 모두 분석 가능.
참고용 포스팅
[JPA] Entity Class의 @NoargsConstructor (access = AccessLevel.PROTECTED)
실무에서 JPA를 활용하다보면 Entity 생성시 @NoargsConstructor (access = AccessLevel.PROTECTED) 이라는 Annotation을 붙여서 개발을 하게 된다. 이에 조금 더 정확히 이해하고자 이번 블로그 글로 언급하고자 한
erjuer.tistory.com
User.java
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 javax.persistence.Table;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import shop.mtcoding.bank.config.enums.UserEnum;
import shop.mtcoding.bank.domain.AudingTime;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
@Table(name = "users")
@Entity
public class User extends AudingTime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false, length = 20)
private String username;
@Column(nullable = false, length = 60)
private String password;
@Column(nullable = false, length = 50)
private String email;
@Enumerated(EnumType.STRING) // enum 쓸때 어노테이션
@Column(nullable = false)
private UserEnum role; // ADMIN, CUSTOMER
}
UserRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
기본 CRUD를 제공해준다.
Account.java
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import shop.mtcoding.bank.domain.AudingTime;
import shop.mtcoding.bank.domain.user.User;
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Table(name = "account")
@Entity
public class Account extends AudingTime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false, length = 50)
private Long number; // 계좌번호
@Column(nullable = false, length = 50)
private String ownerName; // 계좌주 실명
@Column(nullable = false, length = 4)
private String password; // 계좌비밀번호
@Column(nullable = false)
private Long balance; // 잔액
// 커멜케이스는 DB에 언더스코어로 생성된다.
@Column(nullable = false)
private Boolean isActive; // 계좌 활성화 여부
@ManyToOne(fetch = FetchType.LAZY)
private User user;
@Builder
public Account(Long id, Long number, String ownerName, String password, Long balance, Boolean isActive, User user) {
this.id = id;
this.number = number;
this.ownerName = ownerName;
this.password = password;
this.balance = balance;
this.isActive = isActive;
this.user = user;
}
}
User 정보를 Join해서 값을 가져오는 것에 대한 제어권을 갖기 위해 (fetch = FetchType.LAZY)를 붙인다.
커멜 표기법 케이스는 DB에 언더스코어로 생성된다.
여기서 하이버네이트 전략을 따로 걸지 않았기 떄문에 언더스코어로 기본 적용 됨.
AccountRepository.java
import org.springframework.data.jpa.repository.JpaRepository;
public interface AccountRepository extends JpaRepository<Account, Long> {
}
이체이력을 생성하는 다양한 방법 중 적용할 방법
어떤 계좌로부터 | 어떤 계좌로 | 얼마를 | 이체 / 입금 / 출금 | |
1 | 1111 | 2222 | 3000 | 이체 |
2 | null | 1111 | 4000 | 입금 |
3 | 1111 | null | 2000 | 출금 |
** 인증 / 권한
이체할 때 1111 / 2222 계좌 중 어디에 권한을 줄 것인가?
2222 계좌는 입금은 받는 계좌라 크게 중요치 않음.
1111 계좌의 소유주가 일치하는지 확인하는 것이 중요!!! (인증/권한 필요)
>>>이체/출금에서 인증/권한 필요
Transaction,java
import javax.persistence.Column;
import javax.persistence.ConstraintMode;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import shop.mtcoding.bank.config.enums.TransactionEnum;
import shop.mtcoding.bank.domain.AudingTime;
import shop.mtcoding.bank.domain.account.Account;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
@Table(name = "transaction")
@Entity
public class Transaction extends AudingTime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@ManyToOne(fetch = FetchType.LAZY)
private Account withdrawAccount; // 출금 계좌
@JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@ManyToOne(fetch = FetchType.LAZY)
private Account depositAccount; // 입금 계좌
@Column(nullable = false)
private Long amount; // 금액
private Long withdrawAccountBalance; // 거래후 잔액
private Long depositAccountBalance; // 거래후 잔액
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private TransactionEnum gubun; // 입금(ATM으로 부터), 출금(ATM으로), 이체(다른계좌로)
@Builder
public Transaction(Long id, Account withdrawAccount, Account depositAccount, Long amount,
Long withdrawAccountBalance, Long depositAccountBalance, TransactionEnum gubun) {
this.id = id;
this.withdrawAccount = withdrawAccount;
this.depositAccount = depositAccount;
this.amount = amount;
this.withdrawAccountBalance = withdrawAccountBalance;
this.depositAccountBalance = depositAccountBalance;
this.gubun = gubun;
}
}
외래 키(외부 키, Foreign Key)가 걸려있기 때문에 null 값을 넣을 수 없음.
외래키를 해제하기 위해 @JoinColumn(foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) 달아줌
'Spring Boote' 카테고리의 다른 글
시큐리티 3 (0) | 2022.12.05 |
---|---|
시큐리티 1 (0) | 2022.12.04 |
스프링부트 h2 데이터베이스 sql 자동 실행 (0) | 2022.11.18 |
JSTL <c:forEach> (0) | 2022.10.12 |
게시판 글쓰기 (0) | 2022.09.16 |