package com.example.realtimestreaming.Domain;
import com.example.realtimestreaming.Dto.Request.User.UserSignupReq;
import jakarta.persistence.*;
import lombok.*;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter @Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor // @Builder 와 @NoArgsConstructor 함께 사용하는 문제 해결
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "userId")
private Long userId;
@Column(name = "email", nullable = false, unique = true, columnDefinition = "varchar(512)")
private String email;
@Column(name = "password", nullable = false, columnDefinition = "varchar(512)")
private String password;
@Column(name = "nickname", nullable = false, columnDefinition = "varchar(512)")
private String nickname;
@Column(name = "token", columnDefinition = "varchar(512)")
private String token;
@OneToMany(mappedBy = "owner", cascade = CascadeType.REMOVE)
private List<Stream> streams = new ArrayList<>();
}
package com.example.realtimestreaming.Dto.Request.User;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserSignupReq {
private String email;
private String password;
private String nickname;
}
package com.example.realtimestreaming.Dto.Response;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class UserSignRes {
private Long userId;
private String nickname;
private String token;
}
package com.example.realtimestreaming.Common.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseDto<T> {
private T data;
public static <T> ResponseEntity<ResponseDto<T>> ok(T data) {
return ResponseEntity.ok(new ResponseDto<T>(data));
}
public static <T> ResponseEntity<ResponseDto<T>> created(T data) {
return ResponseEntity.status(HttpStatus.CREATED).body(new ResponseDto<T>(data));
}
}
package com.example.realtimestreaming.Repository;
import com.example.realtimestreaming.Domain.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Boolean existsByNickname(String nickname);
Boolean existsByEmail(String email);
User findUserByUserId(Long userId);
}
package com.example.realtimestreaming.Service;
import com.amazonaws.services.kms.model.AlreadyExistsException;
import com.example.realtimestreaming.Common.ErrorCode;
import com.example.realtimestreaming.Domain.User;
import com.example.realtimestreaming.Dto.Request.User.UserSignupReq;
import com.example.realtimestreaming.Dto.Response.UserSignRes;
import com.example.realtimestreaming.Repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.UUID;
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
// TODO 추후 보안 적용
@Transactional
public UserSignRes signup(UserSignupReq request) {
if (userRepository.existsByNickname(request.getNickname())) {
throw new AlreadyExistsException(ErrorCode.NICKNAME_IS_DUPLICATED.getMessage());
} else if (userRepository.existsByEmail(request.getEmail())) {
throw new AlreadyExistsException(ErrorCode.EMAIL_IS_DUPLICATED.getMessage());
}
var createdUser = userRepository.save(
User.builder()
.nickname(request.getNickname())
.email(request.getEmail())
.password(request.getPassword())
.token(UUID.randomUUID().toString())
.build()
);
return new UserSignRes(
createdUser.getUserId(),
createdUser.getNickname(),
createdUser.getToken()
);
}
}
package com.example.realtimestreaming.Controller;
import com.example.realtimestreaming.Common.dto.ResponseDto;
import com.example.realtimestreaming.Domain.User;
import com.example.realtimestreaming.Dto.Request.User.UserSignupReq;
import com.example.realtimestreaming.Dto.Response.UserSignRes;
import com.example.realtimestreaming.Service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(path = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@PostMapping("/signup")
public ResponseEntity<ResponseDto<UserSignRes>> signup(@RequestBody UserSignupReq request) {
var user = userService.signup(request);
return ResponseDto.created(user);
}
}
[Incorrect table definition; there can be only one auto column and it must be defined as a key]
BackendError - JDBC exception executing SQL [select u1_0.userId from user u1_0 where u1_0.nickname=? limit ?][Unknown column 'u1_0.userId' in 'field list'] [n/a]; SQL [n/a]