diff --git a/build.gradle b/build.gradle index 2838b4a..348d178 100644 --- a/build.gradle +++ b/build.gradle @@ -24,9 +24,10 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' - implementation('org.springframework.boot:spring-boot-starter-web') implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'mysql:mysql-connector-java' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'io.springfox:springfox-boot-starter:3.0.0' implementation 'io.springfox:springfox-swagger-ui:3.0.0' compileOnly 'org.projectlombok:lombok' diff --git a/src/main/java/com/moodstation/springboot/dto/UserCreateRequestDto.java b/src/main/java/com/moodstation/springboot/dto/UserCreateRequestDto.java new file mode 100644 index 0000000..676f352 --- /dev/null +++ b/src/main/java/com/moodstation/springboot/dto/UserCreateRequestDto.java @@ -0,0 +1,32 @@ +package com.moodstation.springboot.dto; + +import com.moodstation.springboot.entity.User; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +@Getter +@NoArgsConstructor +public class UserCreateRequestDto { + BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); + + private String email; + private String nickname; + private String password; + + @Builder + public UserCreateRequestDto(String email, String nickname, String password) { + this.email = email; + this.nickname = nickname; + this.password = encoder.encode(password); + } + + public User toEntity() { + return User.builder() + .email(email) + .nickname(nickname) + .password(password) + .build(); + } +} diff --git a/src/main/java/com/moodstation/springboot/dto/UserCreateResponseDto.java b/src/main/java/com/moodstation/springboot/dto/UserCreateResponseDto.java new file mode 100644 index 0000000..3c255d5 --- /dev/null +++ b/src/main/java/com/moodstation/springboot/dto/UserCreateResponseDto.java @@ -0,0 +1,18 @@ +package com.moodstation.springboot.dto; + +import com.moodstation.springboot.entity.User; +import lombok.Getter; + +@Getter +public class UserCreateResponseDto { + + private Long id; + private String email; + private String nickname; + + public UserCreateResponseDto(User entity) { + this.id = entity.getId(); + this.email = entity.getEmail(); + this.nickname = entity.getNickname(); + } +} diff --git a/src/main/java/com/moodstation/springboot/entity/User.java b/src/main/java/com/moodstation/springboot/entity/User.java index bec0600..2c84faf 100644 --- a/src/main/java/com/moodstation/springboot/entity/User.java +++ b/src/main/java/com/moodstation/springboot/entity/User.java @@ -1,9 +1,12 @@ package com.moodstation.springboot.entity; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; +import java.time.LocalDateTime; @Getter @NoArgsConstructor @@ -23,6 +26,20 @@ public class User { @Column(nullable = false) private String password; - @Column(nullable = false) - private String accesstoken; + @Column(name = "created_at") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDateTime createdAt; + + @Column(name = "updated_at") + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDateTime updatedAt; + + @Builder + public User(String email, String nickname, String password) { + this.email = email; + this.nickname = nickname; + this.password = password; + this.createdAt = LocalDateTime.now(); + this.updatedAt = LocalDateTime.now(); + } } diff --git a/src/main/java/com/moodstation/springboot/repository/UserRepository.java b/src/main/java/com/moodstation/springboot/repository/UserRepository.java index d2ba7a1..dbbd16c 100644 --- a/src/main/java/com/moodstation/springboot/repository/UserRepository.java +++ b/src/main/java/com/moodstation/springboot/repository/UserRepository.java @@ -3,5 +3,13 @@ import com.moodstation.springboot.entity.User; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface UserRepository extends JpaRepository { + + // 이메일 중복 방지 + Optional findByEmail(String email); + + // 닉네임 중복 방지 + Optional findByNickname(String nickname); } diff --git a/src/main/java/com/moodstation/springboot/service/UserService.java b/src/main/java/com/moodstation/springboot/service/UserService.java new file mode 100644 index 0000000..bf6f3ca --- /dev/null +++ b/src/main/java/com/moodstation/springboot/service/UserService.java @@ -0,0 +1,21 @@ +package com.moodstation.springboot.service; + +import com.moodstation.springboot.dto.UserCreateRequestDto; +import com.moodstation.springboot.repository.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; + +@RequiredArgsConstructor +@Service +public class UserService { + + private final UserRepository userRepository; + + // 회원가입 + @Transactional + public Long save(UserCreateRequestDto requestDto) { + return userRepository.save(requestDto.toEntity()).getId(); + } +} diff --git a/src/main/java/com/moodstation/springboot/web/UserApiController.java b/src/main/java/com/moodstation/springboot/web/UserApiController.java new file mode 100644 index 0000000..6fd2a4c --- /dev/null +++ b/src/main/java/com/moodstation/springboot/web/UserApiController.java @@ -0,0 +1,23 @@ +package com.moodstation.springboot.web; + +import com.moodstation.springboot.dto.UserCreateRequestDto; +import com.moodstation.springboot.dto.UserCreateResponseDto; +import com.moodstation.springboot.entity.User; +import com.moodstation.springboot.service.UserService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RestController +public class UserApiController { + + private final UserService userService; + + @PostMapping("/api/v1/signup") + public Long signup(@RequestBody UserCreateRequestDto requestDto) { + return userService.save(requestDto); + } + +}