From 02de0ce8886ad16019f35c11a6b0560f4d1a0b7c Mon Sep 17 00:00:00 2001 From: meohin Date: Wed, 17 Sep 2025 15:06:41 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20User=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/back/domain/user/entity/User.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/com/back/domain/user/entity/User.java diff --git a/src/main/java/com/back/domain/user/entity/User.java b/src/main/java/com/back/domain/user/entity/User.java new file mode 100644 index 00000000..b3be7709 --- /dev/null +++ b/src/main/java/com/back/domain/user/entity/User.java @@ -0,0 +1,34 @@ +package com.back.domain.user.entity; + +import jakarta.persistence.*; +import lombok.*; + +import java.time.LocalDateTime; + +@Entity +@Table(name = "users") // DB 테이블 이름: User 대신 users 권장 (예약어 충돌 방지) +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String email; // 유저 소셜 이메일 (OAuth2 로그인 시 저장) + + private String nickname; // 유저 닉네임 + + private String profileImgUrl; // 프로필 이미지 URL + + private String apiKey; // 리프레시 토큰 (쿠키 인증과 연동) + + private Double abvDegree; // 온도(회원 등급) + + private LocalDateTime createdAt; // 생성 날짜 + + private LocalDateTime updatedAt; // 수정 날짜 +} \ No newline at end of file From 68399e9c76baf1f76fefe1f17ffd0be697994dfc Mon Sep 17 00:00:00 2001 From: meohin Date: Wed, 17 Sep 2025 15:33:56 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20User=20DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/back/domain/user/dto/UserDto.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/com/back/domain/user/dto/UserDto.java diff --git a/src/main/java/com/back/domain/user/dto/UserDto.java b/src/main/java/com/back/domain/user/dto/UserDto.java new file mode 100644 index 00000000..e0767983 --- /dev/null +++ b/src/main/java/com/back/domain/user/dto/UserDto.java @@ -0,0 +1,38 @@ +package com.back.domain.user.dto; + +import com.back.domain.user.entity.User; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class UserDto { + + private Long id; + private String email; + private String nickname; + private String profileImgUrl; + private Double abvDegree; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; + + public static UserDto from(User user) { + if (user == null) return null; + return UserDto.builder() + .id(user.getId()) + .email(user.getEmail()) + .nickname(user.getNickname()) + .profileImgUrl(user.getProfileImgUrl()) + .abvDegree(user.getAbvDegree()) + .createdAt(user.getCreatedAt()) + .updatedAt(user.getUpdatedAt()) + .build(); + } +} + From 4e0c899a41257758e4ebe4c62921ee29288681f8 Mon Sep 17 00:00:00 2001 From: meohin Date: Wed, 17 Sep 2025 15:34:15 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20UserRepository=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../back/domain/user/repository/UserRepository.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/com/back/domain/user/repository/UserRepository.java diff --git a/src/main/java/com/back/domain/user/repository/UserRepository.java b/src/main/java/com/back/domain/user/repository/UserRepository.java new file mode 100644 index 00000000..ce4bcc8a --- /dev/null +++ b/src/main/java/com/back/domain/user/repository/UserRepository.java @@ -0,0 +1,10 @@ +package com.back.domain.user.repository; + +import com.back.domain.user.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface UserRepository extends JpaRepository { +} + From adb964739d1ff765f6a373a5b886cebddc2f6474 Mon Sep 17 00:00:00 2001 From: meohin Date: Wed, 17 Sep 2025 15:55:02 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20User=20=EC=97=94=ED=8B=B0=ED=8B=B0?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/back/domain/user/entity/User.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/back/domain/user/entity/User.java b/src/main/java/com/back/domain/user/entity/User.java index b3be7709..f8a1d18c 100644 --- a/src/main/java/com/back/domain/user/entity/User.java +++ b/src/main/java/com/back/domain/user/entity/User.java @@ -1,12 +1,19 @@ package com.back.domain.user.entity; import jakarta.persistence.*; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; import lombok.*; import java.time.LocalDateTime; @Entity -@Table(name = "users") // DB 테이블 이름: User 대신 users 권장 (예약어 충돌 방지) +@Table( + name = "users", // DB 테이블 이름: User 대신 users 권장 (예약어 충돌 방지) + indexes = { + @Index(name = "ux_users_email", columnList = "email", unique = true) + } +) @Getter @Setter @NoArgsConstructor @@ -18,14 +25,17 @@ public class User { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @NotBlank + @Email + @Column(nullable = false, unique = true) private String email; // 유저 소셜 이메일 (OAuth2 로그인 시 저장) + @NotBlank + @Column(nullable = false, unique = true) private String nickname; // 유저 닉네임 private String profileImgUrl; // 프로필 이미지 URL - private String apiKey; // 리프레시 토큰 (쿠키 인증과 연동) - private Double abvDegree; // 온도(회원 등급) private LocalDateTime createdAt; // 생성 날짜