From adeb3fed789b28e9e27651fc418ccf67d55d49cc Mon Sep 17 00:00:00 2001 From: saokiritoni Date: Mon, 11 Aug 2025 16:48:18 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[fix]=20#60=20gid,=20uid=20=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=ED=95=B4=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin_be/domain/users/entity/User.java | 33 +++---------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/src/main/java/DGU_AI_LAB/admin_be/domain/users/entity/User.java b/src/main/java/DGU_AI_LAB/admin_be/domain/users/entity/User.java index faa71c44..4c2945b7 100644 --- a/src/main/java/DGU_AI_LAB/admin_be/domain/users/entity/User.java +++ b/src/main/java/DGU_AI_LAB/admin_be/domain/users/entity/User.java @@ -1,6 +1,5 @@ package DGU_AI_LAB.admin_be.domain.users.entity; -import DGU_AI_LAB.admin_be.domain.groups.entity.Group; import DGU_AI_LAB.admin_be.global.common.BaseTimeEntity; import jakarta.persistence.*; import lombok.*; @@ -15,17 +14,15 @@ public class User extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "user_id") private Long userId; - @Column(name = "email", nullable = false, length = 100) + @Column(name = "email", nullable = false, length = 100, unique = true) private String email; @Column(name = "password", nullable = false, length = 255) private String password; - @Column(name = "ubuntu_uid") - private Long ubuntuUid; - @Column(name = "name", nullable = false, length = 100) private String name; @@ -47,28 +44,8 @@ public class User extends BaseTimeEntity { @Builder.Default private Boolean isActive = true; - public void updateUserInfo(String password, Boolean isActive) { - this.password = password; - this.isActive = isActive; - } - - public void updateUbuntuUid(Long ubuntuUid) { - this.ubuntuUid = ubuntuUid; + public void updateUserInfo(String encodedPassword, Boolean isActive) { + if (encodedPassword != null) this.password = encodedPassword; + if (isActive != null) this.isActive = isActive; } - - public void updateUbuntuGroup(Group group) { - this.ubuntuGroup = group; - } - - public void updateUnixInfo(Long ubuntuUid, Group ubuntuGroup) { - this.ubuntuUid = ubuntuUid; - this.ubuntuGroup = ubuntuGroup; - } - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "ubuntu_gid") - private Group ubuntuGroup; - - - } From b0d26b3efd26a86e97d3ef0b91d088e3b1e78241 Mon Sep 17 00:00:00 2001 From: saokiritoni Date: Mon, 11 Aug 2025 16:48:33 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[fix]=20#60=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EC=8B=9C=20=ED=95=84=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/request/UserRegisterRequestDTO.java | 30 +++++++++++++++++-- .../users/service/UserLoginService.java | 23 ++++++++------ 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/main/java/DGU_AI_LAB/admin_be/domain/users/dto/request/UserRegisterRequestDTO.java b/src/main/java/DGU_AI_LAB/admin_be/domain/users/dto/request/UserRegisterRequestDTO.java index 0f8831d4..49dc5d79 100644 --- a/src/main/java/DGU_AI_LAB/admin_be/domain/users/dto/request/UserRegisterRequestDTO.java +++ b/src/main/java/DGU_AI_LAB/admin_be/domain/users/dto/request/UserRegisterRequestDTO.java @@ -1,5 +1,6 @@ package DGU_AI_LAB.admin_be.domain.users.dto.request; +import DGU_AI_LAB.admin_be.domain.users.entity.User; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; @@ -17,5 +18,30 @@ public record UserRegisterRequestDTO( @Schema(description = "사용자 이름", example = "이소은") @NotBlank - String name -) {} + String name, + + @Schema(description = "학과", example = "컴퓨터공학과") + @NotBlank + String department, + + @Schema(description = "학번", example = "202312345") + @NotBlank + String studentId, + + @Schema(description = "전화번호", example = "010-1234-5678") + @NotBlank + String phone +) { + /** 비밀번호는 서비스에서 암호화한 값을 넘겨서 처리 */ + public User toEntity(String encodedPassword) { + return User.builder() + .email(email) + .password(encodedPassword) + .name(name) + .department(department) + .studentId(studentId) + .phone(phone) + // role, isActive는 엔티티의 @Builder.Default 로 기본값 사용 + .build(); + } +} diff --git a/src/main/java/DGU_AI_LAB/admin_be/domain/users/service/UserLoginService.java b/src/main/java/DGU_AI_LAB/admin_be/domain/users/service/UserLoginService.java index bac7e4c1..0d234297 100644 --- a/src/main/java/DGU_AI_LAB/admin_be/domain/users/service/UserLoginService.java +++ b/src/main/java/DGU_AI_LAB/admin_be/domain/users/service/UserLoginService.java @@ -1,5 +1,7 @@ package DGU_AI_LAB.admin_be.domain.users.service; +import DGU_AI_LAB.admin_be.domain.groups.entity.Group; +import DGU_AI_LAB.admin_be.domain.groups.repository.GroupRepository; import DGU_AI_LAB.admin_be.domain.users.dto.request.UserLoginRequestDTO; import DGU_AI_LAB.admin_be.domain.users.dto.request.UserRegisterRequestDTO; import DGU_AI_LAB.admin_be.domain.users.dto.response.UserTokenResponseDTO; @@ -15,6 +17,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.concurrent.TimeUnit; @@ -24,36 +27,37 @@ public class UserLoginService { private final UserRepository userRepository; + private final GroupRepository groupRepository; private final PasswordEncoder passwordEncoder; private final JwtProvider jwtProvider; private final RedisTemplate redisTemplate; private final long REFRESH_TOKEN_EXPIRE_TIME = 60 * 60 * 24 * 7; + /** 회원가입 */ + @Transactional public void register(UserRegisterRequestDTO request) { String redisKey = "VERIFIED:" + request.email(); if (!Boolean.TRUE.equals(redisTemplate.hasKey(redisKey))) { throw new UnauthorizedException(ErrorCode.EMAIL_NOT_VERIFIED); } - if (userRepository.findByEmail(request.email()).isPresent()) { throw new BusinessException(ErrorCode.USER_ALREADY_EXISTS); } - User user = User.builder() - .email(request.email()) - .password(passwordEncoder.encode(request.password())) - .name(request.name()) - .role(Role.USER) - .isActive(true) - .build(); + String encoded = passwordEncoder.encode(request.password()); + User user = request.toEntity(encoded); userRepository.save(user); + redisTemplate.delete(redisKey); - log.info("회원가입 완료 및 VERIFIED:{} 키 삭제", request.email()); + log.info("회원가입 완료, VERIFIED:{} 키 삭제", request.email()); } + + + /** 로그인 */ public UserTokenResponseDTO login(UserLoginRequestDTO request) { User user = userRepository.findByEmail(request.email()) .orElseThrow(() -> new UnauthorizedException(ErrorCode.INVALID_LOGIN_INFO)); @@ -71,5 +75,6 @@ public UserTokenResponseDTO login(UserLoginRequestDTO request) { return UserTokenResponseDTO.of(accessToken, refreshToken); } + } From f13d8778a234841823dc12198ea6f2afc76832f8 Mon Sep 17 00:00:00 2001 From: saokiritoni Date: Mon, 11 Aug 2025 17:05:37 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[fix]=20#60=20uid,=20gid=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20&=20=EB=A0=88=ED=8F=AC=EC=A7=80=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../users/controller/AdminUserController.java | 5 ---- .../users/dto/response/UserSummaryDTO.java | 4 --- .../users/repository/UserRepository.java | 5 ---- .../domain/users/service/UserService.java | 26 ------------------- 4 files changed, 40 deletions(-) diff --git a/src/main/java/DGU_AI_LAB/admin_be/domain/users/controller/AdminUserController.java b/src/main/java/DGU_AI_LAB/admin_be/domain/users/controller/AdminUserController.java index fff14217..a7777126 100644 --- a/src/main/java/DGU_AI_LAB/admin_be/domain/users/controller/AdminUserController.java +++ b/src/main/java/DGU_AI_LAB/admin_be/domain/users/controller/AdminUserController.java @@ -26,11 +26,6 @@ public ResponseEntity> getAllUsers() { return SuccessResponse.ok(userService.getAllUsers()); } - @PostMapping - public ResponseEntity> createUser(@Valid @RequestBody UserCreateRequestDTO request) { - return SuccessResponse.ok(userService.createUser(request)); - } - @PutMapping("/{id}") // TODO: 관리자용 updateUser와 분리 필요 public ResponseEntity> updateUser(@PathVariable Long id, @Valid @RequestBody UserUpdateRequestDTO request) { return SuccessResponse.ok(userService.updateUser(id, request)); diff --git a/src/main/java/DGU_AI_LAB/admin_be/domain/users/dto/response/UserSummaryDTO.java b/src/main/java/DGU_AI_LAB/admin_be/domain/users/dto/response/UserSummaryDTO.java index c3b94ca5..14e42f57 100644 --- a/src/main/java/DGU_AI_LAB/admin_be/domain/users/dto/response/UserSummaryDTO.java +++ b/src/main/java/DGU_AI_LAB/admin_be/domain/users/dto/response/UserSummaryDTO.java @@ -10,8 +10,6 @@ public record UserSummaryDTO( Long userId, String name, String email, - Long ubuntuUid, - Long ubuntuGid, String role, Boolean isActive, LocalDateTime createdAt @@ -21,8 +19,6 @@ public static UserSummaryDTO fromEntity(User user) { .userId(user.getUserId()) .name(user.getName()) .email(user.getEmail()) - .ubuntuUid(user.getUbuntuUid()) - .ubuntuGid(user.getUbuntuGroup() != null ? user.getUbuntuGroup().getUbuntuGid() : null) .role(user.getRole().name()) .isActive(user.getIsActive()) .createdAt(user.getCreatedAt()) diff --git a/src/main/java/DGU_AI_LAB/admin_be/domain/users/repository/UserRepository.java b/src/main/java/DGU_AI_LAB/admin_be/domain/users/repository/UserRepository.java index 2c27eb29..8342e53b 100644 --- a/src/main/java/DGU_AI_LAB/admin_be/domain/users/repository/UserRepository.java +++ b/src/main/java/DGU_AI_LAB/admin_be/domain/users/repository/UserRepository.java @@ -10,9 +10,4 @@ @Repository public interface UserRepository extends JpaRepository { Optional findByEmail(String email); - @Query("SELECT MAX(u.ubuntuUid) FROM User u") - Optional findMaxUbuntuUid(); - - boolean existsByUbuntuUid(Long ubuntuUid); - } diff --git a/src/main/java/DGU_AI_LAB/admin_be/domain/users/service/UserService.java b/src/main/java/DGU_AI_LAB/admin_be/domain/users/service/UserService.java index dbe1df79..1ebc1850 100644 --- a/src/main/java/DGU_AI_LAB/admin_be/domain/users/service/UserService.java +++ b/src/main/java/DGU_AI_LAB/admin_be/domain/users/service/UserService.java @@ -29,32 +29,6 @@ public class UserService { private static final long UID_BASE = 10000; // TODO: 이부분 시스템에 맞추어서 수정하기 - /** - * 유저 생성 - */ - public UserResponseDTO createUser(UserCreateRequestDTO request) { - log.info("[createUser] name={}", request.name()); - - Long uid = getNextAvailableUid(); - Long gid = uid; // 기본적으로 UID와 동일한 GID 사용 - - Group group = groupRepository.findById(gid) - .orElseThrow(() -> new EntityNotFoundException(ErrorCode.ENTITY_NOT_FOUND)); - - User user = request.toEntity(); - user.updateUbuntuUid(uid); - user.updateUbuntuGroup(group); - - User saved = userRepository.save(user); - log.info("[createUser] user created with userId={}", saved.getUserId()); - - return UserResponseDTO.fromEntity(saved); - } - - private Long getNextAvailableUid() { - return userRepository.findMaxUbuntuUid().orElse(UID_BASE - 1) + 1; - } - /** * 단일 유저 조회 */