[Spring Cloud] Users Microservice - 회원가입

jsieon97·2023년 3월 10일
0

User Microservices

유저 정보를 관리하는 서비스

의존성 (Dependencies)

  • DevTools
  • Lombok
  • Web
  • Eureka Discovery Client

Eureka 서버 연결

// appication.yml

server:
  port: 0 // 포트번호 랜덤

spring:
  application:
    name: user-service

eureka:
  instance:
    instance-id:  ${spring.application.name}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8761/eureka

포트번호는 Load Balancer처리를 위해 랜덤으로 지정

H2 Database 연동

build.gradle에 의존성 추가

dependencies {
    
    ...
    
    implementation 'com.h2database:h2:1.3.176'

	...
}
1.4 이상의 버전부터는 testdb를 자동 생성해주지 않아서 1.3버전으로 의존성 추가

application.yml 파일 세팅


...

spring:
  application:
    name: user-service
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2-console
      
...

path는 h2-console로 설정
localhost:{port}/h2-console로 접속


testdb가 잘 생성된 것을 확인할 수 있다.

회원가입

  • POST -> /users
  • 입력 받은 데이터를 저장할 RequestUser 클래스 생성
  • @Notnull, @Size등의 validation 체크를 위한 spring-boot-starter-validation 의존성 추가
// RequestUser.java
 
import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Data
public class RequestUser {

    @NotNull(message ="Email cannot be null")
    @Size(min = 2, message = "Email not be less than two characters")
    @Email
    private String email;
    @NotNull(message = "Name cannot be null")
    @Size(min = 2, message = "Name not be less than to characters")
    private String name;
    @NotNull(message = "Password cannot be null")
    @Size(min = 8, message = "Password must be equal or greater than 8 characters")
    private String pwd;

}
  • DTO 생성
  • userId, createAt, encryptedPwd(암호화된 비밀번호)는 중간에서 처리 할 데이터
import lombok.Data;

import java.util.Date;

@Data
public class UserDto {
    private String email;
    private String name;
    private String pwd;
    private String userId;
    private Date createdAt;

    private String encryptedPwd;
}
  • Service 생성
// UserService.java

import com.example.userservice.dto.UserDto;

public interface UserService {
    UserDto createUser(UserDto userDto);
}
  • ModelMapper 의존성 추가
// UserServiceImpl.java

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    UserRepository userRepository;

    @Override
    public UserDto createUser(UserDto userDto) {
        userDto.setUserId(UUID.randomUUID().toString());

        ModelMapper mapper = new ModelMapper();
        mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
        UserEntity userEntity = mapper.map(userDto, UserEntity.class);
        userEntity.setEncryptedPwd("encrypted_password");

        userRepository.save(userEntity);

        return null;
    }
}
  • JPA 의존성 추가 spring-boot-starter-data-jpa
  • JPA 처리할 Entity클래스 생성
// UserEntity.java

import lombok.Data;

import javax.persistence.*;

@Data
@Entity
@Table(name = "users")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, length = 50, unique = true)
    private String email;
    @Column(nullable = false, length = 50)
    private String name;
    @Column(nullable = false, unique = true)
    private String userId;
    @Column(nullable = false, unique = true)
    private String encryptedPwd;

}
  • Repository 생성
import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<UserEntity, Long> {}
  • Controller에 유저 생성 요청 추가
import com.example.userservice.dto.UserDto;
import com.example.userservice.service.UserService;
import org.modelmapper.ModelMapper;
import com.example.userservice.vo.RequestUser;
import org.modelmapper.convention.MatchingStrategies;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/")
public class UserController {
    private Environment env;
    private UserService userService;

    @Autowired
    public UserController(Environment env, UserService userService) {
        this.env = env;
        this.userService = userService;
    }

    @PostMapping("/users")
    public String createUser(@RequestBody RequestUser user) {
        ModelMapper mapper = new ModelMapper();
        mapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);

        UserDto userDto = mapper.map(user, UserDto.class);
        userService.createUser(userDto);

        return "Create User Method is Called";
    }

}

회원가입 요청 테스트



DB에 저장된 모습을 확인할 수 있다.

200 OK 가 반환되는데 Post저장 성공은 201이 더 올바른 status 코드 반환 방법이다. 이를 구현 해보자

@PostMapping("/users")
    public ResponseEntity createUser(@RequestBody RequestUser user) {
        
        ...

        return new ResponseEntity(HttpStatus.CREATED);
    }


201 Created로 반환된다.

데이터도 함께 보내는 방법.

  • ResponseUser 클래스 추가
import lombok.Data;

@Data
public class ResponseUser {
    private String email;
    private String name;
    private String userId;
}
  • Controller에서 요청 return 수청
@PostMapping("/users")
    public ResponseEntity createUser(@RequestBody RequestUser user) {
          
         ...
          
        ResponseUser responseUser = mapper.map(userDto, ResponseUser.class);

        return ResponseEntity.status(HttpStatus.CREATED).body(responseUser);
    }
  • UserServiceImpl의 createUser수정
@Override
    public UserDto createUser(UserDto userDto) {
    
        ...

        UserDto returnUserDto = mapper.map(userEntity, UserDto.class);

        return returnUserDto;
    }
  • 테스트

    저장된 값을 보내준다.
profile
개발자로써 성장하는 방법

0개의 댓글