반응형
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
'Backend > Spring' 카테고리의 다른 글
[Spring Boot] 회원 가입 & 로그인(5) (0) | 2023.10.04 |
---|---|
[Spring Boot] 회원 가입 & 로그인(4) (1) | 2023.10.04 |
[Spring Boot] 회원 가입 & 로그인(3) (0) | 2023.10.04 |
[Spring Boot]회원 가입 & 로그인(2) (0) | 2023.09.26 |