상세 컨텐츠

본문 제목

SpringBoot MSA (10) - MicroService / UserService DB API (2)

Spring/SpringBoot-MSA

by ChrisMare 2023. 10. 17. 10:11

본문

jpa를 사용하여 간단한 회원가입 및 조회 등을 진행해보겠습니다.

 

vo > RequestUser.java

전달객체

package com.example.userservice.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

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 two characters")
    private String name;

    @NotNull(message = "Password cannot be null")
    @Size(min = 8, message = "Password must be less than 8 characters")
    private String pwd;
}

 

dto > UserDto.java

서비스에서 전달하거나 담는 객체

package com.example.userservice.dto;

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

package com.example.userservice.service;

import com.example.userservice.dto.UserDto;

public interface UserService {
    UserDto createUser(UserDto userDto);
}

service > UserServiceImpl

package com.example.userservice.service;

import com.example.userservice.dto.UserDto;
import org.springframework.stereotype.Service;

import java.util.UUID;

@Service
public class UserServiceImpl implements UserService{

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

        return null;
    }

}

 

JPA 의존성 추가

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

 

repository > UserEntity

Table의 name이 밑줄이 날 경우 아직 생성되지 않아서이다.

package com.example.userservice.repository;

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 > UserRepository

실제 DB 연결 및 데이터 처리

package com.example.userservice.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {

}

 

Service 내에서 데이터를 처리해야되는데

클래스에 데이터를 전달할 때 일일이 세팅해야되는데 이부분에 대해서 처리해주는 기능이 있다.

mapper라는 dependency를 추가해야된다.

pom.xml

<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>2.3.8</version>
</dependency>

 

service > UserServiceImpl.java

회원가입 로직 추가

package com.example.userservice.service;

import com.example.userservice.dto.UserDto;
import com.example.userservice.repository.UserEntity;
import com.example.userservice.repository.UserRepository;
import com.netflix.discovery.converters.Auto;
import org.dom4j.rule.Mode;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.MatchingStrategies;
import org.modelmapper.spi.MatchingStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

@Service
public class UserServiceImpl implements UserService {

    UserRepository userRepository;

    @Autowired
    public UserServiceImpl(UserRepository userRepository) {
        this.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"); // 추후 수정

        // jpa로 저장
        userRepository.save(userEntity);

        return null;
    }

}

 

controller > UserController.java

서비스에 구현한 createUser 연결

package com.example.userservice.controller;

import com.example.userservice.dto.UserDto;
import com.example.userservice.service.UserService;
import com.example.userservice.vo.Greeting;
import com.example.userservice.vo.RequestUser;
import org.bouncycastle.math.raw.Mod;
import org.modelmapper.ModelMapper;
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
    private Greeting greeting;

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

    @GetMapping("/health_check")
    public String status() {
        return "It's Working in User Service";
    }

    @GetMapping("/welcome")
    public String welcome() {
//        return env.getProperty("greeting.message");
        return greeting.getMessage();
    }

    @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.";
    }
}

 

Postman을 통해서 createUser를 진행해보자!

우선 위에 작성한 코드를 동작하기 위해서 서버를 재실행한다.

주의: 재실행 했을 경우 포트번호가 랜덤이기 때문에 변경되어있다.

변경된 포트번호 기준으로 요청을 해야됩니다.

저의 경우가 62950입니다.

200 상태로 정상요청된것을 볼 수 있습니다.

 

h2 데이터베이스 콘솔에 가서 확인해보자!

users 테이블이 생성되고 데이터가 들어간 것을 확인할 수 있습니다.

 

 

하지만, httpStatus가 200번 보다는 201번이라는 CreateOK라는 형태를 전달하는것이 더 적합할 것 같습니다.

따라서, Controller에서 응답(리턴)값을 수정하겠습니다.

controller > UserController.java > createUser

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

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

    return new ResponseEntity(HttpStatus.CREATED);
}

다시 서버 실행후 포트 변경하여 호출 시 200에서 201로 HttpStatus가 변경된 것을 알 수 있습니다.

 

여기서, 추가적으로 상태값은 적절한데 응답한 결과에 대해서 아무 결과가 없기 때문에 추가하여 전달해보겠습니다.

vo > ResponseUser.java

응답결과 데이터를 담을 객체 생성

package com.example.userservice.vo;

import lombok.Data;

@Data
public class ResponseUser {
    private String email;
    private String name;
    private String userId;
}

 

controller > UserController.java > createUser (수정)

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

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

    // 데이터를 저장할 때 사용한 userDto 객체를 responseUser의 응답객체에 맵핑
    ResponseUser responseUser = mapper.map(userDto, ResponseUser.class);

    return ResponseEntity.status(HttpStatus.CREATED).body(responseUser);
}

 

service > UserServiceImpl.java

createUser 부분의 return 값이 null 부분을 다시 저장한 데이터값을 기준으로 userDto를 생성하여 return 처리

@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"); // 추후 수정

    // jpa로 저장
    userRepository.save(userEntity);
    
    UserDto returnUserDto = mapper.map(userEntity, UserDto.class);
    
    return returnUserDto;
}

 

서버 재기동 후 테스트를 해보겠습니다.

주의! 포트 변경하고 진행

이제는 Status가 201 Created일 뿐만 아니라 응답 데이터로 저장된 데이터의 일부분도 같이 확인할 수 있습니다.

 

관련글 더보기

댓글 영역