본문 바로가기

Backend/Spring

[Spring Boot]회원 가입 & 로그인 (1)

반응형
SMALL

기본 회원 가입 및 로그인을 구현하면서 소셜 로그인도 같이 병합해서 사용해야겠다는 생각이 들어 만들어 봤습니다.

ERD는 쇼핑몰을 생각하면서 만들어 봤습니다.

먼저 기본 회원 가입 ERD 입니다.

user 테이블과 address 테이블을 따로 만들어 1:N 관계를 가지게 했습니다.

그 이유는 1명의 유저에 여러 개의 주소가 존재할 수 있다고 생각했습니다.

User Entity

@Getter
@NoArgsConstructor
@Entity
public class User extends BaseTimeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String email;

    @Column
    private String password;

    @Column(nullable = false)
    private String name;

    @Column(unique = true)
    private String nickname;

    @Column(unique = true)
    private String phoneNumber;

    @Column
    private String gender;

    @Column
    private String profileImgUrl;

    @Column
    private String introduce;

    @Column
    private String provider;

    @Column
    @Enumerated(EnumType.STRING)
    private Role role;

    @OneToMany(mappedBy = "user")
    private List<Address> addresses;

    @Builder
    public User(String email, String password, String name, String nickname, String phoneNumber, String gender, String profileImgUrl, String introduce, String provider, Role role) {
        this.email = email;
        this.password = password;
        this.name = name;
        this.nickname = nickname;
        this.phoneNumber = phoneNumber;
        this.gender = gender;
        this.profileImgUrl = profileImgUrl;
        this.introduce = introduce;
        this.provider = provider;
        this.role = role;
    }

 

Address Entity

@Getter
@NoArgsConstructor
@Entity
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String zipCode;

    @Column
    private String streetAddress;

    @Column
    private String detailAddress;

    @Column
    private Boolean isDefault;

    @OnDelete(action = OnDeleteAction.CASCADE)
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    @Builder
    public Address(String zipCode, String streetAddress, String detailAddress, User user, Boolean isDefault) {
        this.zipCode = zipCode;
        this.streetAddress = streetAddress;
        this.detailAddress = detailAddress;
        this.user = user;
        this.isDefault = isDefault;
    }
}

 

JPA를 사용하여 Entity를 만들고 User와 Address 사이의 1:N 관계로 맵핑했습니다.

 

UserRepository

import java.util.Optional;

public interface UserRepository extends JpaRepository<User, Long> {

    Optional<User> findByNickname(String nickname);
    Optional<User> findByPhoneNumber(String phoneNumber);
    Optional<User> findByEmail(String email);

}

 

UserRepository에서는 닉네임, 휴대폰 번호, 이메일 중복 처리를 확인하기 위해 미리 작성했습니다.

AddressRepository

import org.springframework.data.jpa.repository.JpaRepository;

public interface AddressRepository extends JpaRepository<Address, Long> {
}

 

BaseEntity ( 생성 시간, 수정 시간을 삽입하기 위해 BaseEntity를 만들어 상속받는 형태로 사용했습니다.)

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime modifiedAt;
}

 

저는 SpringApplication에 @EnableJpaAuditing 어노테이션을 적용하지 않고 JpaAuditingConfig 파일을 만들어 적용했습니다.

JpaAuditingConfig

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {
}

 

 

여기까지 도메인 작성입니다. 다음엔 컨트롤러 및 서비스 코드를 작성하겠습니다.

 

  • Spring Boot Version : 2.7.15
  • JDK Version : 11
  • DataBase : MySQL

 

처음 구현을 해본 부분이라 많이 미흡합니다. 만약 코드를 사용하신다면 한번 확인 후에 사용하면 좋을 것 같습니다.

 

 

 

GitHub - Llimy1/Auth_Spring

Contribute to Llimy1/Auth_Spring development by creating an account on GitHub.

github.com

 

 

반응형
LIST