Skip to content

Commit

Permalink
Merge pull request #2 from f-lab-edu/feature/1
Browse files Browse the repository at this point in the history
[#1] 회원가입 기능 구현
  • Loading branch information
misim3 authored Jan 18, 2024
2 parents ccda297 + 6286b5b commit 1d6f9b2
Show file tree
Hide file tree
Showing 7 changed files with 236 additions and 3 deletions.
27 changes: 24 additions & 3 deletions mitube-app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,19 +1,40 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.7'
id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.misim'
version = '0.0.1-SNAPSHOT'

java {
sourceCompatibility = '17'
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
}

dependencies {
testImplementation platform('org.junit:junit-bom:5.9.1')
testImplementation 'org.junit.jupiter:junit-jupiter'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-security'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('bootBuildImage') {
builder = 'paketobuildpacks/builder-jammy-base:latest'
}

test {
tasks.named('test') {
useJUnitPlatform()
}
81 changes: 81 additions & 0 deletions mitube-app/src/main/java/com/misim/controller/UserController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package com.misim.controller;

import com.misim.dto.UserDto;
import com.misim.service.UserService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

import static com.misim.util.HttpStatusResponseEntity.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/users/")
public class UserController {

private final UserService userService;

// 유저 정보 등록
@PostMapping("signup")
public ResponseEntity signupUser(@Valid UserDto userDto, BindingResult result) {

// @Valid 검증 과정에서 오류가 발견되면, BAD_REQUEST 처리.
if (result.hasErrors()) {
Map<String, String> errors = new HashMap<>();
result.getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String message = error.getDefaultMessage();
errors.put(fieldName, message);
});

return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);
}

userService.registerUser(userDto);

return RESPONSE_OK;
}

// 닉네임 중복 확인
// url 주소에 nickname이 포함되도 괜찮은지 의문이 생긴다.
@PostMapping("signup/{nickname}")
public ResponseEntity<HttpStatus> checkNickname(@PathVariable String nickname) {

if (userService.isDuplicatedNickname(nickname)) {
return RESPONSE_CONFLICT;
}

return RESPONSE_OK;
}

/*
// 이메일 본인 인증
@PostMapping("verify/{email}")
public ResponseEntity<HttpStatus> verifyEmail(@PathVariable String email) {
if (userService.isDuplicatedEmail(email)) {
} else {
}
}
// 약관
@GetMapping("term")
public ResponseEntity<> showTerm() {
}
@PostMapping("term/{nickname}")
public ResponseEntity<HttpStatus> saveTerm(@PathVariable String nickname) {
}
*/
}
27 changes: 27 additions & 0 deletions mitube-app/src/main/java/com/misim/dto/UserDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.misim.dto;

import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserDto {

@NotEmpty
@Email(regexp = "^(?=.{1,64}@)[A-Za-z0-9_-]+(\\\\.[A-Za-z0-9_-]+)*@[^-][A-Za-z0-9-]+(\\\\.[A-Za-z0-9-]+)*(\\\\.[A-Za-z]{2,})$")
private String email;

@NotEmpty
@Pattern(regexp = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[~@#$%^&+=!])(?=\\S+$).{8,15}$")
private String password;

@NotEmpty
private String nickname;
}
36 changes: 36 additions & 0 deletions mitube-app/src/main/java/com/misim/entity/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.misim.entity;

import java.time.LocalDateTime;

import jakarta.persistence.*;
import lombok.*;

@Entity
@Getter
@Table(name = "users")
@NoArgsConstructor
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String email;

private String password;

private String nickname;

private LocalDateTime createDate;

private LocalDateTime modifyDate;

@Builder
public User(String email, String password, String nickname) {
this.email = email;
this.password = password;
this.nickname = nickname;
this.createDate = LocalDateTime.now();
this.modifyDate = LocalDateTime.now();
}
}
14 changes: 14 additions & 0 deletions mitube-app/src/main/java/com/misim/repository/UserRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.misim.repository;

import com.misim.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {

boolean existsByEmail(String email);

boolean existsByNickname(String nickname);
User findByNickname(String nickname);

User findByEmail(String email);
}
45 changes: 45 additions & 0 deletions mitube-app/src/main/java/com/misim/service/UserService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.misim.service;

import com.misim.dto.UserDto;
import com.misim.entity.User;
import com.misim.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UserService {

private final UserRepository userRepository;

private final BCryptPasswordEncoder passwordEncoder;

public void registerUser(UserDto userDto) {

// userDto -> user로 변환하여 db에 저장 (비밀번호 암호화)
userRepository.save(User.builder()
.nickname(userDto.getNickname())
.password(passwordEncoder.encode(userDto.getPassword()))
.email(userDto.getEmail())
.build());
}

public boolean isDuplicatedEmail(String email) {
return userRepository.existsByEmail(email);
}

public boolean isDuplicatedNickname(String nickname) {
return userRepository.existsByNickname(nickname);
}

public User findUserByEmail(String email) {

return userRepository.findByEmail(email);
}

public User findUserByNickname(String nickname) {

return userRepository.findByNickname(nickname);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.misim.util;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;

public class HttpStatusResponseEntity {
public static final ResponseEntity<HttpStatus> RESPONSE_OK = ResponseEntity.status(HttpStatus.OK).build();
public static final ResponseEntity<HttpStatus> RESPONSE_CONFLICT = ResponseEntity.status(HttpStatus.CONFLICT).build();
}

0 comments on commit 1d6f9b2

Please sign in to comment.