Paper.Yellow

시큐리티 2 본문

Spring Boote

시큐리티 2

Paper.Y 2022. 12. 5. 05:02

 

User.java

정해진 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> {
    
}

 

프라이머리키,기본키(primary key)의 타입을 걸어준다.

기본 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;
    }

}

length를 따로 입력하지 않으면 Long의 최대치까지 사용 가능.

User 정보를 Join해서 값을 가져오는 것에 대한 제어권을 갖기 위해 (fetch = FetchType.LAZY)를 붙인다.

 

커멜 표기법 케이스는 DB에 언더스코어로 생성된다.

 

application-dev.yml

여기서 하이버네이트 전략을 따로 걸지 않았기 떄문에 언더스코어로 기본 적용 됨.

 

 

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