Spring boot 로그인, 회원가입(2)

jjuya·2023년 10월 26일
0
post-thumbnail

Entity, DTO 클래스 생성

Entity 클래스

  • 실제 DB 테이블과 매핑되는 핵심 클래스
  • 데이터베이스의 테이블에 존재하는 컬럼들을 필드로 가지는 객체
    (DB의 테이블과 1:1로 매핑되며, 테이블이 가지지 않는 컬럼을 필드로 가져서는 안됨)

제약사항

  1. @Entity가 붙은 클래스는 반드시 기본 생성자를 가지고 있어야한다.
  2. 'public' 또는 'protected' 접근 수준을 가져야 한다.
  3. Entity클래스의 모든 필드는 JPA가 알아서 매핑하기 위해 직렬화가 가능(Serialicable) 해야 한다.
  4. @Entity 클래스는 상속 받거나 확장될 수 있고, 다른 Entity 클래스를 상속 받을 수 있다.
  5. Entity 클래스의 필드는 객체-관계 매핑(ORM)을 위해 다른 어노테이션들로 추가적으로 설정할 수 있다. (예: @Column, @Id, @OneToMany 등)

user클래스 생성후 엔티티 클래스로 설정해준다.

@Getter 
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
 
@Table(name="user_tb")
public class User{ 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @Column(length = 100, nullable = false, unique = true)
    private String email;

    @Column(length = 256, nullable = false)
    private String password;

    @Column(length = 45, nullable = false)
    private String username;

    @Column(length = 11, nullable = false)
    private String phoneNumber;

    @Column(length = 30)
    @Convert(converter = StringArrayConverter.class)
    private List<String> roles = new ArrayList<>();
    
    @Builder
    public User(int id, String email, String password, String username, String phoneNumber, List<String> roles) {
        this.id = id;
        this.email = email;
        this.password = password;
        this.username = username;
        this.phoneNumber = phoneNumber;
        this.roles = roles;
    }
}

@NoArgsConstructor(access = AccessLevel.PROTECTED)

  • 생성자를 생성해줌 (Lombook 라이브러리)
  • protected 접근 수준으로 설정
    : 현재 클래스를 외부에서 임의로 인스턴스화 하는것을 방지하기 위해

@Entity

  • JAP(JAva Persisyence API)에서 사용됨
  • 이 클래스가 Entity 클래스 임을 선언해주는것

@Table("테이블이름")

  • 매핑할 테이블 이름을 지정할 수 있음(default: Entity 명)

@Id / @GeneratedValue(strategy = GenerationType.IDENTITY)

  • 해당 필드 값을 pk로 지정
  • @GeneratedValue -> @Id과 함께 사용 기본 키 생성을 DB에 위임할 수 있음( @Id만 지정시 키 값을 개발자가 직접 확인하고 넣어줘야함)
  • 데이터가 자동으로 아이디를 생성하도록함

@Coluumn(length = 100, nullable = false, unique = true)

  • JPA에서 사용되는 어노테이션
  • Entity 클래스의 필드가 매핑될 데이터베이스 컬럼의 세부 사항을 지정
  • length : 데이터베이스에서 이 컬럼의 최대 길이 설정 (default: 255)
  • nullabla : 데이터의 NULL값 허용여부 설정 (default: false)
  • uniqe : 데이터의 중복 값 허용여부 설정 (default: false)
    true : 이 컬럼의 값은 유일해야함, 중복x

@Convert

  • JPA에서 사용되는 어노테이션
  • 엔티티 클래스의 특정 필드를 데이터베이스에 저장하기 전에 변환(conversion) 할때 수행됨

@builder

  • Lombook 라이브러리에서 제공
  • 빌더 패턴을 쉽게 구현 할 수 있게 도와줌
  • 주로 생성자의 인자가 많거나, 인자를 선택적으로 지정해야하는 경우 사용

DTO (Data Transfer Object)

  • 계층간 데이터 교환을 위한 객체(Java Beans)
    + DB에서 데이터를 얻어 Service나 Controller 등으터 보낼 때 사용하는 객체
    + 로직을 갖고 있지 않는 순수한 데이터 객체이며, getter/setter 메서드만을 가짐
  • Request와 Response용 DTO는 View를 위한 클래스
    + 자주 변경이 필요한 클래스
    + toEntity() 메서드를 통해서 DTO에서 필요한 부분을 이용하여 Entity로 만든다.

UserRequest 클래스 생성후 Join에 필요한 데이터만 가지고 있는 JoinDTO 내부클래스 생성한다.

public class UserRequest {

    @Getter
    @Setter
    public static class JoinDTO {
    
        @NotEmpty
        @Pattern(regexp = "^[\\w._%+-]+@[\\w.-]+\\.[a-zA-Z]{2,6}$", message = "이메일 형식으로 작성해주세요")
        private String email;

        @NotEmpty
        @Size(min = 8, max = 20, message = "8자 이상 20자 이내로 작성 가능합니다.")
        @Pattern(regexp = "^(?=.*[a-zA-Z])(?=.*\\d)(?=.*[@#$%^&+=!~`<>,./?;:'\"\\[\\]{}\\\\()|_-])\\S*$", message = "영문, 숫자, 특수문자가 포함되어야하고 공백이 포함될 수 없습니다.")
        private String password;

        @NotEmpty
        private String username;

        @NotEmpty
        @Pattern(regexp = "^[0-9]{10,11}$", message = "휴대폰 번호는 숫자 10~11자리만 가능합니다.")
        private String phoneNumber;

        public User toEntity() {
            return User.builder()
                    .email(email)
                    .password(password)
                    .username(username)
                    .phoneNumber(phoneNumber)
                    .roles(Collections.singletonList("ROLE_USER"))
                    .build();
        }
    }
}

@NotEmpty

  • 데이터가 비어 있을 수 없는 상태

Repository

UserRepository생성 해서 JpaRepository를 상속 받아준다

public interface UserRepository extends JpaRepository<User, Long> { 
}
profile
Review the Record⭐

0개의 댓글